Compare commits

..
Author SHA1 Message Date
aliveoutside b6133da808 fix #624
added a check if an attachment is instance of an attachment type where we could get the original link to the photo
2022-08-16 04:24:30 +03:00
aliveoutside 59fb11dbaa remove useless logs from MediaFragment 2022-08-16 04:10:15 +03:00
gdlbo 3de88254f6 dialog can be null........... 2022-08-15 21:13:42 +03:00
gdlbo 306338992e New device id generator for webview auth 2022-08-15 20:44:22 +03:00
Erik Kiznov 370ee53bde fix donate urls 2022-08-15 18:47:08 +03:00
gdlbo ccc61ebb92 code fixes 2022-08-15 18:26:27 +03:00
Erik Kiznov 522cac34b0 fix spaces in .xml 2022-08-15 16:44:43 +03:00
gdlbo 282c2e3ed7 text pin fix 2022-08-15 16:30:35 +03:00
gdlbo 97453703e1 fixed null decrypt msg 2022-08-15 15:30:49 +03:00
gdlbo dfeff9903d fixed translator dialog 2022-08-15 14:50:00 +03:00
gdlbo 208e601f08 fixed translator 2022-08-15 14:35:33 +03:00
gdlbo e9d63463c5 fixed translator 2022-08-15 14:34:22 +03:00
gdlbo c86a1533e4 fixed registerActivities 2022-08-15 14:31:57 +03:00
gdlbo a1332043a1 Update CryptImHook.java 2022-08-15 14:21:32 +03:00
gdlbo 86e41aef7f Crypt hook 2022-08-15 14:19:12 +03:00
Erik Kiznov a1937420e8 translate encryption settings 2022-08-15 14:17:37 +03:00
gdlbo f5383a58e1 fixed init + added enc buttons (without hooks) 2022-08-15 13:39:26 +03:00
gdlbo 9f01927bd1 fix proxy
https://github.com/vtosters/lite/issues/505
2022-08-14 21:21:21 +03:00
Erik Kiznov d4410a1b85 [c] -> c
this commit fix russian letter "c" in variables to english letter "c"
2022-08-14 17:55:18 +03:00
k1zn 5b70beceeb fix "vk pay" logo in superapp widget 2022-08-13 22:30:43 +03:00
gdlbo 1dc000f8f5 Fixed rename bug 2022-08-13 21:36:35 +03:00
Erik Kiznov 92159a9242 translate layouts 2022-08-13 21:29:03 +03:00
gdlbo c977cd5bdf translation fixes 2022-08-13 20:57:29 +03:00
Erik Kiznov b96fbc5a5f delete slashes 2022-08-13 20:46:17 +03:00
Erik Kiznov ed115442dc fix bug 2022-08-13 20:46:17 +03:00
Erik Kiznov 8925e85bb4 translate all strings to RU/EN 2022-08-13 20:46:17 +03:00
gdlbo d2e9968829 added buttons to header of dialog 2022-08-13 20:13:48 +03:00
gdlbo 7c820b7207 updated jars 2022-08-13 20:13:18 +03:00
gdlbo 61d63d574b Update issue templates 2022-08-13 15:44:45 +03:00
gdlbo d07bf40dc3 Update issue templates 2022-08-13 14:28:22 +03:00
gdlbo d8a7b451c0 Update issue templates 2022-08-13 14:24:07 +03:00
gdlbo 28ab01cbff Update issue templates 2022-08-13 14:23:31 +03:00
gdlbo 244bae71e2 updated gradle to 7.2.2 2022-08-13 13:31:59 +03:00
gdlbo 66951fa826 some code reformat 2022-08-12 22:08:16 +03:00
gdlbo ac364f1ae2 StoryCircleImageView + CommunityBorderedImageView java
80 and 136
radius unread 2 read 1
2022-08-12 22:01:58 +03:00
gdlbo 01f956477b some rounding improvements 2022-08-12 17:44:40 +03:00
gdlbo c525427594 fixed abbr avatar rounding 2022-08-12 17:32:22 +03:00
gdlbo 8a83052941 some settings improvements 2022-08-12 02:38:59 +03:00
gdlbo 0bcbf2b4f8 fixed some paths 2022-08-12 01:40:21 +03:00
gdlbo a7d8e7294f updated jars 2022-08-12 01:39:51 +03:00
gdlbo 38aa6c1905 fixed DownloadUtils + added custom folders reset 2022-08-12 01:07:54 +03:00
gdlbo 91bd29cf93 fixed superapp crash 2022-08-11 23:50:03 +03:00
gdlbo 186a807d54 mb fix crash sdk 21+ 2022-08-11 23:29:40 +03:00
gdlbo 48ba199613 fix bug 2022-08-11 22:29:11 +03:00
Vologhat df3b374f3a refactor newsfeed manager 2022-08-11 21:03:35 +03:00
gdlbo 5c26dd8ea4 newsfeedlist manager 2022-08-11 16:05:04 +03:00
gdlbo 14cf129435 cache fixes 2022-08-10 13:17:38 +03:00
aliveoutside 073c80d1b0 fix not loading recommended posts page 2022-08-09 19:47:54 +03:00
gdlbo b0856d6232 fixed default undel prefix 2022-08-06 23:19:47 +03:00
158 changed files with 2834 additions and 3109 deletions
+27
View File
@@ -0,0 +1,27 @@
---
name: Bug Report
about: Заготовка для репорта багов
title: Ошибка обновлении ленты новостей
labels: bug
assignees: ''
---
**Опишите сам баг**
При обновлении новостей вылезает ошибка
**Опишите действия для воспроизведения ошибки**
1. Обновил ленту интересных новостей
2. Пролистал до конца страницы
**Опишите ожидаемый результат**
Интересная лента должна прогружать результаты
**Скриншот ошибки**
**Информация об устройстве:**
- Устройство: Samsung Galaxy J1 Mini
- OS: Android 9 | OneUi 3.0
- Коммит: fa12e8f (В О Приложении написана версия коммита)
**Дополнительная информация о баге или мыслях почему оно может происходить (если есть)**
+15
View File
@@ -0,0 +1,15 @@
---
name: Feature request
about: Предложение функции
title: Улучшение голосовых сообщений
labels: enhancement
assignees: ''
---
**Опишите вашу идею максимально подробно и понятно**
Необходима функция улучшения голосовых сообщений. Она значительно улучшит запись голосовых сообщений и собеседнику будет лучше слышно меня
**Опишите возможное решение/реализацию функции (если понимаете как это можно реализовать на Java/C++)**
**Остальные мысли о предложенной функции**
+5 -1
View File
@@ -66,6 +66,7 @@
* Округление чисел
* Сокращение постов **(Показать полностью)**
* Результаты опросов без участия
* Возможность указывать папку для загрузки фото/видео/музыки/всего
* Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга)
* Новый раздел музыки
* Возможность скачивать видео
@@ -90,6 +91,7 @@
* Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger
* Отключить уведомление о том, что вы сделали скриншот в беседе
* Отключение редиректа через away.php
* Отключение отправки метрики
* Внешний вид
* **Milkshake** тема (дизайн новых версий ВК)
* Название заголовков в докбаре
@@ -103,8 +105,10 @@
* Возможность отключить блок историй наверху ленты
* Возможность отключить боковую камеру в разделе «Новости»
* Возможность отключить блок «Что у вас нового?» в разделе «Новости»
* Возможность менять раздел, который запускается при запуске
* Возможность показывать лайки у постов справа
* Возможность менять стартовый раздел при запуске приложения
* Анимации фрагментов
* Возможность изменять размер закругления картинок (аватарок и прочего)
* Возможность отключить редизайн видеопостов
* Возможность отключить блок миниаппов/VK Pay/Superapp
* Возможность отключить сокращение названий разделов в меню
@@ -1 +0,0 @@
ea0425fab4379ae5f7e9db05a22d4b7afd709560
+1 -1
View File
@@ -1 +1 @@
3b92d8876dd59d5afc60a53bb23b103cede6a194
5df53281cbfd1b6caf676bd10d2a403361a2904b
@@ -16,6 +16,7 @@ import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicLong;
import ru.vtosters.lite.utils.AndroidUtils;
/**
* Created by Aefyr on 20.05.2018.
@@ -39,7 +40,7 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds = new HashMap<>();
if (oreo()) {
NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Сервис стикеров Telegram в VTosters", NotificationManager.IMPORTANCE_HIGH);
NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, AndroidUtils.getString("telegram_stickers_service"), NotificationManager.IMPORTANCE_HIGH);
((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChan);
}
}
@@ -49,8 +50,8 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds.put(pack, notificationId);
Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + ": загрузка" : pack.title + ": обновление");
builder.setContentText("Получение информации");
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString("telegram_stickers_downloading") : pack.title + AndroidUtils.getString("telegram_stickers_updating"));
builder.setContentText(AndroidUtils.getString("telegram_stickers_gettinginfo"));
builder.setOngoing(true);
manager.notify(notificationId, builder.build());
@@ -63,7 +64,7 @@ public class NotificationsHelper {
lastNotificationTime.set(System.currentTimeMillis());
Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + ": загрузка" : pack.title + ": обновление");
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString("telegram_stickers_downloading") : pack.title + AndroidUtils.getString("telegram_stickers_updating"));
builder.setContentText(downloadProgress + "/" + pack.stickersCount);
builder.setProgress(pack.stickersCount, downloadProgress, false);
builder.setOngoing(true);
@@ -77,13 +78,13 @@ public class NotificationsHelper {
Notification.Builder builder = commonBuilder();
builder.setProgress(0, 0, false);
builder.setOngoing(false);
builder.setContentTitle("Сервис стикеров Telegram в VTosters");
builder.setContentTitle(AndroidUtils.getString("telegram_stickers_service"));
String text;
if (success)
text = wasUpdate ? pack.title + " успешно обновлен" : pack.title + " успешно загружен";
text = wasUpdate ? pack.title + AndroidUtils.getString("telegram_stickers_updated") : pack.title + AndroidUtils.getString("telegram_stickers_downloaded");
else
text = wasUpdate ? pack.title + ": ошибка при обновлении" : pack.title + ": ошибка при загрузке";
text = wasUpdate ? pack.title + AndroidUtils.getString("telegram_stickers_error_update") : pack.title + AndroidUtils.getString("telegram_stickers_error_download");
if (e instanceof TelegramStickersGrabber.TSGException) {
text = pack.title + ": " + e.getMessage();
@@ -61,11 +61,11 @@ public class DownloadUtils {
File b2;
boolean c2 = MediaUtils.c(MediaUtils.b(str2));
if (str.endsWith("png") || str.endsWith("jpg") || str.endsWith("jpeg")) {
if (file.endsWith(".jpg") || file.endsWith(".png") || file.endsWith(".jpeg")) {
b2 = new File(getPhotosDir(), file);
} else if (str.endsWith("mp3") || str.endsWith("wav") || str.endsWith("ogg") || str.endsWith("aac") || str.endsWith("flac") || str.endsWith("m4a")) {
} else if (file.endsWith(".mp3") || file.endsWith(".wav") || file.endsWith(".ogg") || file.endsWith(".aac") || file.endsWith(".flac") || file.endsWith(".m4a")) {
b2 = new File(getMusicDir(), file);
} else if (str.endsWith("mp4") || str.endsWith("mkv") || str.endsWith("avi") || str.endsWith("flv") || str.endsWith("wmv") || str.endsWith("mov") || str.endsWith("3gp")) {
} else if (file.endsWith(".mp4") || file.endsWith(".mkv") || file.endsWith(".avi") || file.endsWith(".flv") || file.endsWith(".wmv") || file.endsWith(".mov") || file.endsWith(".3gp")) {
b2 = new File(getVideosDir(), file);
} else {
b2 = new File(getDownloadsDir(), file);
@@ -76,7 +76,11 @@ public class DownloadUtils {
final InputStream h = c3 == null ? null : c3.h();
if (h != null) {
try {
if (b2.exists() || FileUtils.b(b2)) {
if (b2.getParentFile() != null) {
b2.createNewFile();
}
if (b2.exists()) {
VkExecutors.x.a().execute(() -> ToastUtils.a(context.getString(R.string.file_saved, b2.getAbsoluteFile())));
}
} catch (Exception e2) {
@@ -86,6 +90,7 @@ public class DownloadUtils {
return;
}
}
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(str2));
request.setDestinationUri(Uri.fromFile(b2));
request.setMimeType(FileUtils.f(new File(str)));
@@ -180,7 +185,7 @@ public class DownloadUtils {
String f2 = FileUtils.f(file);
if (!TextUtils.isEmpty(f2)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(FileUtils.n(file), f2);
intent.setDataAndType(FileUtils.uriFromFile(file), f2);
context.startActivity(intent);
return true;
}
@@ -34,4 +34,6 @@ public enum DialogAction {
DNT_OFF,
pinmsg,
unpinmsg,
ENCRYPT_SETT,
ENCRYPT
}
@@ -81,6 +81,7 @@ public final class DialogActionsHelper {
CollectionExt.a(arrayList, DialogAction.NOTIFICATIONS_OFF, dialog.b(b2));
return arrayList;
}
return new ArrayList<>();
}
@@ -0,0 +1,106 @@
package com.vk.profile.ui.community;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.util.AttributeSet;
import com.vk.core.ui.themes.Themable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.ContextExtKt;
import com.vk.dto.stories.model.StoriesContainer;
import com.vk.stories.view.BorderedCircleImageView;
import com.vtosters.lite.R;
public final class CommunityBorderedImageView extends BorderedCircleImageView implements Themable{
private boolean f0;
private int g0;
private int h0;
private PorterDuffColorFilter i0;
private PorterDuffColorFilter j0;
private int unread;
private int read;
public CommunityBorderedImageView(Context context){
this(context, null, 0, 6);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet){
this(context, attributeSet, 0, 4);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i, int i2){
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i){
super(context, attributeSet, i);
this.g0 = VKThemeHelper.d((int) R.attr.accent);
this.h0 = ContextExtKt.a(context, (int) R.color.gray_200);
this.i0 = new PorterDuffColorFilter(this.g0, PorterDuff.Mode.SRC_IN);
this.j0 = new PorterDuffColorFilter(this.h0, PorterDuff.Mode.SRC_IN);
}
public final void c(int unread, int read){ // get unread and read resid
this.unread = unread;
this.read = read;
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
}
public final int getPrimaryColor(){
return this.g0;
}
public final void setPrimaryColor(int i){
this.g0 = i;
this.i0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
}
public final int getWasViewedColor(){
return this.h0;
}
public final void setWasViewedColor(int i){
this.h0 = i;
this.j0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
}
public final void o(){
this.f0 = false;
l();
}
@Override // com.vk.stories.view.ClippedImageView, android.widget.ImageView, android.view.View
public void onDraw(Canvas canvas){
super.onDraw(canvas);
if (this.f0) {
a(canvas);
}
}
public final void setStoryContainer(StoriesContainer storiesContainer){
if (storiesContainer.L1()) {
this.f0 = true;
m();
if (storiesContainer.K1()) {
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
setBorderColorFilter(this.i0);
b(getWidth(), getHeight());
invalidate();
return;
}
this.T = BitmapFactory.decodeResource(getResources(), this.read);
setBorderColorFilter(this.j0);
b(getWidth(), getHeight());
invalidate();
return;
}
o();
}
@Override // com.vk.core.ui.themes.Themable
public void v(){
}
}
@@ -0,0 +1,447 @@
package com.vk.stories.view;
import static ru.vtosters.lite.utils.ThemesUtils.getColor2;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.airbnb.lottie.LottieComposition;
import com.airbnb.lottie.LottieCompositionFactory;
import com.airbnb.lottie.LottieDrawable;
import com.airbnb.lottie.LottieListener;
import com.facebook.common.internal.Supplier;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.u.b.a.PipelineDraweeControllerBuilder;
import com.facebook.x.g.CloseableImage;
import com.vk.core.drawable.BorderDrawable;
import com.vk.core.ui.themes.Themable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.DrawableUtils;
import com.vk.core.util.ResUtils;
import com.vk.core.util.Screen;
import com.vk.dto.stories.d.StoriesContainerExt;
import com.vk.dto.stories.model.CommunityGroupedStoriesContainer;
import com.vk.dto.stories.model.StoriesContainer;
import com.vk.dto.stories.model.StoryEntry;
import com.vk.im.engine.models.Image;
import com.vk.im.ui.views.avatars.AvatarDataSource;
import com.vk.imageloader.FrescoWrapper;
import com.vk.stories.StoriesController;
import com.vtosters.lite.R;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.utils.AndroidUtils;
public class StoryCircleImageView extends BorderedCircleImageView implements Themable{
private static final HashSet<Integer> B0 = new HashSet<>();
private final PipelineDraweeControllerBuilder f0;
private int A0;
private Drawable g0;
private Drawable h0;
private Drawable i0;
private int j0;
private int k0;
private int l0;
private int m0;
private int n0;
private int o0;
private Bitmap p0;
private Bitmap q0;
private Bitmap r0;
private Bitmap s0;
private boolean t0;
private boolean u0;
private boolean v0;
private boolean w0;
private boolean x0;
private String y0;
private LottieDrawable z0;
public StoryCircleImageView(Context context){
this(context, null);
}
public StoryCircleImageView(Context context, AttributeSet attributeSet){
this(context, attributeSet, 0);
}
public StoryCircleImageView(Context context, AttributeSet attributeSet, int i){
super(context, attributeSet, i);
this.f0 = FrescoWrapper.c.d();
a(context, attributeSet, i);
}
private void b(Canvas canvas){
this.z0.draw(canvas);
}
private boolean o(){
return !this.u0 && !this.t0 && this.z0 == null && !this.w0 && !this.v0;
}
private void p(){
this.z0.stop();
this.z0 = null;
invalidate();
}
private void q(){
int i = this.j0;
if (i != 0 && VKThemeHelper.k.a(i)) {
this.k0 = VKThemeHelper.d(this.j0);
}
this.g0 = DrawableUtils.a(this.g0, ColorStateList.valueOf(this.k0));
Drawable drawable = this.g0;
int i2 = this.A0;
this.p0 = DrawableUtils.a(drawable, i2, i2);
int i3 = this.l0;
if (i3 != 0 && VKThemeHelper.k.a(i3)) {
this.m0 = VKThemeHelper.d(this.l0);
}
int i4 = this.m0;
if (i4 != 0) {
this.i0 = DrawableUtils.a(this.i0, ColorStateList.valueOf(i4));
}
int i5 = this.n0;
if (i5 != 0 && VKThemeHelper.k.a(i5)) {
this.o0 = VKThemeHelper.d(this.n0);
}
Drawable a2 = DrawableUtils.a(this.g0, ColorStateList.valueOf(0));
int i6 = this.A0;
DrawableUtils.a(a2, i6, i6);
Drawable a3 = DrawableUtils.a(this.h0, ColorStateList.valueOf(this.o0));
int i7 = this.A0;
this.r0 = DrawableUtils.a(a3, i7, i7);
Drawable a4 = DrawableUtils.a(this.g0, ColorStateList.valueOf(ContextCompat.getColor(getContext(), R.color.orange)));
int i8 = this.A0;
this.s0 = DrawableUtils.a(a4, i8, i8);
}
private void r(){
this.c0 = Screen.a(o() ? 0 : 2);
m();
q();
}
private void setUploadFailed(boolean z){
this.u0 = z;
invalidate();
}
@Override // com.vk.stories.view.ClippedImageView, android.widget.ImageView, android.view.View
public void onDraw(Canvas canvas){
super.onDraw(canvas);
setBorderAlpha(255);
if (this.u0) {
this.i0.draw(canvas);
} else if (this.t0) {
if (this.z0 != null) {
b(canvas);
return;
}
this.T = this.x0 ? this.s0 : this.p0;
b(getWidth(), getHeight());
a(canvas);
} else if (this.z0 != null) {
p();
} else if (!this.w0) {
} else {
this.T = this.r0;
setBorderAlpha(163);
b(getWidth(), getHeight());
a(canvas);
}
}
@Override // com.vk.stories.view.BorderedCircleImageView, android.view.View
public void onSizeChanged(int i, int i2, int i3, int i4){
super.onSizeChanged(i, i2, i3, i4);
this.i0.setBounds(0, 0, i, i2);
b(i);
}
public void setStoryContainer(@Nullable StoriesContainer storiesContainer){
boolean z = true;
boolean z2 = storiesContainer != null && storiesContainer.Q1();
this.v0 = storiesContainer != null && storiesContainer.S1() && !storiesContainer.L1();
boolean z3 = storiesContainer instanceof CommunityGroupedStoriesContainer;
this.x0 = z3;
if (storiesContainer != null) {
if (!StoriesContainerExt.c(storiesContainer) && !StoriesContainerExt.d(storiesContainer)) {
this.T = this.p0;
} else {
this.T = this.q0;
}
b(getWidth(), getHeight());
if (StoriesContainerExt.e(storiesContainer)) {
a(storiesContainer);
} else if (this.z0 != null) {
p();
}
this.w0 = !storiesContainer.K1() && storiesContainer.L1();
if (z2) {
String h = storiesContainer.h(ResUtils.c(R.dimen.story_preview_image_size));
if (h != null) {
a(h);
} else {
g();
}
if (StoriesController.a(storiesContainer)) {
setUploadFailed(true);
a(false, false);
} else {
setUploadFailed(false);
if (!storiesContainer.K1() && !StoriesContainerExt.c(storiesContainer)) {
a(false, false);
} else {
StoryEntry A1 = storiesContainer.A1();
if (A1 != null) {
a(true, !B0.contains(A1.b));
B0.add(A1.b);
} else {
a(true, false);
}
}
}
} else {
setUploadFailed(false);
if (!storiesContainer.K1() && !StoriesContainerExt.c(storiesContainer)) {
z = false;
}
a(z, false);
if (z3) {
b(((CommunityGroupedStoriesContainer) storiesContainer).j(ResUtils.c(R.dimen.story_preview_image_size)));
} else {
String h2 = storiesContainer.h(ResUtils.c(R.dimen.story_preview_image_size));
if (h2 != null) {
a(h2);
} else {
g();
}
}
}
} else {
g();
a(false, false);
setUploadFailed(false);
this.w0 = false;
}
r();
}
@Override // com.vk.core.ui.themes.Themable
public void v(){
r();
invalidate();
}
private void b(int i){
LottieDrawable lottieDrawable = this.z0;
if (lottieDrawable == null || lottieDrawable.e() == null) {
return;
}
this.z0.d(i / this.z0.e().a().width());
}
protected void a(Context context, AttributeSet attributeSet, int i){
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, com.vtosters.lite.a0.StoryCircleImageView, i, 0);
a(context, attributeSet, obtainStyledAttributes);
obtainStyledAttributes.recycle();
r();
this.T = this.p0;
}
public void b(@Nullable List<String> list){
PipelineDraweeControllerBuilder pipelineDraweeControllerBuilder = this.f0;
pipelineDraweeControllerBuilder.j();
pipelineDraweeControllerBuilder.a(getController());
setControllerListener(pipelineDraweeControllerBuilder);
a(pipelineDraweeControllerBuilder, list);
setController(pipelineDraweeControllerBuilder.k0());
}
@SuppressLint("ResourceType")
private void a(Context context, AttributeSet attributeSet, TypedArray typedArray){ // bullshit vk code is not working with custom bordered circle image
Drawable drawable;
this.A0 = typedArray.getDimensionPixelSize(0, Screen.a(64.0f));
if (typedArray.hasValue(2)) {
this.g0 = typedArray.getDrawable(2);
} else {
this.g0 = ContextCompat.getDrawable(context, R.drawable.bg_stores_unread_border_80);
}
if (typedArray.hasValue(3)) {
this.h0 = typedArray.getDrawable(3);
} else {
this.h0 = ContextCompat.getDrawable(context, R.drawable.bg_stores_read_border_80);
}
int b2 = VKThemeHelper.b(attributeSet, "vk_borderTint");
if (b2 != 0 && VKThemeHelper.k.a(b2)) {
this.j0 = b2;
} else if (typedArray.hasValue(5)) {
this.k0 = typedArray.getColor(5, 0);
} else {
this.j0 = R.attr.accent;
}
int b3 = VKThemeHelper.b(attributeSet, "vk_failBorderTint");
if (b3 != 0 && VKThemeHelper.k.a(b3)) {
this.l0 = b3;
} else if (typedArray.hasValue(7)) {
this.m0 = typedArray.getColor(7, 0);
}
int b4 = VKThemeHelper.b(attributeSet, "vk_borderSeenTint");
if (b4 != 0 && VKThemeHelper.k.a(b4)) {
this.n0 = b4;
} else if (typedArray.hasValue(4)) {
this.o0 = typedArray.getColor(4, 0);
} else {
this.o0 = 0;
}
if (typedArray.hasValue(6)) {
this.i0 = typedArray.getDrawable(6);
} else {
this.i0 = ContextCompat.getDrawable(context, R.drawable.ic_story_error_size64);
}
if (typedArray.hasValue(8)) {
drawable = typedArray.getDrawable(8);
} else {
drawable = ContextCompat.getDrawable(context, R.drawable.bg_live_unread_border);
}
if (typedArray.hasValue(9)) {
this.y0 = typedArray.getString(9);
} else {
this.y0 = "stories_animation_64.json";
}
int i = this.A0;
this.q0 = DrawableUtils.a(Objects.requireNonNull(drawable), i, i);
Drawable drawable2 = this.g0;
int i2 = this.A0;
DrawableUtils.a(drawable2, i2, i2);
Drawable drawable3 = this.h0;
int i3 = this.A0;
this.r0 = DrawableUtils.a(drawable3, i3, i3);
Drawable drawable4 = this.g0;
int i4 = this.A0;
this.s0 = DrawableUtils.a(drawable4, i4, i4);
}
public void a(StoriesContainer storiesContainer){
if (this.z0 == null) {
LottieCompositionFactory.a(getContext(), this.y0).b(new a(storiesContainer));
}
}
public void a(StoriesContainer storiesContainer, LottieComposition lottieComposition){
this.z0 = new LottieDrawable();
this.z0.a(lottieComposition);
this.z0.d(-1);
b(getWidth());
if (!StoriesContainerExt.f(storiesContainer)) {
this.z0.a(new b());
this.z0.start();
return;
}
this.z0.stop();
}
private void a(boolean z, boolean z2){
k();
this.t0 = z;
if (!z2) {
setSelectionAmount(1.0f);
} else {
n();
}
}
private void a(@NonNull PipelineDraweeControllerBuilder pipelineDraweeControllerBuilder, @Nullable final List<String> list){
pipelineDraweeControllerBuilder.b(null);
pipelineDraweeControllerBuilder.a((Supplier<DataSource<CloseableReference<com.facebook.x.g.CloseableImage>>>) null);
if (list != null && !list.isEmpty()) {
if (list.size() == 1) {
ImageRequestBuilder b2 = ImageRequestBuilder.b(Uri.parse(list.get(0)));
b2.a(ImageRequest.CacheChoice.SMALL);
pipelineDraweeControllerBuilder.b(b2.a());
return;
}
pipelineDraweeControllerBuilder.a((Supplier<DataSource<CloseableReference<CloseableImage>>>) () -> StoryCircleImageView.this.a(list));
return;
}
pipelineDraweeControllerBuilder.b(null);
}
public DataSource<CloseableReference<CloseableImage>> a(@Nullable List<String> list){
ArrayList<Image> arrayList = new ArrayList<>();
for (String o : Objects.requireNonNull(list)) {
arrayList.add(new Image(-1, -1, o));
}
return AvatarDataSource.a(arrayList, this.A0, 0);
}
public class a implements LottieListener<LottieComposition>{
final StoriesContainer a;
a(StoriesContainer storiesContainer){
this.a = storiesContainer;
}
@Override // com.airbnb.lottie.LottieListener
public void a(LottieComposition lottieComposition){
if (StoryCircleImageView.this.getWidth() > 0) {
StoryCircleImageView.this.a(this.a, lottieComposition);
} else {
StoryCircleImageView.this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver$OnGlobalLayoutListenerC0393a(lottieComposition));
}
}
public class ViewTreeObserver$OnGlobalLayoutListenerC0393a implements ViewTreeObserver.OnGlobalLayoutListener{
final LottieComposition a;
ViewTreeObserver$OnGlobalLayoutListenerC0393a(LottieComposition lottieComposition){
this.a = lottieComposition;
}
@Override // android.view.ViewTreeObserver.OnGlobalLayoutListener
public void onGlobalLayout(){
StoryCircleImageView.this.getViewTreeObserver().removeOnGlobalLayoutListener(this);
a aVar = a.this;
StoryCircleImageView.this.a(aVar.a, this.a);
}
}
}
public class b implements ValueAnimator.AnimatorUpdateListener{
b(){
}
@Override // android.animation.ValueAnimator.AnimatorUpdateListener
public void onAnimationUpdate(ValueAnimator valueAnimator){
StoryCircleImageView.this.invalidate();
}
}
}
+20 -20
View File
@@ -3560,26 +3560,26 @@ public class R {
public static final int stickers_notifications_size = 0x7f070285;
public static final int stickers_tabs_padding = 0x7f070286;
public static final int stickers_tabs_size = 0x7f070287;
public static final int stiсkers_catalog_button_padding_bottom = 0x7f070288;
public static final int stiсkers_catalog_button_padding_left = 0x7f070289;
public static final int stiсkers_catalog_button_padding_right = 0x7f07028a;
public static final int stiсkers_catalog_button_padding_top = 0x7f07028b;
public static final int stiсkers_catalog_double_stacked_slider_image_bg_size = 0x7f07028c;
public static final int stiсkers_catalog_double_stacked_slider_image_corner_radius = 0x7f07028d;
public static final int stiсkers_catalog_double_stacked_slider_image_size = 0x7f07028e;
public static final int stiсkers_catalog_large_slider_image_bg_height = 0x7f07028f;
public static final int stiсkers_catalog_large_slider_image_bg_width = 0x7f070290;
public static final int stiсkers_catalog_large_slider_image_corner_radius = 0x7f070291;
public static final int stiсkers_catalog_large_slider_image_size = 0x7f070292;
public static final int stiсkers_catalog_small_slider_image_bg_size = 0x7f070293;
public static final int stiсkers_catalog_small_slider_image_corner_radius = 0x7f070294;
public static final int stiсkers_catalog_small_slider_image_size = 0x7f070295;
public static final int stiсkers_catalog_triple_stacked_slider_image_bg_size = 0x7f070296;
public static final int stiсkers_catalog_triple_stacked_slider_image_corner_radius = 0x7f070297;
public static final int stiсkers_catalog_triple_stacked_slider_image_size = 0x7f070298;
public static final int stiсkers_catalog_vertical_list_image_bg_size = 0x7f070299;
public static final int stiсkers_catalog_vertical_list_image_corner_radius = 0x7f07029a;
public static final int stiсkers_catalog_vertical_list_image_size = 0x7f07029b;
public static final int stickers_catalog_button_padding_bottom = 0x7f070288;
public static final int stickers_catalog_button_padding_left = 0x7f070289;
public static final int stickers_catalog_button_padding_right = 0x7f07028a;
public static final int stickers_catalog_button_padding_top = 0x7f07028b;
public static final int stickers_catalog_double_stacked_slider_image_bg_size = 0x7f07028c;
public static final int stickers_catalog_double_stacked_slider_image_corner_radius = 0x7f07028d;
public static final int stickers_catalog_double_stacked_slider_image_size = 0x7f07028e;
public static final int stickers_catalog_large_slider_image_bg_height = 0x7f07028f;
public static final int stickers_catalog_large_slider_image_bg_width = 0x7f070290;
public static final int stickers_catalog_large_slider_image_corner_radius = 0x7f070291;
public static final int stickers_catalog_large_slider_image_size = 0x7f070292;
public static final int stickers_catalog_small_slider_image_bg_size = 0x7f070293;
public static final int stickers_catalog_small_slider_image_corner_radius = 0x7f070294;
public static final int stickers_catalog_small_slider_image_size = 0x7f070295;
public static final int stickers_catalog_triple_stacked_slider_image_bg_size = 0x7f070296;
public static final int stickers_catalog_triple_stacked_slider_image_corner_radius = 0x7f070297;
public static final int stickers_catalog_triple_stacked_slider_image_size = 0x7f070298;
public static final int stickers_catalog_vertical_list_image_bg_size = 0x7f070299;
public static final int stickers_catalog_vertical_list_image_corner_radius = 0x7f07029a;
public static final int stickers_catalog_vertical_list_image_size = 0x7f07029b;
public static final int story_author_title_top_space = 0x7f07029c;
public static final int story_cadre_bottom_btn_top_padding = 0x7f07029d;
public static final int story_camera_tabs_height = 0x7f07029e;
@@ -1,5 +1,6 @@
package com.vtosters.lite.ui.bottomnavigation;
import static ru.vtosters.lite.utils.Preferences.*;
import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock;
import android.annotation.SuppressLint;
@@ -30,6 +31,7 @@ import com.vk.core.ui.themes.VKThemeHelper;
import com.vtosters.lite.R;
import me.grishka.appkit.utils.V;
import ru.vtosters.lite.utils.Preferences;
public class BottomNavigationItemView extends FrameLayout implements MenuView.ItemView {
private final TextView mSmallLabel;
@@ -219,13 +221,19 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
// ViewCompat.setScaleY(mLargeLabel, !mStaticModeEnabled && !checked ? mLargeScale : 1.0f);
ViewCompat.setScaleX(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
ViewCompat.setScaleY(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
// make mLargeLabel and mSmallLabel are bold
mLargeLabel.setTypeface(null, Typeface.BOLD);
mSmallLabel.setTypeface(null, Typeface.BOLD);
// make mLargeLabel and mSmallLabel text size is 10sp
mLargeLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
mSmallLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
int textsize;
if (vkme()){
textsize = 11;
} else {
textsize = 10;
}
mLargeLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, textsize);
mSmallLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, textsize);
mLargeLabel.setVisibility(/*checked ? VISIBLE :*/ INVISIBLE);
mSmallLabel.setVisibility(VISIBLE);//checked ? INVISIBLE : VISIBLE);
@@ -1,5 +1,7 @@
package ru.vtosters.lite.deviceinfo;
import androidx.annotation.NonNull;
public class Device {
private String androidId;
private String bluetoothMac;
@@ -86,6 +88,7 @@ public class Device {
return this;
}
@NonNull
public String toString() {
return "Device{serialId='" + this.serialId + "', androidId='" + this.androidId + "', wifiMac='" + this.wifiMac + "', bluetoothMac='" + this.bluetoothMac + "'}";
}
@@ -1,5 +1,6 @@
package ru.vtosters.lite.deviceinfo;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.net.wifi.WifiInfo;
@@ -28,6 +29,7 @@ public class DeviceInfoCollector {
private String serialId() {
String str;
try {
@SuppressLint("PrivateApi")
Class<?> cls = Class.forName("android.os.SystemProperties");
Method method = cls.getMethod("get", String.class);
str = (String) method.invoke(cls, "gsm.sn1");
@@ -53,6 +55,7 @@ public class DeviceInfoCollector {
return null;
}
@SuppressLint("HardwareIds")
private String androidId(Context context) {
return Settings.Secure.getString(context.getContentResolver(), "android_id").toLowerCase();
}
@@ -99,7 +102,7 @@ public class DeviceInfoCollector {
StringBuilder sb = new StringBuilder();
int length = hardwareAddress.length;
for (int i = 0; i < length; i++) {
sb.append(String.format("%02X:", Byte.valueOf(hardwareAddress[i])));
sb.append(String.format("%02X:", hardwareAddress[i]));
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
@@ -1,93 +1,232 @@
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.engine.h.im_ic_write_msg;
import static com.vk.im.ui.c.im_ic_keyboard;
import static ru.vtosters.lite.dnr.DNRModule.hookDNR;
import static ru.vtosters.lite.dnr.DNRModule.hookDNT;
import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import com.vk.core.network.Network;
import com.vk.im.engine.ImEngine1;
import com.vk.im.engine.events.OnDialogUpdateEvent;
import com.vk.im.engine.models.EntityIntMap;
import com.vk.im.engine.models.ProfilesSimpleInfo;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.common.DialogAction;
import com.vk.im.ui.components.common.MsgAction;
import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg;
import com.vk.im.ui.views.dialog_actions.DialogActionsListView;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.hooks.CryptImHook;
import ru.vtosters.lite.ui.dialogs.Translate;
import ru.vtosters.lite.utils.AndroidUtils;
public class DNRInjector {
public static void inject(Dialog dialog, List<DialogAction> list) {
int peerId = dialog.getId();
int peerId = 0;
list.add(DialogAction.valueOf("pinmsg"));
list.add(DialogAction.valueOf("unpinmsg"));
if (dialog != null) {
peerId = dialog.getId();
}
list.add(DialogAction.pinmsg);
list.add(DialogAction.unpinmsg);
if (isDnrEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNR_OFF"));
list.add(DialogAction.DNR_OFF);
} else {
list.add(DialogAction.valueOf("DNR_ON"));
list.add(DialogAction.DNR_ON);
}
if (isDntEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNT_OFF"));
list.add(DialogAction.DNT_OFF);
} else {
list.add(DialogAction.valueOf("DNT_ON"));
list.add(DialogAction.DNT_ON);
}
list.add(DialogAction.ENCRYPT);
IMProcessor prov = EncryptProvider.getProcessorFor(peerId);
if (prov != null && !prov.isPublic()) {
list.add(DialogAction.ENCRYPT_SETT);
}
}
public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) {
hashMap.put(DialogAction.valueOf("DNR_ON"), getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.valueOf("DNR_OFF"), getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.valueOf("DNT_ON"), getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.valueOf("DNT_OFF"), getIdentifier("DNT_OFF", "string"));
hashMap.put(DialogAction.DNR_ON, getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.DNR_OFF, getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.DNT_ON, getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.DNT_OFF, getIdentifier("DNT_OFF", "string"));
hashMap.put(DialogAction.ENCRYPT, getIdentifier("encryption", "string"));
hashMap.put(DialogAction.ENCRYPT_SETT, getIdentifier("encryption_sett", "string"));
// hashMap.put(DialogAction.valueOf("pinmsg"), getIdentifier("pinmsg", "string"));
// hashMap.put(DialogAction.valueOf("unpinmsg"), getIdentifier("unpinmsg", "string"));
// hashMap.put(DialogAction.pinmsg, getIdentifier("pinmsg", "string"));
// hashMap.put(DialogAction.unpinmsg, getIdentifier("unpinmsg", "string"));
return hashMap;
}
public static boolean onClick(Dialog dialog, DialogAction action) {
var id = dialog.getId();
@SuppressLint("ResourceType")
public static List<Object> injectToList(List<Object> actions) {
var list = new ArrayList<>(actions);
if (action == DialogAction.valueOf("MARK_AS_READ")) {
list.add(new DialogActionsListView.b.a(DialogAction.DNR_ON, 2, im_ic_pinned_msg_hide, getIdentifier("DNR_ON", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNR_OFF, 2, im_ic_pinned_msg_show, getIdentifier("DNR_OFF", "string"))); // DialogAction, Int, Icon, String
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_OFF, 2, im_ic_edit_msg, getIdentifier("DNT_OFF", "string"))); // DialogAction, Int, Icon, String
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_SETT, 3, im_ic_more_vertical, getIdentifier("encryption_sett", "string"))); // 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
return list;
}
public static void forceInvalidateDialogActions(Dialog d) {
EntityIntMap<Dialog> map = new EntityIntMap<>();
map.a(d.getId(), d);
ImEngine1.a().a(new OnDialogUpdateEvent(null, map));
}
public static List<DialogAction> injectToListAccess(List<DialogAction> actions, Dialog dialog) {
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
if (isDnrEnabledFor(peerId)) {
actions.add(DialogAction.DNR_OFF);
} else {
actions.add(DialogAction.DNR_ON);
}
if (isDntEnabledFor(peerId)) {
actions.add(DialogAction.DNT_OFF);
} else {
actions.add(DialogAction.DNT_ON);
}
actions.add(DialogAction.ENCRYPT);
IMProcessor prov = EncryptProvider.getProcessorFor(peerId);
if (prov != null && !prov.isPublic()) {
actions.add(DialogAction.ENCRYPT_SETT);
}
actions.add(DialogAction.MARK_AS_READ);
return actions;
}
public static boolean onClickHeader(DialogAction action, Dialog dialog) {
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
if (action == DialogAction.MARK_AS_READ) {
DNRModule.hookRead(dialog);
forceInvalidateDialogActions(dialog);
}
if (action == DialogAction.DNR_ON) {
setDnr(dialog, true);
forceInvalidateDialogActions(dialog);
return true;
} else if (action == DialogAction.DNR_OFF) {
setDnr(dialog, false);
forceInvalidateDialogActions(dialog);
return true;
}
if (action == DialogAction.DNT_ON) {
setDnt(dialog, true);
forceInvalidateDialogActions(dialog);
return true;
} else if (action == DialogAction.DNT_OFF) {
setDnt(dialog, false);
forceInvalidateDialogActions(dialog);
return true;
}
if (action == DialogAction.ENCRYPT_SETT) {
CryptImHook.hookPref(peerId);
return true;
} else if (action == DialogAction.ENCRYPT) {
CryptImHook.hook(peerId, dialog);
return true;
}
return false;
}
public static boolean onClick(Dialog dialog, DialogAction action) {
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
if (action == DialogAction.MARK_AS_READ) {
DNRModule.hookRead(dialog);
}
if (action == DialogAction.valueOf("DNR_ON")) {
if (action == DialogAction.DNR_ON) {
setDnr(dialog, true);
return true;
} else if (action == DialogAction.valueOf("DNR_OFF")) {
} else if (action == DialogAction.DNR_OFF) {
setDnr(dialog, false);
return true;
}
if (action == DialogAction.valueOf("DNT_ON")) {
if (action == DialogAction.DNT_ON) {
setDnt(dialog, true);
return true;
} else if (action == DialogAction.valueOf("DNT_OFF")) {
} else if (action == DialogAction.DNT_OFF) {
setDnt(dialog, false);
return true;
}
if (action == DialogAction.valueOf("pinmsg")) {
pinnedMsg(id, true);
if (action == DialogAction.pinmsg) {
pinnedMsg(peerId, true);
return true;
} else if (action == DialogAction.valueOf("unpinmsg")) {
pinnedMsg(id, false);
} else if (action == DialogAction.unpinmsg) {
pinnedMsg(peerId, false);
return true;
}
if (action == DialogAction.ENCRYPT_SETT) {
CryptImHook.hookPref(peerId);
return true;
} else if (action == DialogAction.ENCRYPT) {
CryptImHook.hook(peerId, dialog);
return true;
}
@@ -102,6 +241,7 @@ public class DNRInjector {
public static boolean onClickMsg(Context context, MsgAction action, Msg msg) {
var text = ((MsgFromUser) msg).f();
var peerId = msg.v1();
var fullMsg = ((MsgFromUser) msg).j2(); // text + reply
var reply = fullMsg.substring(text.length() + 1);
@@ -113,15 +253,24 @@ public class DNRInjector {
var isTextExist = !text.isEmpty() && !text.equals(" ");
var isReplyExist = !reply.isEmpty() && !reply.equals(" ");
if (isReplyExist) {
reply = decryptMessage(reply, peerId);
}
if (isTextExist) {
text = decryptMessage(text, peerId);
}
if (action == MsgAction.valueOf("TRANSLATE")) {
if (isTextExist && isReplyExist) {
Translate.showTranslatedText(context, text + "\n\nРеплай:\n" + reply);
Translate.showTranslatedText(context, text + "\n\n" + AndroidUtils.getString("translator_reply") + "\n" + reply);
} else if (isReplyExist) {
Translate.showTranslatedText(context, "Реплай:\n" + reply);
Translate.showTranslatedText(context, AndroidUtils.getString("translator_reply") + "\n" + reply);
} else if (isTextExist) {
Translate.showTranslatedText(context, text);
} else {
sendToast("Нет текста для перевода");
sendToast(AndroidUtils.getString("translator_no_text"));
}
}
@@ -149,15 +298,27 @@ public class DNRInjector {
thread.start();
sendToast("Диалог успешно " + (needToBePinned ? "закреплен" : "откреплен"));
sendToast(AndroidUtils.getString("pin_dialog") + " " + (needToBePinned ? AndroidUtils.getString("dialog_pinned") : AndroidUtils.getString("dialog_unpinned")));
}
public static void setDnr(Dialog dialog, boolean value) {
hookDNR(dialog.getId());
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
hookDNR(peerId);
}
public static void setDnt(Dialog dialog, boolean value) {
hookDNT(dialog.getId());
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
hookDNT(peerId);
}
}
@@ -31,7 +31,7 @@ public class AudioDownloader {
public static void downloadM3U8(MusicTrack track) {
if (track.D == null) {
ToastUtils.a("Не удалось найти ссылку на аудиозапись");
ToastUtils.a(AndroidUtils.getString("link_audio_error"));
return;
}
@@ -64,7 +64,7 @@ public class AudioDownloader {
var success = FFMpeg.convert(downloadPath, musicPath + File.separator + fileName + ".mp3");
if (success) {
notification
.setContentText("Загрузка завершена")
.setContentText(AndroidUtils.getString("player_download_finished"))
.setProgress(0, 0, false)
.setSmallIcon(android.R.drawable.stat_sys_download_done);
notificationManager.notify(tempId, notification.build());
@@ -72,7 +72,7 @@ public class AudioDownloader {
onFailure();
}
} catch (UnsatisfiedLinkError e) {
Log.e("AudioDownloader", "Опять эти нативные либы");
Log.e("AudioDownloader", "native libs");
Log.e("AudioDownloader", e.getMessage());
onFailure();
}
@@ -80,7 +80,7 @@ public class AudioDownloader {
@Override
public void onFailure() {
notification.setContentText("Не удалось загрузить аудиозапись").setProgress(0, 0, false);
notification.setContentText(AndroidUtils.getString("load_audio_error")).setProgress(0, 0, false);
notificationManager.notify(tempId, notification.build());
}
@@ -109,7 +109,7 @@ public class AudioDownloader {
private static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle("Загрузка аудиозаписи")
.setContentTitle(AndroidUtils.getString("audio_downloading"))
.setContentText(track.toString())
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
@@ -46,7 +46,7 @@ public class OTADownloader {
maxIndex = Math.max(maxIndex, Integer.parseInt(name.replaceFirst(".+-(\\d+).+", "$1")));
}
File apk = maxIndex == -1 ? new File(downloadDir, "VTLite.apk") : new File(downloadDir, "VTLite-" + maxIndex + ".apk");
APKInstallActivity.installOta(context, FileUtils.n(apk));
APKInstallActivity.installOta(context, FileUtils.uriFromFile(apk));
} else if (status == DownloadManager.STATUS_FAILED) {
AndroidUtils.sendToast(getString("downloaderr"));
}
@@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ExternalLinkParser;
public class VideoDownloader {
@@ -124,12 +125,12 @@ public class VideoDownloader {
public static void parseVideoLink(String url, Context ctx) {
if (url.contains("vk.com/story")) {
ToastUtils.a("Не поддерживается загрузка историй");
ToastUtils.a(AndroidUtils.getString("video_dl_stories_not_supported"));
return;
}
if (!url.contains("vk.com/video")) {
ToastUtils.a("Неверная ссылка");
ToastUtils.a(AndroidUtils.getString("video_dl_wrong_link"));
return;
}
@@ -137,7 +138,7 @@ public class VideoDownloader {
String ownerId = videoId.split("_")[0];
final ProgressDialog progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage("Обработка видео");
progressDialog.setMessage(AndroidUtils.getString("video_dl_progress"));
progressDialog.show();
makeRequest("https://" + "api.vk.com" + "/method/video.get?owner_id=" + ownerId + "&videos=" + videoId + "&v=5.99&access_token=" + getUserToken(),
@@ -153,7 +154,7 @@ public class VideoDownloader {
downloadVideo(videoFile, ctx);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(ctx, "Видео нельзя скачать", Toast.LENGTH_SHORT).show();
Toast.makeText(ctx, AndroidUtils.getString("video_dl_error"), Toast.LENGTH_SHORT).show();
}
});
}
@@ -12,8 +12,8 @@ import ru.vtosters.lite.utils.AndroidUtils;
public class NotificationChannels {
public static final String MUSIC_DOWNLOAD_CHANNEL_ID = "music_download_channel";
public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = "Загрузка музыки";
public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = "Прогресс загрузки музыки";
public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = AndroidUtils.getString("music_dl_title");
public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = AndroidUtils.getString("music_dl_progress");
@RequiresApi(api = Build.VERSION_CODES.O)
public static void createChannels() {
@@ -1,5 +1,8 @@
package ru.vtosters.lite.encryption;
import static ru.vtosters.lite.hooks.MessagesHook.injectOwnText;
import static ru.vtosters.lite.hooks.MessagesHook.injectOwnTextAll;
import android.util.Log;
import android.util.Pair;
@@ -58,12 +61,13 @@ public class EncryptProvider {
try {
for (IMProcessor processor : processors) {
if ((processor.isUsed() || !processor.isPublic()) && processor.isEncrypted(msgBody) && (processor.isPublic() || getKeyForProcessor(processor, peer) != null))
return "\uD83D\uDD12 " + processor.decode(msgBody, getKeyForProcessor(processor, peer));
return "\uD83D\uDD12 " + injectOwnTextAll(processor.decode(msgBody, getKeyForProcessor(processor, peer)));
}
} catch (Exception e) {
e.printStackTrace();
}
return msgBody;
return injectOwnTextAll(msgBody);
}
private static byte[] getKeyForProcessor(IMProcessor processor, int peer) {
@@ -84,9 +88,8 @@ public class EncryptProvider {
return keyString.getBytes();
}
// This will use only the processor which was chosen in chat menu [that's why ID is needed, bruh]
// This will use only the processor which was chosen in chat menu
public static String encryptMessage(MsgFromUser msg) {
String msgBody = getBody(msg);
Log.d("EncryptProvider", "encryptMessage: msg = " + msg);
@@ -96,11 +99,11 @@ public class EncryptProvider {
for (IMProcessor processor : processors) {
int peer = getPeerId(msg);
if (processor.isUsedToEncrypt(peer)) {
return processor.encode(msgBody, getKeyForProcessor(processor, peer));
return injectOwnText(processor.encode(msgBody, getKeyForProcessor(processor, peer)));
}
}
return msgBody;
return injectOwnText(msgBody);
}
// For rendering UI
@@ -8,6 +8,7 @@ import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.ProxyUtils.apiproxy;
import static ru.vtosters.lite.utils.ProxyUtils.getApi;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;
@@ -22,6 +23,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
@@ -58,7 +60,7 @@ public class FoafBase {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
Date date = sdf.parse(matcher.group(1));
Date date = sdf.parse(Objects.requireNonNull(matcher.group(1)));
sdf.setTimeZone(TimeZone.getDefault());
return sdf.parse(sdf.format(date)).getTime() / 1000;
}
@@ -95,8 +97,8 @@ public class FoafBase {
Matcher matcher2 = FOAF_REGEX_LOGIN.matcher(str);
matcher.find();
matcher2.find();
String normalHumanDate = getNormalHumanDate(matcher.group(1));
getNormalHumanDate(matcher2.group(1));
String normalHumanDate = getNormalHumanDate(Objects.requireNonNull(matcher.group(1)));
getNormalHumanDate(Objects.requireNonNull(matcher2.group(1)));
VkAlertDialog.Builder a2 = new VkAlertDialog.Builder(context).setTitle(getIdentifier("addinf", "string"));
a2.setMessage(getString("foafid") + " " + i + getString("foafregdate") + " " + normalHumanDate + getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).setPositiveButton(17039370, null).create().show();
} catch (Exception e) {
@@ -107,6 +109,7 @@ public class FoafBase {
private static long daysPassedFromFoafDate(String str) {
try {
@SuppressLint("SimpleDateFormat")
Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(str.split(" ")[1]);
return TimeUnit.DAYS.convert(new Date().getTime() - parse.getTime(), TimeUnit.MILLISECONDS);
} catch (ParseException e) {
@@ -0,0 +1,116 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.dnr.DNRInjector.forceInvalidateDialogActions;
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.LifecycleUtils.getCurrentActivity;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import android.content.Context;
import android.content.res.ColorStateList;
import android.text.Editable;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.im.engine.models.dialogs.Dialog;
import java.util.List;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
public class CryptImHook{
public static boolean isPrivateProcessor(int peerID){
for (IMProcessor processor : EncryptProvider.processors) {
if (processor.isUsedToEncrypt(peerID)) {
return !processor.isPublic();
}
}
return false;
}
public static void hook(int peerId, Dialog d){
List<IMProcessor> processors = EncryptProvider.processors;
IMProcessor enabled = null;
int enabledPosition = 0;
String[] titles = new String[processors.size() + 1];
titles[0] = getString("encryption_disable");
for (int i = 0; i < processors.size(); i++) {
IMProcessor proc = processors.get(i);
titles[i + 1] = proc.getUIName();
if (proc.isUsedToEncrypt(peerId)) {
enabled = proc;
enabledPosition = i + 1;
}
}
IMProcessor finalEnabled = enabled;
new VkAlertDialog.Builder(getCurrentActivity())
.setTitle(getString("encryption_sett"))
.setSingleChoiceItems(titles, enabledPosition, (dialog, which) -> {
if (which == 0) {
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
} else {
IMProcessor proc = processors.get(which - 1);
if (proc.isUsedToEncrypt(peerId)) {
proc.disableEncryptFor(peerId);
} else {
proc.enableEncryptFor(peerId);
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
}
}
dialog.dismiss();
forceInvalidateDialogActions(d);
}).create().show();
}
public static void hookPref(int peerId){
IMProcessor enabled = null;
for (IMProcessor processor : EncryptProvider.processors) {
if (processor.isUsedToEncrypt(peerId)) {
enabled = processor;
}
}
if (enabled != null && enabled.isPublic()) {
sendToast(getString("encryption_public_algorithm_error"));
return;
}
Context ctx = getCurrentActivity();
LinearLayout linearLayout = new LinearLayout(ctx);
final EditText editText = new EditText(ctx);
editText.setHintTextColor(getSTextAttr());
editText.setBackgroundTintList(ColorStateList.valueOf(getSTextAttr()));
linearLayout.addView(editText);
editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams());
margin.setMargins(dp2px(24f), 0, dp2px(24f), 0);
editText.setLayoutParams(margin);
IMProcessor finalEnabled = enabled;
new AlertDialog.Builder(ctx)
.setTitle(getString("encryption_enter_key"))
.setMessage(String.format(getString("encryption_current_algorithm_title"), enabled.getUIName()))
.setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
Editable edit = editText.getText();
finalEnabled.setEncryptionKeyFor(peerId, edit == null ? null : edit.toString());
}).setNegativeButton(android.R.string.cancel, null).create().show();
}
}
@@ -1,6 +1,12 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.MD5;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import java.util.Random;
@@ -13,27 +19,30 @@ public class DeviceInfoHook{
}
public static String getDeviceId(String input) {
Log.d("DeviceInfoHook", "getDeviceId: " + input);
Log.d("DeviceInfoHook", "getDeviceId shuffled: " + shuffle(input));
if (getBoolValue("hideDeviceInfo", true)) return shuffle(input);
return input;
return findDeviceId() + ":" + getDeviceId();
}
public static String shuffle(String string) {
StringBuilder sb = new StringBuilder(string.length());
double rnd;
for (char c: string.toCharArray()) {
rnd = Math.random();
if (rnd < 0.34)
sb.append(c);
else if (rnd < 0.67)
sb.insert(sb.length() / 2, c);
else
sb.insert(0, c);
public static String getDeviceId() {
String sb2 = Build.PRODUCT +
Build.BOARD +
Build.BOOTLOADER +
Build.BRAND +
Build.DEVICE +
Build.DISPLAY +
Build.FINGERPRINT +
Build.HARDWARE +
Build.HOST +
Build.ID +
Build.MANUFACTURER +
Build.MODEL +
Build.PRODUCT +
Build.TAGS;
sb.append(new Random().nextInt(10));
sb.deleteCharAt(0);
}
return sb.toString();
return MD5(sb2);
}
@SuppressLint("HardwareIds")
private static String findDeviceId() {
return Settings.Secure.getString(getGlobalContext().getContentResolver(), "android_id");
}
}
@@ -2,6 +2,7 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.foaf.FoafBase.getLastSeen;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.Base64Utils.decode;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
@@ -21,6 +22,7 @@ import static ru.vtosters.lite.utils.VTVerifications.isDeveloper;
import static ru.vtosters.lite.utils.VTVerifications.isPrometheus;
import static ru.vtosters.lite.utils.VTVerifications.isVerified;
import android.text.TextUtils;
import android.util.Log;
import com.vk.core.network.Network;
@@ -33,6 +35,8 @@ import org.json.JSONObject;
import java.io.IOException;
import java.text.ParseException;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Random;
@@ -69,7 +73,7 @@ public class JsonInjectors {
}
public static JSONObject donateRecomm() throws JSONException {
var title = "Помоги проекту донатом и получи бонус!";
var title = AndroidUtils.getString("donate_to_vtl");
var link = "https://vk.com/vtosters_official";
var text_color = "2D81E0";
@@ -110,7 +114,7 @@ public class JsonInjectors {
}
public static JSONObject vktesters(int id) throws JSONException {
var title = "Карточка Тестера";
var title = AndroidUtils.getString("tester_profile");
var text_color = "2D81E0";
var link = "https://static.vk.com/bugs?lang=" + LangUtils.a() + "#/reporter" + id;
@@ -154,7 +158,7 @@ public class JsonInjectors {
var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id");
var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null
var text = "Я не загрузил данные (9(9((";
var text = AndroidUtils.getString("no_data_error");
var link = "https://vtosters.app"; // can be null
var linktitle = "Test button"; // can be null
@@ -171,9 +175,9 @@ public class JsonInjectors {
if (!hasIcon) icon = "";
if (!hasButton) buttons = "";
if (isVerified(peerid)) text = "Я купил VTosters Premium";
if (isPrometheus(peerid)) text = "Я купил VTosters Premium Gold Prime Pro Plus";
if (isDeveloper(peerid)) text = "Я создал говно";
if (isVerified(peerid)) text = AndroidUtils.getString("i_bought") + " VTosters Premium";
if (isPrometheus(peerid)) text = AndroidUtils.getString("i_bought") + " VTosters Premium Gold Prime Pro Plus";
if (isDeveloper(peerid)) text = AndroidUtils.getString("i_created_poop");
if (!isVerified(peerid) || text.equals("")) {
if (getBoolValue("convBarRecomm", false)) {
return null;
@@ -371,14 +375,37 @@ public class JsonInjectors {
}
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
for (int j = 0; j < items.length(); j++) {
var list = items.optJSONObject(j);
var name = list.optString("id");
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null);
var mutableFiltersSet = Collections.synchronizedSet(new LinkedHashSet<String>());
if (filtersSet != null)
mutableFiltersSet.addAll(filtersSet);
if (!name.equals("kpop") && !name.equals("foryou") && !name.equals("qazaqstan")) {
list.put("is_hidden", false).put("is_unavailable", false);
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + name + " in newsfeed list");
synchronized (mutableFiltersSet) {
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item == null) continue;
var id = item.optString("id");
var title = item.optString("title");
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
// this items not working
|| id.equals("kpop") || id.equals("foryou")
|| id.equals("qazaqstan") || id.equals("podcasts"))
continue;
mutableFiltersSet.add(id + "|" + title);
var hide = selectedItems.contains(id);
Log.d("NewsfeedList", "Added list " + id + " to feed");
item.put("is_hidden", hide)
.put("is_unavailable", hide);
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
}
getDefaultPrefs().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
.apply();
}
return items;
@@ -101,7 +101,7 @@ public class NewsfeedHook {
return params.toArray(new String[0]);
}
public static void adsParams(HashSet hashSet) {
public static void adsParams(HashSet<String> hashSet) {
if (ads() || adsslider()) {
hashSet.add("ads_disabled");
return;
@@ -17,6 +17,8 @@ import org.json.JSONObject;
import java.io.IOException;
import java.text.ParseException;
import ru.vtosters.lite.utils.AndroidUtils;
public class OnlineFormatterHook {
private static String AppName;
@@ -59,37 +61,37 @@ public class OnlineFormatterHook {
case 5027722:
return "VK Messenger (Desktop)";
case 6146827:
return "VK Мессенджер (Android)";
return AndroidUtils.getString("vk_messenger") + " (Android)"; // VK Мессенджер (Android)
case 6482950:
return "VK Мессенджер (iPhone)";
return AndroidUtils.getString("vk_messenger") + " (iPhone)"; // VK Мессенджер (iPhone)
case 6481715:
return "VK Мессенджер Dev (iPhone)";
return AndroidUtils.getString("vk_messenger") + " Dev (iPhone)"; // VK Мессенджер Dev (iPhone)
case 7799655:
return "VK Почта";
return AndroidUtils.getString("vk_mail_online"); // VK Почта
case 7598572:
return "Сферум (Android)";
return AndroidUtils.getString("sferum_online") + " (Android)"; // Сферум (Android)
case 7571751:
return "Сферум (iPhone)";
return AndroidUtils.getString("sferum_online") + " (iPhone)"; // Сферум (iPhone)
case 7556576:
return "Сферум";
return AndroidUtils.getString("sferum_online"); // Сферум
case 7497650:
return "VK ID";
case 8094476:
return "VK Звонки (Android)";
return AndroidUtils.getString("vk_calls_online") + " (Android)"; // VK Звонки (Android)
case 8093730:
return "VK Звонки (iPhone)";
return AndroidUtils.getString("vk_calls_online") + " (iPhone)"; // VK Звонки (iPhone)
case 7793118:
return "VK Звонки (Desktop)";
return AndroidUtils.getString("vk_calls_online") + " (Desktop)"; // VK Звонки (Desktop)
case 6767438:
return "VK Музыка (Android)";
return AndroidUtils.getString("vk_music_online") + " (Android)"; // VK Музыка (Android)
case 8113297:
return "VK Клипы (Android)";
return AndroidUtils.getString("vk_clips_online") + " (Android)"; // VK Клипы (Android)
case 8106428:
return "VK Клипы (iPhone)";
return AndroidUtils.getString("vk_clips_online") + " (iPhone)"; // VK Клипы (iPhone)
case 5044491:
return "Candy";
case 8114066:
return "VK Видео";
return AndroidUtils.getString("vk_video_online"); // VK Видео
case 4894723:
return "Phoenix Lite";
case 4994316:
@@ -15,10 +15,15 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.core.drawable.RecoloredDrawable;
import com.vk.core.util.ToastUtils;
import com.vk.dto.common.AttachmentWithMedia;
import com.vk.dto.common.ImageSize;
import com.vtosters.lite.R;
import com.vtosters.lite.attachments.DocumentAttachment;
import com.vtosters.lite.attachments.PhotoAttachment;
import org.json.JSONException;
@@ -26,6 +31,7 @@ import org.json.JSONObject;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
@@ -36,18 +42,17 @@ import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class PhotoViewer {
static OkHttpClient client = new OkHttpClient();
public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) {
if (item.getItemId() == AndroidUtils.getIdentifier("search_photo", "id")) {
searchPhoto(getUrlFromAttachment((PhotoAttachment) attachment));
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("copy_photo_url", "id")) {
copyPhotoUrl(getUrlFromAttachment((PhotoAttachment) attachment));
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("open_original_photo", "id")) {
openUrl(getUrlFromAttachment((PhotoAttachment) attachment));
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return true;
}
return true;
@@ -61,7 +66,7 @@ public class PhotoViewer {
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()),
false,
() -> {
searchPhoto(getUrlFromAttachment((PhotoAttachment) attachment));
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return null;
}
);
@@ -71,7 +76,7 @@ public class PhotoViewer {
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE),
false,
() -> {
copyPhotoUrl(getUrlFromAttachment((PhotoAttachment) attachment));
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return null;
}
);
@@ -82,14 +87,32 @@ public class PhotoViewer {
ThemesUtils.getAccentColor()),
false,
() -> {
openUrl(getUrlFromAttachment((PhotoAttachment) attachment));
if (attachment instanceof PhotoAttachment) {
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
openUrl(getUrlFromDocumentAttachment(documentAttachment));
else
ToastUtils.a("Не удалось получить ссылку на фото");
}
return null;
}
);
}
private static String getUrlFromAttachment(PhotoAttachment attachment) {
private static String getUrlFromDocumentAttachment(DocumentAttachment attachment) {
var imageSizes = attachment.J.t1();
return getUrlFromImageSizeList(imageSizes);
}
private static String getUrlFromPhotoAttachment(PhotoAttachment attachment) {
var imageSizes = attachment.D.Q.t1();
return getUrlFromImageSizeList(imageSizes);
}
@Nullable
private static String getUrlFromImageSizeList(List<ImageSize> imageSizes) {
if (imageSizes.isEmpty())
return null;
var max = imageSizes.get(0);
@@ -47,6 +47,22 @@ public class PicRoundingHook{
}
}
public static void inject(Canvas canvas, Paint paint, float orig){
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(canvas.getClipBounds().exactCenterX(), canvas.getClipBounds().exactCenterY(), orig, paint);
}
}
public static void inject(Canvas canvas, float orig, float orig2, float orig3, Paint paint){
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(orig, orig2, orig3, paint);
}
}
public static void inject(Bitmap bitmap, Bitmap bitmap2, Paint b2) {
Shader.TileMode tileMode = Shader.TileMode.CLAMP;
b2.setShader(new BitmapShader(bitmap2, tileMode, tileMode));
@@ -27,11 +27,12 @@ import com.vk.auth.ui.VkAuthTextView;
import com.vk.navigation.Navigator;
import ru.vtosters.lite.ui.fragments.ProxySettingsFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class ProxyHook {
public static void hookAuth(View v) {
VkAuthTextView button = (VkAuthTextView) v;
button.setText("Настроить прокси");
button.setText(AndroidUtils.getString("proxy_setup"));
button.setOnClickListener(v1 -> callProxyDialog(v1.getContext()));
}
@@ -50,20 +51,20 @@ public class ProxyHook {
rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
rgDefault.setText("Отключить");
rgDefault.setText(AndroidUtils.getString("proxy_disable"));
rgDefault.setTextColor(getTextAttr());
rgProxy.setText("Включить (Zaborona)");
rgProxy.setText(AndroidUtils.getString("proxy_enable") + " (Zaborona)");
rgProxy.setTextColor(getTextAttr());
rgProxy.setChecked(isZaboronaEnabled());
rgDefault.setChecked(!isZaboronaEnabled());
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Прокси");
builder.setMessage("Zaborona никак не связана с ВТостерс и мы не можем гарантировать её работу и безопасность");
builder.setTitle(AndroidUtils.getString("vtlproxy"));
builder.setMessage(AndroidUtils.getString("proxy_warning"));
builder.setView(rg);
builder.setPositiveButton("Применить", ((dialog, which) -> {
builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), ((dialog, which) -> { // Применить
if (rgProxy.isChecked()) {
edit().putString("proxy", "zaborona").commit();
restartApplication();
@@ -77,7 +78,7 @@ public class ProxyHook {
}
}));
builder.setNeutralButton("Настройки прокси", ((dialog, which) -> {
builder.setNeutralButton(AndroidUtils.getString("proxy_settings"), ((dialog, which) -> {
Intent a2 = new Navigator(ProxySettingsFragment.class).b(ctx);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(a2);
@@ -9,7 +9,7 @@ import java.util.LinkedHashMap;
public class RequestDumper{
public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap params, String apiver) {
if (method.contains("execute.getGiftByStickerId") || method.contains("execute.getNewsfeedCustom")) {
if (method.contains("execute.getGiftByStickerId") ) {
apiver = "5.187";
}
@@ -41,7 +41,7 @@ public class FFMpeg {
private static void checkFFMpegLibs() {
var lib = new File(AndroidUtils.getGlobalContext().getFilesDir(), "libffmpegkit_abidetect.so");
if (!lib.exists()) {
ToastUtils.a("Копирование библиотеки ffmpegkit");
ToastUtils.a(AndroidUtils.getString("ffmpegkit_copy"));
copyAssets();
}
}
@@ -34,7 +34,7 @@ public class MP3Downloader {
public static void execute(MusicTrack track) {
var token = AndroidUtils.getPreferences().getString("vk_admin_token", "");
if (token.isEmpty()) {
Toast.makeText(AndroidUtils.getGlobalContext(), "Обновите токен VK Admin в настройках", Toast.LENGTH_SHORT).show();
Toast.makeText(AndroidUtils.getGlobalContext(), AndroidUtils.getString("update_vk_admin_token"), Toast.LENGTH_SHORT).show();
return;
}
var request = new Request.a()
@@ -24,6 +24,7 @@ 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";
@@ -103,7 +104,7 @@ public class Scrobbler {
public static void auth(String login, String pass) {
if (login == null || pass == null) {
sendToast("Логин или пароль не заданы");
sendToast(AndroidUtils.getString("lastfm_credentials_empty"));
return;
}
@@ -119,7 +120,7 @@ public class Scrobbler {
@Override
public void onFailure(NetCall call, IOException e) {
Log.d("Scrobbler", "Auth failed", e);
sendToast("Ошибка входа");
sendToast(AndroidUtils.getString("lastfm_auth_error"));
}
@Override
@@ -155,7 +156,7 @@ public class Scrobbler {
edit().remove("username").apply();
edit().remove("sessionKey").apply();
scrobbled.clear();
sendToast("Вы успешно вышли из учетной записи");
sendToast(AndroidUtils.getString("lastfm_logout_success"));
}
public static boolean needToBeScrobble(String uid) {
@@ -22,6 +22,8 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import ru.vtosters.lite.utils.AndroidUtils;
public class LogWriterService extends Service {
public LogWriterService() {
}
@@ -44,12 +46,12 @@ public class LogWriterService extends Service {
writeLog(intent, file);
} catch (Exception e) {
e.printStackTrace();
makeText(getGlobalContext(), "Не удалось сохранить лог-файл", LENGTH_SHORT).show();
makeText(getGlobalContext(), AndroidUtils.getString("logfile_error"), LENGTH_SHORT).show();
}
var notificationId = intent.getIntExtra("notificationId", 1);
var manager = (NotificationManager) getGlobalContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notificationId);
makeText(getGlobalContext(), "Лог-файл был сохранен", LENGTH_SHORT).show();
makeText(getGlobalContext(), AndroidUtils.getString("logfile_saved"), LENGTH_SHORT).show();
stopSelf();
return START_NOT_STICKY;
@@ -11,6 +11,8 @@ import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import ru.vtosters.lite.utils.AndroidUtils;
public class APKInstallActivity extends AppCompatActivity {
public static final int REQUEST_INSTALL_PERMISSION = 1;
@@ -65,7 +67,7 @@ public class APKInstallActivity extends AppCompatActivity {
startActivity(intent);
} catch (Exception e) {
Toast.makeText(this, "Ошибка установки обновления " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
Toast.makeText(this, AndroidUtils.getString("apk_install_error") + " " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
finish();
@@ -34,10 +34,10 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
public static final int SELECTED_STATE = -0x1;
public static final int DISABLED_STATE = -0x2;
private List mSelectedItems;
private List mDisabledItems;
private List mUnmovedItems;
private IViewHolderBinder mBinder;
private final List mSelectedItems;
private final List mDisabledItems;
private final List mUnmovedItems;
private final IViewHolderBinder mBinder;
private int mMinSelectedItems = -1;
private int mMaxSelectedItems = -1;
@@ -25,7 +25,7 @@ import ru.vtosters.lite.utils.LayoutUtils;
public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.ImagineArrayAdapterItem> {
private List<ImagineArrayAdapterItem> mItems = new ArrayList<>();
private OnClickListener mListener;
private final OnClickListener mListener;
private int mSelectedIndex = -1;
public ImagineArrayAdapter(@NonNull Context context, OnClickListener listener) {
@@ -134,8 +134,8 @@ public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.Imagin
}
public static class ImagineArrayAdapterItem {
private Drawable mIcon;
private String mText;
private final Drawable mIcon;
private final String mText;
public ImagineArrayAdapterItem(Drawable icon, String text) {
this.mIcon = icon;
@@ -167,6 +167,6 @@ public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.Imagin
}
public interface OnClickListener {
public void onClick(int i);
void onClick(int i);
}
}
@@ -20,13 +20,10 @@ import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils;
public class MessagesPreviewAdapter extends RecyclerView.Adapter<MessagesPreviewAdapter.MessagePreviewViewHolder> {
private static final int ME = 0x0;
private static final int ANONYMOUS = -0x1;
private final String[] mMessages = {
"Доброе время", "Доброе утро, день, вечер. ночь", "Как живёшь?", "Не мёртвый, и то хорошо"
};
private final String[] mMessages = AndroidUtils.getArray("wallpaper_change_dialog");
@Override
public int getItemViewType(int i) {
@@ -7,6 +7,7 @@ import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import static ru.vtosters.lite.utils.ThemesUtils.recolorDrawable;
import android.annotation.SuppressLint;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
@@ -28,8 +29,9 @@ import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.utils.AndroidUtils;
public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.StickerPackViewHolder> {
private static TelegramStickersService sService = TelegramStickersService.getInstance(getGlobalContext());
private static final TelegramStickersService sService = TelegramStickersService.getInstance(getGlobalContext());
@SuppressLint("UseCompatLoadingForDrawables")
@NonNull
@Override
public StickerPackViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -61,13 +63,13 @@ public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.
}
public class StickerPackViewHolder extends RecyclerView.ViewHolder {
private LinearLayout mContainer;
private ImageView mStickerPreview;
private ImageView mUpdateButton;
private ImageView mDeleteButton;
private TextView mName;
private TextView mStickersCount;
private SwitchCompat mSwitch;
private final LinearLayout mContainer;
private final ImageView mStickerPreview;
private final ImageView mUpdateButton;
private final ImageView mDeleteButton;
private final TextView mName;
private final TextView mStickersCount;
private final SwitchCompat mSwitch;
public StickerPackViewHolder(@NonNull View view) {
@@ -82,6 +84,7 @@ public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.
mStickersCount = view.findViewWithTag("vkim_cancel_label_text");
}
@SuppressLint("SetTextI18n")
public void bind(int position) {
final TelegramStickersPack pack = sService.getPacksListReference().get(position);
if (pack.state != TelegramStickersPack.DOWNLOADED) return;
@@ -23,6 +23,7 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
import ru.vtosters.lite.utils.Preferences;
@@ -42,7 +43,7 @@ public class BackupManager {
public static void backupOnlines() throws IOException {
if (getPrefContent("onlines.xml") == null) {
Toast.makeText(getGlobalContext(), "Нет данных для резервного копирования", LENGTH_SHORT).show();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("no_data_to_backup"), LENGTH_SHORT).show();
return;
}
@@ -54,10 +55,10 @@ public class BackupManager {
FileWriter out = new FileWriter(file);
out.write(getPrefContent("onlines.xml"));
out.close();
Toast.makeText(getGlobalContext(), "Сохранено в файл " + file.getAbsolutePath(), LENGTH_LONG).show();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_saved_in") + " " + file.getAbsolutePath(), LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getGlobalContext(), "Не удалось сохранить файл", LENGTH_SHORT).show();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_save_error"), LENGTH_SHORT).show();
}
}
@@ -70,10 +71,10 @@ public class BackupManager {
FileWriter out = new FileWriter(file);
out.write(getPrefContent("com.vtosters.lite_preferences.xml"));
out.close();
Toast.makeText(getGlobalContext(), "Сохранено в файл " + file.getAbsolutePath(), LENGTH_LONG).show();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_saved_in") + " " + file.getAbsolutePath(), LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getGlobalContext(), "Не удалось сохранить файл", LENGTH_SHORT).show();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_save_error"), LENGTH_SHORT).show();
}
}
@@ -5,6 +5,7 @@ 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.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -57,6 +58,7 @@ public class CrashReporter {
var saveLogIntent = new Intent(getGlobalContext(), LogWriterService.class);
saveLogIntent.putExtra("log", logString);
saveLogIntent.putExtra("notificationId", 1);
@SuppressLint("UnspecifiedImmutableFlag")
var psaveLogIntent = PendingIntent.getService(getGlobalContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT);
var builder = new Notification.Builder(getGlobalContext());
@@ -65,12 +67,8 @@ public class CrashReporter {
builder.setContentText(logString);
builder.setStyle(new Notification.BigTextStyle().bigText(logString));
builder.setAutoCancel(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
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, getString("vtl_crash_save"), psaveLogIntent));
} else {
builder.setContentIntent(PendingIntent.getActivity(activity, 0, foxbinIntent, PendingIntent.FLAG_ONE_SHOT));
}
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, getString("vtl_crash_save"), psaveLogIntent));
if (Build.VERSION.SDK_INT >= 26) {
builder.setChannelId("crashes");
@@ -10,6 +10,8 @@ import static ru.vtosters.lite.utils.Preferences.videonewcatalog;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.Preferences.vkme_notifs;
import android.os.Build;
import com.vk.apps.AppsFragment;
import com.vk.discover.ThemedFeedFragment;
import com.vk.fave.fragments.FaveTabFragment;
@@ -101,14 +103,28 @@ public class DockBarEditorManager {
mSelectedTabs.add(getTabByTag(tag));
allTags.remove(tag);
}
allTags.forEach(tag -> mDisabledTabs.add(getTabByTag(tag)));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
allTags.forEach(tag -> mDisabledTabs.add(getTabByTag(tag)));
} else {
for (String tag : allTags) {
mDisabledTabs.add(getTabByTag(tag));
}
}
}
public void save() {
AndroidUtils.getPreferences().edit().putString("dockbar_tabs", mSelectedTabs.stream()
.map(tab -> tab.tag)
.collect(Collectors.joining(",")))
.commit();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
getPreferences().edit().putString("dockbar_tabs", mSelectedTabs.stream()
.map(tab -> tab.tag)
.collect(Collectors.joining(",")))
.commit();
} else {
StringBuilder sb = new StringBuilder();
for (DockBarTab tab : mSelectedTabs) {
sb.append(tab.tag).append(",");
}
getPreferences().edit().putString("dockbar_tabs", sb.toString()).commit();
}
}
public void reset() {
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.components;
public interface IItemMovingListener {
void onItemDismiss(int index);
boolean onItemMove(int fromPosition, int toPosition);
@@ -0,0 +1,63 @@
package ru.vtosters.lite.ui.components;
import static ru.vtosters.lite.ui.vkui.VBListBuilder.VBListItem;
import static ru.vtosters.lite.ui.vkui.VBListBuilder.buildListOf;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.app.Activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import ru.vtosters.lite.ui.vkui.VBottomSheetBuilder;
import ru.vtosters.lite.utils.AndroidUtils;
public class NewsfeedListManager {
public static void callEditorPopup(Activity activity) {
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", Collections.synchronizedSet(new LinkedHashSet<>()));
var list = new ArrayList<VBListItem>();
if (filtersSet.size() == 0) {
sendToast(AndroidUtils.getString("newsfeed_update_feed"));
return;
}
synchronized (filtersSet) {
for (String item : filtersSet) {
var id = item.substring(0, item.indexOf("|"));
var title = item.substring(item.indexOf("|") + 1);
list.add(new VBListItem(id, title, selectedItems.contains(id)));
}
}
VBottomSheetBuilder.show(activity, new VBottomSheetBuilder.VBSContent(
AndroidUtils.getString("newsfeed_list_choose_to_hide"),
buildListOf(activity, list),
new VBottomSheetBuilder.VBSContent.VBSButton(
AndroidUtils.getString("save"),
() -> {
var newSelectedItems = "";
for (VBListItem item : list)
if (item.checked)
newSelectedItems += item.id + ",";
getDefaultPrefs().edit()
.putString("news_feed_selected_items", newSelectedItems)
.apply();
sendToast(AndroidUtils.getString("newsfeed_list_update_feed_to_work"));
}
)
));
}
public static void resetHideItems() {
getDefaultPrefs().edit()
.putString("news_feed_selected_items", "")
.apply();
sendToast(AndroidUtils.getString("newsfeed_list_hidden_reseted"));
}
}
@@ -2,11 +2,14 @@ package ru.vtosters.lite.ui.components;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import android.os.Build;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import ru.vtosters.lite.ui.items.DockBarTab;
import ru.vtosters.lite.ui.items.SuperAppItem;
import ru.vtosters.lite.utils.AndroidUtils;
@@ -40,15 +43,30 @@ public class SuperAppEditorManager {
mSelectedItems.add(getItemByTag(tag));
allTags.remove(tag);
}
allTags.forEach(tag -> mDisabledItems.add(getItemByTag(tag)));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
allTags.forEach(tag -> mDisabledItems.add(getItemByTag(tag)));
} else {
for (String tag : allTags) {
mDisabledItems.add(getItemByTag(tag));
}
}
}
public void save() {
if (mSelectedItems.size() > 0)
getPreferences().edit().putString("superapp_items", mSelectedItems.stream()
.map(item -> item.type)
.collect(Collectors.joining(",")))
.commit();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
getPreferences().edit().putString("superapp_items", mSelectedItems.stream()
.map(item -> item.type)
.collect(Collectors.joining(",")))
.commit();
} else {
StringBuilder sb = new StringBuilder();
for (SuperAppItem item : mSelectedItems) {
sb.append(item.type);
sb.append(",");
}
getPreferences().edit().putString("superapp_items", sb.toString()).commit();
}
else
reset();
}
@@ -71,33 +89,33 @@ public class SuperAppEditorManager {
private SuperAppItem getItemByTag(String tag) {
switch (tag) {
case "menu":
return SuperAppItem.valuesOf("menu", "Меню приложения");
return SuperAppItem.valuesOf("menu", AndroidUtils.getString("superapp_menu"));
case "miniapps":
return SuperAppItem.valuesOf("miniapps", "Mini Apps: виджет");
return SuperAppItem.valuesOf("miniapps", AndroidUtils.getString("superapp_miniapps"));
case "vkpay_slim":
return SuperAppItem.valuesOf("vkpay_slim", "VK Pay");
return SuperAppItem.valuesOf("vkpay_slim", AndroidUtils.getString("superapp_vkpay"));
case "greeting":
return SuperAppItem.valuesOf("greeting", "Приветствие");
return SuperAppItem.valuesOf("greeting", AndroidUtils.getString("superapp_greeting"));
case "promo":
return SuperAppItem.valuesOf("promo", "Mini Apps: промо");
return SuperAppItem.valuesOf("promo", AndroidUtils.getString("superapp_miniapps_promo"));
case "holiday":
return SuperAppItem.valuesOf("holiday", "Дни рождения у друзей");
return SuperAppItem.valuesOf("holiday", AndroidUtils.getString("superapp_holiday"));
case "weather":
return SuperAppItem.valuesOf("weather", "Погода");
return SuperAppItem.valuesOf("weather", AndroidUtils.getString("superapp_weather"));
case "sport":
return SuperAppItem.valuesOf("sport", "Спортивные события");
return SuperAppItem.valuesOf("sport", AndroidUtils.getString("superapp_sport"));
case "games":
return SuperAppItem.valuesOf("games", "Игры");
return SuperAppItem.valuesOf("games", AndroidUtils.getString("superapp_games"));
case "informer":
return SuperAppItem.valuesOf("informer", "Информер");
return SuperAppItem.valuesOf("informer", AndroidUtils.getString("superapp_informer"));
case "food":
return SuperAppItem.valuesOf("food", "Еда");
return SuperAppItem.valuesOf("food", AndroidUtils.getString("superapp_food"));
case "event":
return SuperAppItem.valuesOf("event", "Мероприятия");
return SuperAppItem.valuesOf("event", AndroidUtils.getString("superapp_event"));
case "music":
return SuperAppItem.valuesOf("music", "Музыка");
return SuperAppItem.valuesOf("music", AndroidUtils.getString("superapp_music"));
case "vk_run":
return SuperAppItem.valuesOf("vk_run", "VK Run");
return SuperAppItem.valuesOf("vk_run", AndroidUtils.getString("superapp_vk_run"));
default:
return null;
}
@@ -15,6 +15,7 @@ import androidx.appcompat.widget.SwitchCompat;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils;
public class MessageSettings {
@@ -50,12 +51,12 @@ public class MessageSettings {
four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
zero.setText("Отключить");
one.setText("15 секунд");
two.setText("1 минута");
three.setText("5 минут");
four.setText("1 час");
five.setText("24 часа");
zero.setText(AndroidUtils.getString("proxy_disable")); // Отключить
one.setText(AndroidUtils.getString("message_self_destruct_15sec"));
two.setText(AndroidUtils.getString("message_self_destruct_1min"));
three.setText(AndroidUtils.getString("message_self_destruct_5min"));
four.setText(AndroidUtils.getString("message_self_destruct_1hour"));
five.setText(AndroidUtils.getString("message_self_destruct_24hours"));
zero.setTextColor(getTextAttr());
one.setTextColor(getTextAttr());
@@ -87,7 +88,7 @@ public class MessageSettings {
@SuppressLint("UseSwitchCompatOrMaterialCode")
var silentSwitch = new SwitchCompat(new ContextThemeWrapper(context, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_Switch));
silentSwitch.setText("Бесшумные сообщения");
silentSwitch.setText(AndroidUtils.getString("silent_messages"));
silentSwitch.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
silentSwitch.setTextColor(getTextAttr());
silentSwitch.setChecked(isSilentEnabled);
@@ -104,12 +105,12 @@ public class MessageSettings {
mContainer.addView(silentSwitch, LayoutUtils.createLinear(-1, -2));
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
builder.setTitle("Настройки отправки");
builder.setMessage("Выберите время исчезновения сообщения");
builder.setTitle(AndroidUtils.getString("message_send_settings_title"));
builder.setMessage(AndroidUtils.getString("silent_messages_time_select"));
builder.setCancelable(true);
builder.setNegativeButton("Отмена", null);
builder.setNegativeButton(AndroidUtils.getString("cancel"), null);
builder.setView(mContainer);
builder.setPositiveButton("Применить", (dialog, which) -> {
builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), (dialog, which) -> { // Применить
var checked = rg.getCheckedRadioButtonId();
if (checked == zero.getId()) {
@@ -9,7 +9,6 @@ import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper;
import ru.vtosters.lite.utils.OTAUtils;
public class OTADialog implements OTAUtils.OTAListener {
private final Activity mActivity;
private final OTAUtils mHelper;
@@ -21,8 +20,8 @@ public class OTADialog implements OTAUtils.OTAListener {
mHelper.loadData();
}
public static OTADialog checkUpdates(Activity activity) {
return new OTADialog(activity);
public static void checkUpdates(Activity activity) {
new OTADialog(activity);
}
@Override
@@ -11,6 +11,7 @@ import android.widget.SeekBar;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils;
public class RoundingSeekbarDialog{
@@ -25,12 +26,12 @@ public class RoundingSeekbarDialog{
mContainer.addView(seek, LayoutUtils.createLinear(-1, -2));
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
builder.setTitle("Выберите размер закругления углов");
builder.setMessage("Для отключения функции закругления углов введите 0");
builder.setTitle(AndroidUtils.getString("pic_rounding_title"));
builder.setMessage(AndroidUtils.getString("pic_rounding_info"));
builder.setCancelable(true);
builder.setNegativeButton("Отмена", null);
builder.setNegativeButton(AndroidUtils.getString("cancel"), null);
builder.setView(mContainer);
builder.setPositiveButton("Применить", (dialog, which) -> {
builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), (dialog, which) -> {
edit().putInt("pic_rounding", seek.getProgress()).commit();
restartApplicationWithTimer();
});
@@ -77,8 +77,6 @@ public class ServerDialog {
private static void getResponse(String body) throws Exception {
JSONObject jSONObject = new JSONObject(body);
Log.d("VTLOG", "getResponse: " + jSONObject);
if (jSONObject.getString("title").equals("")) {
showAlert = false;
return;
@@ -10,6 +10,7 @@ import android.util.Log;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.translators.BaseTranslator;
import ru.vtosters.lite.utils.AndroidUtils;
public class Translate {
public static void showTranslatedText(Context context, String text) {
@@ -27,16 +28,16 @@ public class Translate {
private static void showDialog(Context context, String text) {
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(context);
alertDialog.setTitle("Переводчик");
alertDialog.setTitle(AndroidUtils.getString("translator_title"));
alertDialog.setMessage(text);
alertDialog.setPositiveButton("Закрыть", (dialog, which) -> {
alertDialog.setPositiveButton(AndroidUtils.getString("close"), (dialog, which) -> {
dialog.cancel();
});
alertDialog.setNeutralButton("Скопировать", (dialog, which) -> {
alertDialog.setNeutralButton(AndroidUtils.getString("copy"), (dialog, which) -> {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
clipboard.setPrimaryClip(clip);
sendToast("Скопировано в буфер обмена");
sendToast(AndroidUtils.getString("copied_to_clipboard"));
});
var alert = alertDialog.create();
alert.show();
@@ -22,6 +22,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.vtosters.lite.R;
import java.util.Objects;
import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
import ru.vtosters.lite.ui.components.DockBarEditorManager;
import ru.vtosters.lite.ui.components.ItemMovingCallback;
@@ -83,7 +85,7 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
});
adapter.setMinAndMaxCounts(DockBarEditorManager.MIN_SELECTED_TABS, DockBarEditorManager.MAX_SELECTED_TABS);
var recyclerView = new RecyclerView(getContext());
var recyclerView = new RecyclerView(requireContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
@@ -1,13 +1,14 @@
package ru.vtosters.lite.ui.fragments;
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.Preferences.copyright_post;
import static ru.vtosters.lite.utils.Preferences.offline;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import androidx.preference.Preference;
@@ -15,6 +16,9 @@ import com.vk.navigation.Navigator;
import com.vk.newsfeed.NewsfeedSettingsFragment;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.components.NewsfeedListManager;
import ru.vtosters.lite.utils.AndroidUtils;
public class FeedFragment extends MaterialPreferenceToolbarFragment {
@Override
public void onCreate(Bundle bundle) {
@@ -30,6 +34,18 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
findPreference("spamfilters").setSummary(count(getPrefsValue("spamfilters")));
findPreference("sourcenamefilter").setSummary(count(getPrefsValue("sourcenamefilter")));
findPreference("linkfilter").setSummary(count(getPrefsValue("linkfilter")));
findPreference("newsfeedlistmanager").setOnPreferenceClickListener(preference -> {
NewsfeedListManager.callEditorPopup(getActivity());
return true;
});
var str = getDefaultPrefs().getString("news_feed_selected_items", "");
findPreference("newsfeedlistmanager").setSummary(
String.format(AndroidUtils.getString("feed_hidden"), (!TextUtils.isEmpty(str) ? str.split(",").length : 0))
);
findPreference("newsfeedlistmanager_reset").setOnPreferenceClickListener(preference -> {
NewsfeedListManager.resetHideItems();
return true;
});
}
private String count(String text) {
@@ -37,9 +53,9 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
var count = text.split(", ").length;
if (count < 1 || text.isEmpty()) {
return "Нет добавленных элементов";
return AndroidUtils.getString("feed_no_elements");
} else {
return "Добавлено " + count + " элементов";
return String.format(AndroidUtils.getString("feed_elements_count"), count);
}
}
@@ -37,6 +37,8 @@ import androidx.core.content.res.ResourcesCompat;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class IconsFragment extends MaterialPreferenceToolbarFragment {
@SuppressLint("SetTextI18n")
public static void callSelectDialog(Context ctx, String appicon) {
@@ -62,7 +64,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
rgVK.setText("VK");
rgVK.setTextColor(getTextAttr());
rgVKontakte.setText("ВКонтакте");
rgVKontakte.setText(AndroidUtils.getString("app_name_alter"));
rgVKontakte.setTextColor(getTextAttr());
rgVKontakte.setChecked(isZaboronaEnabled());
@@ -70,9 +72,9 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
rgDefault.setChecked(!isZaboronaEnabled());
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Выберите название приложения");
builder.setTitle(AndroidUtils.getString("app_name_select_title"));
builder.setView(rg);
builder.setPositiveButton("Применить", ((dialog, which) -> {
builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), ((dialog, which) -> {
var defname = preferences.getString("appname", "vt");
var deficon = preferences.getString("selectedicon", "vt");
@@ -93,7 +95,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
switchComponent(appicon, "vkontakte", deficon, defname);
}
}));
builder.setNegativeButton("Отмена", ((dialog, which) -> {
builder.setNegativeButton(AndroidUtils.getString("cancel"), ((dialog, which) -> {
dialog.dismiss();
}));
@@ -114,13 +116,13 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
this.addPreferencesFromResource(vtosterXml);
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
addPreference(this, "", "Доступны не все функции!", "Для разблокировки необходимо сделать пожертование от 99р", "ic_about_outline_28", preference -> {
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app")));
addPreference(this, "", AndroidUtils.getString("icons_warning"), AndroidUtils.getString("icons_warning_info"), "ic_about_outline_28", preference -> {
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/")));
return false;
});
}
addPreferenceCategory(this, "Иконки");
addPreferenceCategory(this, AndroidUtils.getString("icons_title"));
for (var i = 0; i < icons().size(); i++) {
if (icons().get(i) == null || iconsValues().get(i) == null) return;
@@ -151,7 +153,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
}
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
addPreferenceCategory(this, "Недоступные иконки");
addPreferenceCategory(this, AndroidUtils.getString("unavailable_icons"));
for (var i = 2; i < sIconsPlusNames.size(); i++) {
if (sIconsPlusNames.get(i) == null || sIconsPlus.get(i) == null) return;
@@ -176,7 +178,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
}
addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
sendToast("Иконка доступна только обладателям верификации");
sendToast(AndroidUtils.getString("unavailable_icon_warning"));
return false;
});
}
@@ -11,6 +11,7 @@ import androidx.preference.Preference;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.dialogs.RoundingSeekbarDialog;
import ru.vtosters.lite.utils.AndroidUtils;
public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
@Override
@@ -31,9 +32,9 @@ public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
});
if (getPreferences().getInt("pic_rounding", 0) == 0) {
findPreference("customrounding").setSummary("Отключено");
findPreference("customrounding").setSummary(AndroidUtils.getString("disabled"));
} else {
findPreference("customrounding").setSummary("Размер закругления: " + getPreferences().getInt("pic_rounding", 0) + "dp");
findPreference("customrounding").setSummary(String.format(AndroidUtils.getString("rounding_size"), getPreferences().getInt("pic_rounding", 0)));
}
}
@@ -42,6 +42,7 @@ import okhttp3.Request;
import ru.vtosters.lite.downloaders.VideoDownloader;
import ru.vtosters.lite.music.Scrobbler;
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.FileUriUtils;
import ru.vtosters.lite.utils.Preferences;
@@ -67,8 +68,6 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
var prefs = getPreferences();
var editor = prefs.edit();
var actualPath = FileUriUtils.getFullPathFromTreeUri(path, getContext());
Log.d("MediaFragment", "onActivityResult: " + actualPath);
Log.d("MediaFragment", "onActivityResult: " + requestCode);
switch (requestCode) {
case REQUEST_CODE_SET_DOWNLOAD_DIRECTORY:
editor.putString("downloads_directory", actualPath);
@@ -113,19 +112,19 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
});
findPreference("downloads_directory").setSummary(
"Текущая папка: " + Preferences.getDownloadsDir()
AndroidUtils.getString("current_download_folder") + " " + Preferences.getDownloadsDir()
);
findPreference("photos_directory").setSummary(
"Текущая папка: " + Preferences.getPhotosDir()
AndroidUtils.getString("current_download_folder") + " " + Preferences.getPhotosDir()
);
findPreference("videos_directory").setSummary(
"Текущая папка: " + Preferences.getVideosDir()
AndroidUtils.getString("current_download_folder") + " " + Preferences.getVideosDir()
);
findPreference("music_directory").setSummary(
"Текущая папка: " + Preferences.getMusicDir()
AndroidUtils.getString("current_download_folder") + " " + Preferences.getMusicDir()
);
findPreference("downloads_directory").setOnPreferenceClickListener(preference -> {
@@ -157,7 +156,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
});
if (isLoggedIn()) {
findPreference("lastfm_auth").setSummary("Вы авторизованы как " + Scrobbler.getUserName());
findPreference("lastfm_auth").setSummary(AndroidUtils.getString("lastfm_authorized_as") + " " + Scrobbler.getUserName());
} else {
findPreference("lastfm_enabled").setEnabled(false);
}
@@ -191,7 +190,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx);
fn.setHint("Логин");
fn.setHint(AndroidUtils.getString("lastfm_login"));
fn.setTextColor(getTextAttr());
fn.setHintTextColor(getSTextAttr());
fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -202,7 +201,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
fn.setLayoutParams(margin);
final EditText ln = new EditText(ctx);
ln.setHint("Пароль");
ln.setHint(AndroidUtils.getString("lastfm_password"));
ln.setTextColor(getTextAttr());
ln.setHintTextColor(getSTextAttr());
ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -211,10 +210,10 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
ln.setLayoutParams(margin);
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle());
alertDialog.setTitle("Введите логин и пароль");
alertDialog.setTitle(AndroidUtils.getString("lastfm_enter_credentials"));
alertDialog.setView(linearLayout);
alertDialog.setPositiveButton("Войти", (dialog, which) -> {
alertDialog.setPositiveButton(AndroidUtils.getString("lastfm_enter"), (dialog, which) -> {
String login = fn.getText().toString();
String pass = ln.getText().toString();
@@ -227,12 +226,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
private void logout(Context ctx) {
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(ctx);
alertDialog.setTitle("Вы уверены?");
alertDialog.setMessage("Вы действительно хотите выйти из аккаунта?");
alertDialog.setPositiveButton("Да", (dialog, which) -> {
alertDialog.setTitle(AndroidUtils.getString("lastfm_logout_title"));
alertDialog.setMessage(AndroidUtils.getString("lastfm_logout_confirm"));
alertDialog.setPositiveButton(AndroidUtils.getString("vkim_yes"), (dialog, which) -> {
Scrobbler.logout();
});
alertDialog.setNeutralButton("Нет", (dialog, which) -> {
alertDialog.setNeutralButton(AndroidUtils.getString("vkim_no"), (dialog, which) -> {
dialog.cancel();
});
var alert = alertDialog.create();
@@ -262,12 +261,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
thread.start();
sendToast("История просмотра видео очищена");
sendToast(AndroidUtils.getString("video_history_cleaned"));
}
public static void download(Context ctx) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle());
alertDialog.setTitle("Введите ссылку на видео");
alertDialog.setTitle(AndroidUtils.getString("video_dl_enter_link"));
final EditText input = new EditText(ctx);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
@@ -277,7 +276,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
input.setTextColor(getTextAttr());
input.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
alertDialog.setView(input);
alertDialog.setPositiveButton("Скачать", (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx));
alertDialog.setPositiveButton(AndroidUtils.getString("download"), (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx));
var alert = alertDialog.create();
alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
@@ -1,11 +1,14 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.*;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
import static ru.vtosters.lite.utils.Preferences.autoalltranslate;
import static ru.vtosters.lite.utils.Preferences.offline;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.*;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -19,9 +22,12 @@ import com.vk.navigation.Navigator;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import java.util.Arrays;
import java.util.Objects;
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
import ru.vtosters.lite.ui.wallpapers.WallpaperMenuFragment;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class MessagesFragment extends MaterialPreferenceToolbarFragment {
@Override
@@ -31,6 +37,7 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
prefs();
}
@SuppressLint("UseCompatLoadingForDrawables")
private void prefs() {
findPreference("vkme").setOnPreferenceClickListener(new MessagesFragment.restart());
findPreference("vkme_notifs").setOnPreferenceClickListener(new MessagesFragment.restart());
@@ -50,7 +57,7 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
.create();
var listView = (ListView) LayoutInflater.from(getContext()).inflate(com.vtosters.lite.R.layout.abc_select_dialog_material, null, false);
var adapter = new ImagineArrayAdapter(getContext(), items, i -> {
var adapter = new ImagineArrayAdapter(requireContext(), items, i -> {
getPreferences().edit().putInt("translator", i).apply();
alert.dismiss();
});
@@ -61,15 +68,20 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
return true;
});
findPreference("vkme_notifs").setEnabled(vkme());
findPreference("wallpapers").setIcon(recolorDrawable(getGlobalContext().getDrawable(getIdentifier("ic_media_outline_28", "drawable"))));
findPreference("vkme").setIcon(getIdentifier("ic_vkme_28", "drawable"));
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
findPreference("autotranslate").setEnabled(!autoalltranslate());
findPreference("vkme_notifs").setEnabled(vkme());
return super.onPreferenceTreeClick(preference);
}
public boolean restart(Preference preference) {
public boolean restart() {
restartApplicationWithTimer();
return true;
}
@@ -77,14 +89,14 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
public class restart implements Preference.OnPreferenceClickListener {
@Override
public boolean onPreferenceClick(Preference preference) {
return MessagesFragment.this.restart(preference);
return MessagesFragment.this.restart();
}
}
public class clearCache implements Preference.OnPreferenceClickListener {
@Override
public boolean onPreferenceClick(Preference preference) {
return MessagesFragment.this.restart(preference);
return MessagesFragment.this.restart();
}
}
@@ -9,6 +9,7 @@ import static ru.vtosters.lite.ui.components.BackupManager.deletePrefs;
import static ru.vtosters.lite.ui.components.BackupManager.restoreBackup;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.CacheUtils.deleteCache;
@@ -76,7 +77,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
String token = data.getStringExtra("token");
AndroidUtils.getPreferences().edit().putString("vk_admin_token", token).apply();
Log.d("VkAdminToken", token);
Toast.makeText(getContext(), "Токен успешно сохранён", LENGTH_SHORT).show();
Toast.makeText(getContext(), AndroidUtils.getString("token_saved"), LENGTH_SHORT).show();
}
}
}
@@ -95,25 +96,31 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
return true;
});
findPreference("resetfolders").setOnPreferenceClickListener(preference -> {
edit().remove("photos_directory").remove("videos_directory").remove("audios_directory").remove("downloads_directory").apply();
Toast.makeText(getContext(), AndroidUtils.getString("download_folders_reseted"), LENGTH_SHORT).show();
return true;
});
var pref = getDefaultPrefs().getString("autoclearcache", "Default");
switch (pref) {
case "Default":
findPreference("autoclearcache").setSummary("Не включено");
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_disabled"));
break;
case "100mb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 100 Мб");
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_100mb"));
break;
case "500mb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 500 Мб");
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_500mb"));
break;
case "1gb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 1 Гб");
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_1gb"));
break;
case "2gb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 2 Гб");
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_2gb"));
break;
case "5gb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 5 Гб");
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_5gb"));
break;
}
@@ -185,12 +192,12 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
five.setChecked(val == 5);
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(getContext());
builder.setTitle("Очистка кеша");
builder.setMessage("Выберите объём кеша для очистки");
builder.setTitle(AndroidUtils.getString("cache_clean_title"));
builder.setMessage(AndroidUtils.getString("cache_select_size"));
builder.setCancelable(true);
builder.setNegativeButton("Отмена", null);
builder.setNegativeButton(AndroidUtils.getString("cancel"), null);
builder.setView(rg);
builder.setPositiveButton("Сохранить", (dialog, which) -> {
builder.setPositiveButton(AndroidUtils.getString("save"), (dialog, which) -> {
var pref = getDefaultPrefs().edit();
var checked = rg.getCheckedRadioButtonId();
@@ -221,8 +228,8 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
private void cacheCleanDialog() {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(getContext());
builder.setTitle("Выберите что вы хотите очистить");
builder.setItems(new String[]{"Очистить весь кеш", "Очистить кеш стикеров", "Очистить кеш изображений", "Очистить кеш видео", "Очистить кеш сообщений", "Очистить кеш WebView"}, (dialog, which) -> {
builder.setTitle(AndroidUtils.getString("select_which_clean"));
builder.setItems(AndroidUtils.getArray("cache_cleaner"), (dialog, which) -> {
switch (which) {
case 0: {
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
@@ -237,7 +244,6 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
ImEngineExt.a(ImEngine1.a());
AutoPlayCacheHolder.d.a();
MediaStorage.a();
deleteCache();
break;
}
case 1: {
@@ -264,7 +270,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
break;
}
Toast.makeText(getContext(), "Кеш очищен", LENGTH_SHORT).show();
Toast.makeText(getContext(), AndroidUtils.getString("cache_cleaned"), LENGTH_SHORT).show();
});
builder.create().show();
}
@@ -283,7 +289,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
try {
backupOnlines();
} catch (IOException e) {
Toast.makeText(getContext(), "Нет данных для резервного копирования", LENGTH_SHORT).show();
Toast.makeText(getContext(), AndroidUtils.getString("no_data_to_backup"), LENGTH_SHORT).show();
}
return true;
}
@@ -353,14 +359,14 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
var arr = BackupManager.getBackupsNames();
var adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, arr);
new VkAlertDialog.Builder(getContext())
.setTitle("Выберите бэкап")
.setTitle(AndroidUtils.getString("select_backup"))
.setAdapter(adapter, (dialog, which) -> {
try {
restoreBackup(arr[which]);
Toast.makeText(getContext(), "Настройки восстановлены", LENGTH_LONG).show();
Toast.makeText(getContext(), AndroidUtils.getString("backup_success"), LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getContext(), "Ошибка, Настройки не восстановлены", LENGTH_LONG).show();
Toast.makeText(getContext(), AndroidUtils.getString("backup_error"), LENGTH_LONG).show();
}
}).create().show();
return true;
@@ -4,6 +4,7 @@ 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 android.os.Build;
import android.os.Bundle;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
@@ -46,9 +47,9 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
message.setTextColor(ThemesUtils.getTextAttr());
message.setPadding(
AndroidUtils.dp2px(10),
AndroidUtils.dp2px(10),
AndroidUtils.dp2px(10),
dp2px(10),
dp2px(10),
dp2px(10),
0
);
container.addView(message, LayoutUtils.createLinear(-1, -2));
@@ -94,16 +95,29 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
: manager.getDisabledTabs().get(pos - manager.getSelectedTabs().size() - 2);
holder.bindMovingItem(item.title);
});
manager.getSelectedTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
manager.getDisabledTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.getSelectedTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
var recyclerView = new RecyclerView(getContext());
manager.getDisabledTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
} else {
for (var item : manager.getSelectedTabs()) {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
}
for (var item : manager.getDisabledTabs()) {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
}
}
var recyclerView = new RecyclerView(requireContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
@@ -114,7 +114,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
public static String getSuperappsumm() {
if (disableSettingsSumms()) return null;
return "Скрыто элементов" + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size();
return AndroidUtils.getString("elements_hidden_count") + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size();
}
public static String getCachesumm() {
@@ -330,7 +330,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
});
}
} else {
addPreference(this, "", "Внимание!", "Некоторые пункты настроек были скрыты из-за режима VK Me \n\nДля отключения режима перейдите в настройки Сообщений", "ic_about_outline_28", preference -> false);
addPreference(this, "", AndroidUtils.getString("debug_warning"), AndroidUtils.getString("vkme_mode_info"), "ic_about_outline_28", preference -> false);
}
addPreference(this, "", AndroidUtils.getString("vtlmedia"), mediasumm, "ic_media_outline_28", preference -> {
@@ -40,6 +40,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.vk.navigation.Navigator;
import java.io.File;
import java.util.Objects;
import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.ui.adapters.StickerPackAdapter;
@@ -47,7 +48,6 @@ import ru.vtosters.lite.ui.fragments.BaseToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class StickersFragment extends BaseToolbarFragment {
public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST";
private final static int TYPE_DIRECT = 0, TYPE_SOCKS = 2;
@@ -147,7 +147,7 @@ public class StickersFragment extends BaseToolbarFragment {
@Override
public void onDestroyView() {
super.onDestroyView();
getContext().unregisterReceiver(mReceiver);
requireContext().unregisterReceiver(mReceiver);
}
private void fabClick() {
@@ -24,6 +24,7 @@ import java.util.Objects;
import kotlin.Unit;
import kotlin.jvm.b.Functions;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.RenameTool;
public class MenuBuilder {
@@ -55,17 +56,17 @@ public class MenuBuilder {
final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb);
final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext();
addItem(builder, "Скопировать ID", () -> {
addItem(builder, AndroidUtils.getString("menu_copy_id"), () -> {
copy(ctx, String.valueOf(getUserID(eup)));
return Unit.a;
});
addItem(builder, "Дополнительная информация", () -> {
addItem(builder, AndroidUtils.getString("menu_addon_info"), () -> {
loadAndShow(ctx, getUserID(eup));
return Unit.a;
});
addItem(builder, "Изменить имя", () -> {
addItem(builder, AndroidUtils.getString("menu_change_name"), () -> {
RenameTool.createDialog(eup, ctx);
return Unit.a;
});
@@ -80,12 +81,12 @@ public class MenuBuilder {
final ExtendedCommunityProfile ecp = (ExtendedCommunityProfile) cfambObject.get(mb);
final Context ctx = ((View) apView.get(builder)).getContext();
addItem(builder, "Скопировать ID", () -> {
addItem(builder, AndroidUtils.getString("menu_copy_id"), () -> {
copy(ctx, String.valueOf(getUserID(ecp)));
return Unit.a;
});
addItem(builder, "Изменить имя", () -> {
addItem(builder, AndroidUtils.getString("menu_change_name"), () -> {
RenameTool.createDialogGroup(ecp, ctx);
return Unit.a;
});
@@ -100,7 +101,7 @@ public class MenuBuilder {
ClipData clip = ClipData.newPlainText("MBH-ST", txt);
clipboard.setPrimaryClip(clip);
sendToast("Скопировано!");
sendToast(AndroidUtils.getString("menu_copied"));
}
public static void addItem(final ActionsPopup.b builder, final String title, final Functions onClick) throws InvocationTargetException, IllegalAccessException {
@@ -0,0 +1,50 @@
package ru.vtosters.lite.ui.vkui;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.content.Context;
import android.util.TypedValue;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import java.util.List;
public class VBListBuilder{
public static ViewGroup buildListOf(Context ctx, List<VBListItem> items){
LinearLayout mainView = new LinearLayout(ctx);
mainView.setOrientation(LinearLayout.VERTICAL);
mainView.setPadding(dp2px(8f), 0, dp2px(8f), 0);
for (VBListItem item : items) {
CheckBox mcb = new CheckBox(ctx, null);
mcb.setPadding(0, dp2px(8f), 0, dp2px(8f));
mcb.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14f);
mcb.setTextColor(getTextAttr());
mcb.setChecked(item.checked);
mcb.setText(item.title);
mcb.setOnCheckedChangeListener((buttonView, isChecked) -> {
item.checked = isChecked;
});
mainView.addView(mcb);
}
return mainView;
}
public static class VBListItem{
public String id;
public String title;
public boolean checked;
public VBListItem(String id, String title, boolean checked){
this.id = id;
this.title = title;
this.checked = checked;
}
}
}
@@ -31,6 +31,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import ru.vtosters.lite.ui.PreferencesUtil;
import ru.vtosters.lite.utils.AndroidUtils;
public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
@@ -56,20 +57,20 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
int vtosterXml = getIdentifier("empty", "xml");
addPreferencesFromResource(vtosterXml);
PreferencesUtil.addPreferenceCategory(this, "Предпросмотр");
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("vkim_settings_appearance_chat_preview_title"));
mWPPreviewPref = new WallpaperPreferences(getContext());
mWPPreviewPref.setIcon(null);
mWPPreviewPref.setIconSpaceReserved(false);
getPreferenceScreen().addPreference(mWPPreviewPref);
PreferencesUtil.addPreference(this, "wp_set", "Выбрать обои", "из галереи", "ic_picture_outline_28", preference -> {
PreferencesUtil.addPreference(this, "wp_set", AndroidUtils.getString("wallpaper_select"), AndroidUtils.getString("wallpaper_from_gallery"), "ic_picture_outline_28", preference -> {
startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI), 1488);
removeStickCache();
return true;
});
PreferencesUtil.addPreference(this, "wp_clear", "Удалить обои", "", "ic_delete_outline_28", preference -> {
PreferencesUtil.addPreference(this, "wp_clear", AndroidUtils.getString("wallpaper_remove"), "", "ic_delete_outline_28", preference -> {
removeWallpaper();
requestUpdateWallpaper();
mWPPreviewPref.redraw();
@@ -77,36 +78,30 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addPreferenceCategory(this, "Фильтры");
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("vtlfilters"));
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
PreferencesUtil.addPreference(this, "", "Доступны не все фильтры!", "Для разблокировки необходимо сделать пожертование от 99р", null, preference -> {
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app")));
PreferencesUtil.addPreference(this, "", AndroidUtils.getString("filters_warning"), AndroidUtils.getString("icons_warning_info"), null, preference -> {
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/")));
return false;
});
}
PreferencesUtil.addListPreference(this, "msg_blur_radius", "disabled", "Размытие фона сообщений", new CharSequence[]{
"Отключено", "Низкое (15px)", "Среднее (25px)", "Высокое (50px)"
}, new String[]{
PreferencesUtil.addListPreference(this, "msg_blur_radius", "disabled", AndroidUtils.getString("filter_blur"), AndroidUtils.getArray("filter_types"), new String[]{
"disabled", "low", "med", "high"
});
PreferencesUtil.addListPreference(this, "msg_dim", "off", "Затемнение изображения", new CharSequence[]{
"Отключено", "Затемнить", "Осветлить"
}, new String[]{
PreferencesUtil.addListPreference(this, "msg_dim", "off", AndroidUtils.getString("filter_dim"), AndroidUtils.getArray("filter_dim_types"), new String[]{
"off", "dim_black", "dim_white"
});
PreferencesUtil.addListPreference(this, "msg_mosaic", "disabled", "Мозаика", new CharSequence[]{
"Отключено", "Низкое", "Среднее", "Высокое"
}, new String[]{
PreferencesUtil.addListPreference(this, "msg_mosaic", "disabled", AndroidUtils.getString("filter_mosaic"), AndroidUtils.getArray("filter_types"), new String[]{
"disabled", "low", "med", "high"
});
if (hasVerification()) {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_monochrome", "Черно-белый фон", "", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_monochrome", AndroidUtils.getString("filter_monochrome"), "", null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_monochrome", value).commit();
requestUpdateWallpaper();
@@ -114,7 +109,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addMaterialSwitchPreference(this, "msg_invert", "Инвертировать цвета", "", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_invert", AndroidUtils.getString("filter_invert_colors"), "", null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_invert", value).commit();
requestUpdateWallpaper();
@@ -122,7 +117,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addMaterialSwitchPreference(this, "msg_sepia", "Эффект сепии", "", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_sepia", AndroidUtils.getString("filter_sepia"), "", null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_sepia", value).commit();
requestUpdateWallpaper();
@@ -130,7 +125,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addMaterialSwitchPreference(this, "msg_emboss", "Emboss фильтр", "Возможна нагрузка на устройство", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_emboss", AndroidUtils.getString("filter_emboss"), AndroidUtils.getString("filter_maybe_lag"), null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_emboss", value).commit();
requestUpdateWallpaper();
@@ -138,7 +133,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addMaterialSwitchPreference(this, "msg_engrave", "Engrave фильтр", "Возможна нагрузка на устройство", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_engrave", AndroidUtils.getString("filter_engrave"), AndroidUtils.getString("filter_maybe_lag"), null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_engrave", value).commit();
requestUpdateWallpaper();
@@ -146,7 +141,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addMaterialSwitchPreference(this, "msg_flea", "Flea фильтр", "", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_flea", AndroidUtils.getString("filter_flea"), "", null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_flea", value).commit();
requestUpdateWallpaper();
@@ -154,7 +149,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true;
});
PreferencesUtil.addMaterialSwitchPreference(this, "msg_snow", "Эффект снега", "", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_snow", AndroidUtils.getString("filter_flea"), "", null, false, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("msg_snow", value).commit();
requestUpdateWallpaper();
@@ -223,7 +218,6 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
private void removeStickCache() {
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
prefs2.edit().clear().apply();
deleteCache();
ImEngineProvider.b().a();
}
@@ -5,6 +5,7 @@ import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaperFile;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
@@ -64,6 +65,7 @@ public class WallpaperPreferences extends Preference {
mChatBackground.setImageDrawable(null);
}
@SuppressLint("NotifyDataSetChanged")
void redraw() {
mAdapter.notifyDataSetChanged();
requestBg();
@@ -16,6 +16,8 @@ import android.widget.ImageView;
import java.io.File;
import ru.vtosters.lite.utils.AndroidUtils;
public class WallpapersHooks {
private static File mWallpaperFile;
@@ -91,13 +93,13 @@ public class WallpapersHooks {
String radius = getPreferences().getString("msg_blur_radius", "disabled");
switch (radius) {
case "low":
return "Низкое";
return AndroidUtils.getString("wallpapers_low");
case "med":
return "Среднее";
return AndroidUtils.getString("wallpapers_med");
case "high":
return "Высокое";
return AndroidUtils.getString("wallpapers_high");
default:
return "Отключено";
return AndroidUtils.getString("wallpapers_disabled");
}
}
@@ -105,11 +107,11 @@ public class WallpapersHooks {
String radius = getPreferences().getString("msg_dim", "disabled");
switch (radius) {
case "dim_black":
return "Затемнить";
return AndroidUtils.getString("wallpapers_dim_black");
case "dim_white":
return "Осветлить";
return AndroidUtils.getString("wallpapers_dim_white");
default:
return "Отключено";
return AndroidUtils.getString("wallpapers_disabled");
}
}
@@ -117,13 +119,13 @@ public class WallpapersHooks {
String radius = getPreferences().getString("msg_mosaic", "disabled");
switch (radius) {
case "low":
return "Низкое";
return AndroidUtils.getString("wallpapers_low");
case "med":
return "Среднее";
return AndroidUtils.getString("wallpapers_med");
case "high":
return "Высокое";
return AndroidUtils.getString("wallpapers_high");
default:
return "Отключено";
return AndroidUtils.getString("wallpapers_disabled");
}
}
@@ -22,10 +22,10 @@ public class About {
public static void injectToToolBar(View view) {
view.setOnLongClickListener(v -> {
if (devmenu()) {
sendToast("Меню для разработчиков уже активировано");
sendToast(AndroidUtils.getString("debug_menu_already_activated"));
} else {
edit().putBoolean("devmenu", true).apply();
sendToast("Меню для разработчиков активировано");
sendToast(AndroidUtils.getString("debug_menu_activated"));
}
return true;
});
@@ -63,6 +63,10 @@ public class AndroidUtils {
return 0;
} // Get res id
public static String[] getArray(String resourcename) {
return getResources().getStringArray(getIdentifier(resourcename, "array"));
} // Get array from arrays.xml
public static String getString(String resourcename) {
return getGlobalContext().getString(getIdentifier(resourcename, "string"));
} // Get string via getIdentifier
@@ -7,9 +7,21 @@ import static ru.vtosters.lite.utils.Preferences.getSizeForDelete;
import android.annotation.SuppressLint;
import com.vk.im.engine.ImEngine1;
import com.vk.im.engine.ImEngineExt;
import com.vk.im.ui.providers.audiomsg.ImAudioMsgPlayerProvider;
import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
import com.vk.imageloader.VKImageLoader;
import com.vk.media.player.cache.AutoPlayCacheHolder;
import com.vk.mediastore.MediaStorage;
import com.vk.stickers.Stickers;
import com.vtosters.lite.im.ImEngineProvider;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import b.h.g.m.FileUtils;
public class CacheUtils {
private static CacheUtils sInstance = new CacheUtils();
public long size = 0;
@@ -44,8 +56,14 @@ public class CacheUtils {
size = IOUtils.getDirSize(getGlobalContext().getCacheDir());
if (size >= getSizeForDelete()) {
if (dev()) sendToast("Кеш очищен");
deleteCache();
if (dev()) sendToast(AndroidUtils.getString("cache_cleaned"));
VKImageLoader.e();
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
FileUtils.l();
Stickers.l.c();
ImEngineExt.a(ImEngine1.a());
AutoPlayCacheHolder.d.a();
size = 0;
}
}
@@ -73,7 +73,13 @@ public class DeletedMessagesHandler {
}
private static String getPrefixUndelete() {
return getPrefsValue("undeletemsg_prefix_value") + " ";
var prefs = getPrefsValue("undeletemsg_prefix_value");
if (prefs.isEmpty()) {
return "\uD83D\uDDD1 ";
}
return prefs + " ";
}
public static void updateDialog(MsgDeleteLpTask msgDeleteLpTask) throws NoSuchFieldException, IllegalAccessException {
@@ -103,7 +103,6 @@ public final class FileUriUtils {
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getVolumeIdFromTreeUri(final Uri treeUri) {
final String docId = DocumentsContract.getTreeDocumentId(treeUri);
final String[] split = docId.split(":");
@@ -111,8 +110,6 @@ public final class FileUriUtils {
else return null;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getDocumentPathFromTreeUri(final Uri treeUri) {
final String docId = DocumentsContract.getTreeDocumentId(treeUri);
final String[] split = docId.split(":");
@@ -21,10 +21,12 @@ public class LifecycleUtils {
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityPaused(Activity activity) {
activities.remove(activity);
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityResumed(Activity activity) {
activities.add(activity);
}
@Override // android.app.Application.ActivityLifecycleCallbacks
@@ -70,16 +72,11 @@ public class LifecycleUtils {
public static void restartApplicationWithTimer() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
restartApplication();
}
}, 500);
handler.postDelayed(LifecycleUtils::restartApplication, 500);
}
public static void restartApplicationInto(Class Class) {
Context ctx = AndroidUtils.getGlobalContext();
PackageManager pm = ctx.getPackageManager();
Intent intent = new Navigator(Class).b(ctx);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -28,7 +28,7 @@ public class ProxyUtils {
return getPrefsValue("proxy").equals("zaborona");
}
private static void setProxyRefl() {
public static void setProxyRefl() {
Log.d("Proxy", "Setting proxy...");
try {
var context = getGlobalContext().getApplicationContext();
@@ -75,13 +75,11 @@ public class ProxyUtils {
System.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
System.setProperty("socksProxyPort", "1488");
setProxyRefl();
resetProxySocks();
break;
case "socks":
System.setProperty("socksProxyHost", proxyHostSocks());
System.setProperty("socksProxyPort", proxyPortSocks());
setProxyRefl();
resetProxySocks();
break;
case "http":
System.setProperty("http.proxyHost", proxyHostHTTP());
@@ -89,7 +87,6 @@ public class ProxyUtils {
System.setProperty("http.proxyUser", proxyUserHTTP());
System.setProperty("http.proxyPassword", proxyPassHTTP());
setProxyRefl();
resetProxyHttp();
break;
case "https":
System.setProperty("https.proxyHost", proxyHostHTTPS());
@@ -97,7 +94,6 @@ public class ProxyUtils {
System.setProperty("https.proxyUser", proxyUserHTTPS());
System.setProperty("https.proxyPassword", proxyPassHTTPS());
setProxyRefl();
resetProxyHttps();
break;
default:
resetProxy();
@@ -118,35 +114,6 @@ public class ProxyUtils {
clearProperty("socksPortHost");
} // Reset all proxies
public static void resetProxySocks() {
clearProperty("https.proxyHost");
clearProperty("https.proxyPort");
clearProperty("https.proxyUser");
clearProperty("https.proxyPassword");
clearProperty("http.proxyHost");
clearProperty("http.proxyPort");
clearProperty("http.proxyUser");
clearProperty("http.proxyPassword");
} // Reset all except socks
public static void resetProxyHttp() {
clearProperty("https.proxyHost");
clearProperty("https.proxyPort");
clearProperty("https.proxyUser");
clearProperty("https.proxyPassword");
clearProperty("socksProxyHost");
clearProperty("socksPortHost");
} // Reset all except http
public static void resetProxyHttps() {
clearProperty("http.proxyHost");
clearProperty("http.proxyPort");
clearProperty("http.proxyUser");
clearProperty("http.proxyPassword");
clearProperty("socksProxyHost");
clearProperty("socksPortHost");
} // Reset all except https
private static String proxyHostHTTP() {
var string = getPrefsValue("proxyHostHTTP");
return string.isEmpty() ? "192.168.0.1" : string;
@@ -152,7 +152,7 @@ public class RenameTool {
linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx);
fn.setHint("Имя");
fn.setHint(AndroidUtils.getString("vk_auth_sign_up_first_name"));
fn.setTextColor(getTextAttr());
fn.setHintTextColor(getSTextAttr());
fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -163,7 +163,7 @@ public class RenameTool {
fn.setLayoutParams(margin);
final EditText ln = new EditText(ctx);
ln.setHint("Фамилия");
ln.setHint(AndroidUtils.getString("vk_auth_sign_up_last_name"));
ln.setTextColor(getTextAttr());
ln.setHintTextColor(getSTextAttr());
ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -178,8 +178,8 @@ public class RenameTool {
int id = AccountManagerUtils.getUserID(profile);
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Смена имени");
builder.setMessage("Это локальное изменение, которое будет отображатся только в данном клиенте.");
builder.setTitle(AndroidUtils.getString("rename_title"));
builder.setMessage(AndroidUtils.getString("rename_message"));
builder.setView(linearLayout);
builder.setPositiveButton("OK", (dialog, which) -> {
String firstName = fn.getText().toString();
@@ -197,19 +197,20 @@ public class RenameTool {
}
ctx.sendBroadcast(new Intent("com.vkontakte.android.ACTION_PROFILE_UPDATED").putExtra("uid", id));
sendToast("Пользователь успешно переименован!");
sendToast(AndroidUtils.getString("rename_success"));
} catch (Exception e) {
e.printStackTrace();
sendToast(AndroidUtils.getString("rename_error"));
}
});
if (isChangedName(id)) builder.setNeutralButton("Сбросить", (dialog, which) -> {
if (isChangedName(id)) builder.setNeutralButton(AndroidUtils.getString("rename_reset"), (dialog, which) -> {
getHelper().getWritableDatabase().execSQL(String.format("DELETE FROM %s WHERE %s='%s'", TABLE_NAME, COLUMN_VKID, id));
if (id == AccountManagerUtils.getUserId()) {
ctx.sendBroadcast(new Intent("com.vkontakte.android.USER_NAME_CHANGED"));
}
updateRequested = true;
ctx.sendBroadcast(new Intent("com.vkontakte.android.ACTION_PROFILE_UPDATED").putExtra("uid", id));
sendToast("Пользователь успешно удален из базы данных!");
sendToast(AndroidUtils.getString("rename_remove_from_bd_success"));
});
var alert = builder.create();
@@ -225,7 +226,7 @@ public class RenameTool {
linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx);
fn.setHint("Имя");
fn.setHint(AndroidUtils.getString("vk_auth_sign_up_first_name"));
fn.setHintTextColor(getSTextAttr());
fn.setTextColor(getTextAttr());
fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -244,8 +245,8 @@ public class RenameTool {
final int id = fid;
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Смена имени");
builder.setMessage("Это локальное изменение, которое будет отображатся только в данном клиенте");
builder.setTitle(AndroidUtils.getString("rename_title"));
builder.setMessage(AndroidUtils.getString("rename_message"));
builder.setView(linearLayout);
builder.setPositiveButton("OK", (dialog, which) -> {
String firstName = fn.getText().toString();
@@ -257,15 +258,15 @@ public class RenameTool {
writableDatabase.execSQL(String.format("INSERT INTO %s (%s, %s) VALUES (%s, '%s')", TABLE_NAME_GROUP, COLUMN_VKID, COLUMN_NAME, id, URLEncoder.encode(firstName, "UTF-8")));
}
updateRequested = true;
sendToast("Сообщество успешно переименовано!");
sendToast(AndroidUtils.getString("rename_group_success"));
} catch (Exception e) {
e.printStackTrace();
}
});
if (isChangedNameGroup(id)) builder.setNeutralButton("Сбросить", (dialog, which) -> {
if (isChangedNameGroup(id)) builder.setNeutralButton(AndroidUtils.getString("rename_reset"), (dialog, which) -> {
getHelper().getWritableDatabase().execSQL(String.format("DELETE FROM %s WHERE %s='%s'", TABLE_NAME_GROUP, COLUMN_VKID, id));
updateRequested = true;
sendToast("Сообщество успешно удалено из базы данных!");
sendToast(AndroidUtils.getString("rename_remove_group_from_bd_success"));
});
var alert = builder.create();
@@ -298,7 +298,11 @@ public class ThemesUtils {
if (isColorRefAccented(i) && isAndroidMonet()) {
return getAccentColor();
}
return context.getColor(i);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(i);
} else {
return context.getResources().getColor(i);
}
} // Android Support color injector + accent color checker
public static int getColor2(int i) {
@@ -352,7 +356,7 @@ public class ThemesUtils {
}
public static String hex(int i) {
return String.format("#%06X", Integer.valueOf(i & 16777215));
return String.format("#%06X", i & 16777215);
} // Get color as hex string
public static int getNavigationHeight(int Default) {
+1 -1
View File
@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.1'
classpath 'com.android.tools.build:gradle:7.2.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64.0dip"
android:height="28.0dip"
android:viewportWidth="64.0"
android:viewportHeight="28.0">
<path
android:fillColor="#ff000000"
android:fillType="evenOdd"
android:pathData="M15,4C20.5,4 22,5.5 22,11L22,17C22,22.5 20.5,24 15,24L9,24C3.5,24 2,22.5 2,17L2,11C2,5.5 3.5,4 9,4L15,4ZM51.1696,9L53.6815,15.5083L55.9749,9L58.596,9C57.8825,10.82 57.2345,12.475 56.6521,13.9483C56.4045,14.5839 56.1606,15.205 55.9203,15.8117C55.6801,16.4183 55.4653,16.9708 55.276,17.4692C55.0867,17.9675 54.9265,18.3828 54.7955,18.715C54.6644,19.0472 54.5843,19.2422 54.5552,19.3C54.3076,19.8922 54.0637,20.3942 53.8235,20.8058C53.5832,21.2175 53.3247,21.5533 53.0481,21.8133C52.7714,22.0733 52.4729,22.2611 52.1525,22.3767C51.8322,22.4922 51.4682,22.55 51.0604,22.55C50.9439,22.55 50.8311,22.5464 50.7219,22.5392C50.6127,22.5319 50.5217,22.5211 50.4488,22.5067C50.3469,22.4922 50.2595,22.4706 50.1867,22.4417L50.1867,20.3833C50.7401,20.3833 51.166,20.2606 51.4645,20.015C51.763,19.7694 51.9924,19.4589 52.1525,19.0833L52.371,18.5417L48.5486,9L51.1696,9ZM33.1329,8.9C33.7591,8.9 34.3561,9.0264 34.924,9.2792C35.4919,9.5319 35.9906,9.8858 36.4202,10.3408C36.8498,10.7958 37.192,11.3339 37.4468,11.955C37.7016,12.5761 37.829,13.255 37.829,13.9917C37.829,14.7283 37.7016,15.4072 37.4468,16.0283C37.192,16.6494 36.8498,17.1875 36.4202,17.6425C35.9906,18.0975 35.4919,18.4514 34.924,18.7042C34.3561,18.9569 33.7591,19.0833 33.1329,19.0833C32.7107,19.0833 32.343,19.0328 32.0299,18.9317C31.7168,18.8306 31.4438,18.7222 31.2108,18.6067C30.9487,18.4622 30.7157,18.2961 30.5119,18.1083L30.5119,22.5L28,22.5L28,9L29.8566,9L30.2934,9.9833C30.5119,9.7811 30.7667,9.6006 31.0579,9.4417C31.3055,9.3117 31.604,9.1889 31.9535,9.0733C32.3029,8.9578 32.6961,8.9 33.1329,8.9ZM43.7307,8.9C44.2986,8.9 44.8228,8.9975 45.3033,9.1925C45.7838,9.3875 46.1988,9.6583 46.5483,10.005C46.8978,10.3517 47.1708,10.7633 47.3674,11.24C47.564,11.7167 47.6623,12.2367 47.6623,12.8L47.6623,19L45.8057,19L45.3688,18C45.1358,18.2022 44.881,18.3828 44.6043,18.5417C44.3568,18.6861 44.0583,18.8125 43.7088,18.9208C43.3593,19.0292 42.9662,19.0833 42.5293,19.0833C41.4372,19.0833 40.5999,18.8197 40.0175,18.2925C39.435,17.7653 39.1438,17.09 39.1438,16.2667C39.1438,15.7756 39.2421,15.3242 39.4386,14.9125C39.6352,14.5008 39.9665,14.1469 40.4325,13.8508C40.8984,13.5547 41.5137,13.3236 42.2781,13.1575C43.0426,12.9914 44,12.9083 45.1504,12.9083C45.1504,12.3594 45.0012,11.9333 44.7026,11.63C44.4041,11.3267 44.0073,11.175 43.5122,11.175C43.1773,11.175 42.9116,11.2328 42.715,11.3483C42.5184,11.4639 42.3619,11.5867 42.2454,11.7167C42.1143,11.8756 42.027,12.0478 41.9833,12.25L39.4714,12.25C39.5297,11.7878 39.6643,11.3628 39.8755,10.9583C40.0866,10.5539 40.3742,10.2 40.7383,9.8967C41.1023,9.5933 41.5355,9.3514 42.0379,9.1708C42.5403,8.9903 43.1045,8.9 43.7307,8.9ZM7.398,10L5.9101,10C5.485,10 5.4,10.1982 5.4,10.4168C5.4,10.8071 5.9044,12.7431 7.7486,15.3035C8.9781,17.0521 10.7103,18 12.2866,18C13.2324,18 13.3493,17.7895 13.3493,17.4268L13.3493,16.1053C13.3493,15.6842 13.4389,15.6002 13.7384,15.6002C13.9591,15.6002 14.3374,15.7095 15.2201,16.5525C16.2289,17.5517 16.3953,18 16.9627,18L18.4505,18C18.8756,18 19.0882,17.7895 18.9656,17.374C18.8314,16.9599 18.3497,16.3592 17.7106,15.647C17.3638,15.2411 16.8437,14.804 16.686,14.5853C16.4654,14.3043 16.5284,14.1794 16.686,13.9296L16.7145,13.8897C16.9457,13.5641 18.5128,11.3368 18.6879,10.5417C18.7825,10.2294 18.6879,10 18.238,10L16.7501,10C16.3718,10 16.1974,10.1982 16.1028,10.4168C16.1028,10.4168 15.3462,12.2435 14.2744,13.43C13.9276,13.7735 13.7699,13.8828 13.5808,13.8828C13.4862,13.8828 13.3493,13.7735 13.3493,13.4613L13.3493,10.5417C13.3493,10.167 13.2395,10 12.9243,10L10.5862,10C10.3498,10 10.2076,10.1739 10.2076,10.3387C10.2076,10.694 10.7435,10.7759 10.7988,11.7751L10.7988,13.9453C10.7988,14.4211 10.712,14.5073 10.5229,14.5073C10.0185,14.5073 8.7915,12.6725 8.0639,10.5729C7.9213,10.1648 7.7782,10 7.398,10ZM45.1504,14.6417C44.4078,14.6417 43.8107,14.6742 43.3593,14.7392C42.9079,14.8042 42.5548,14.8981 42.3,15.0208C42.0452,15.1436 41.8741,15.2917 41.7867,15.465C41.6993,15.6383 41.6556,15.8333 41.6556,16.05C41.6556,16.3244 41.7794,16.5736 42.027,16.7975C42.2745,17.0214 42.5876,17.1333 42.9662,17.1333C43.6214,17.1333 44.1493,16.9419 44.5497,16.5592C44.9502,16.1764 45.1504,15.6817 45.1504,15.075L45.1504,14.6417ZM32.8053,11.2833C32.0918,11.2833 31.4948,11.5289 31.0142,12.02C30.5337,12.5111 30.2934,13.1683 30.2934,13.9917C30.2934,14.815 30.5337,15.4722 31.0142,15.9633C31.4948,16.4544 32.0918,16.7 32.8053,16.7C33.5188,16.7 34.1158,16.4544 34.5964,15.9633C35.0769,15.4722 35.3172,14.815 35.3172,13.9917C35.3172,13.1683 35.0769,12.5111 34.5964,12.02C34.1158,11.5289 33.5188,11.2833 32.8053,11.2833Z"
android:strokeWidth="1.0"
android:strokeColor="#00000000" />
</vector>
android:width="69dp"
android:height="24dp"
android:viewportWidth="69"
android:viewportHeight="24">
<path
android:pathData="M39.074,16.032C37.022,16.032 35.604,14.573 35.604,12.499C35.604,10.426 37.022,8.964 39.074,8.964C41.126,8.964 42.504,10.426 42.504,12.499C42.504,14.573 41.107,16.032 39.074,16.032ZM35.604,22.337V16.32C36.102,16.913 36.724,17.389 37.426,17.714C38.128,18.04 38.893,18.207 39.667,18.204C42.821,18.204 45.043,15.804 45.043,12.492C45.043,9.18 42.821,6.778 39.667,6.778C38.868,6.777 38.079,6.956 37.357,7.3C36.636,7.644 36.001,8.146 35.498,8.767L34.992,6.989H33.173V22.33L35.604,22.337Z"
android:fillColor="#000000"/>
<path
android:pathData="M50.928,16.159C49.742,16.159 48.982,15.545 48.982,14.594C48.982,13.747 49.594,13.154 51.456,13.154H53.76C53.76,14.952 52.62,16.159 50.928,16.159ZM51.648,6.785C49.51,6.785 47.626,7.886 47.076,9.79L49.32,10.171C49.527,9.768 49.843,9.432 50.232,9.199C50.621,8.967 51.068,8.849 51.521,8.858C52.853,8.858 53.635,9.818 53.741,11.258H51.372C48.134,11.258 46.526,12.674 46.526,14.707C46.526,16.74 48.113,18.218 50.366,18.218C51.074,18.23 51.772,18.056 52.391,17.715C53.011,17.373 53.531,16.876 53.899,16.272L54.408,18.007H56.206V11.822C56.196,8.626 54.461,6.785 51.648,6.785Z"
android:fillColor="#000000"/>
<path
android:pathData="M63.437,14.933H63.098L59.861,6.996H57.259L62.16,18.593L62.033,18.931C61.714,19.819 61.334,20.117 60.53,20.117H58.464L58.678,22.337H60.358C62.39,22.337 63.49,21.427 64.231,19.375L68.738,6.996H66.252L63.437,14.933Z"
android:fillColor="#000000"/>
<path
android:pathData="M12.819,17.5C7.404,17.5 4.119,13.743 3.99,7.5H6.733C6.818,12.086 8.905,14.029 10.504,14.429V7.5H13.132V11.458C14.675,11.287 16.29,9.487 16.833,7.5H19.419C19.005,9.943 17.247,11.743 16.005,12.486C17.248,13.086 19.248,14.658 20.02,17.5H17.176C16.576,15.6 15.105,14.128 13.133,13.928V17.5H12.819Z"
android:fillColor="#ffffff"
android:fillAlpha="0"/>
<path
android:pathData="M1.687,1.687C0,3.374 0,6.089 0,11.52V12.48C0,17.911 0,20.626 1.687,22.313C3.374,24 6.089,24 11.52,24H12.48C17.911,24 20.626,24 22.313,22.313C24,20.626 24,17.911 24,12.48V11.52C24,6.089 24,3.374 22.313,1.687C20.626,0 17.911,0 12.48,0H11.52C6.089,0 3.374,0 1.687,1.687ZM3.99,7.5C4.119,13.743 7.404,17.5 12.819,17.5H13.133V13.928C15.105,14.128 16.576,15.6 17.176,17.5H20.02C19.248,14.658 17.248,13.086 16.005,12.486C17.247,11.743 19.005,9.943 19.419,7.5H16.833C16.29,9.487 14.675,11.287 13.132,11.458V7.5H10.504V14.429C8.905,14.029 6.818,12.086 6.733,7.5H3.99Z"
android:fillColor="#000000"
android:fillType="evenOdd"/>
</vector>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -7,8 +7,8 @@
<corners
android:bottomLeftRadius="4.0dip"
android:bottomRightRadius="4.0dip"
android:topLeftRadius="@dimen/stiсkers_catalog_large_slider_image_corner_radius"
android:topRightRadius="@dimen/stiсkers_catalog_large_slider_image_corner_radius" />
android:topLeftRadius="@dimen/stickers_catalog_large_slider_image_corner_radius"
android:topRightRadius="@dimen/stickers_catalog_large_slider_image_corner_radius" />
</shape>
</item>
</ripple>
@@ -7,8 +7,8 @@
<corners
android:bottomLeftRadius="4.0dip"
android:bottomRightRadius="4.0dip"
android:topLeftRadius="@dimen/stiсkers_catalog_small_slider_image_corner_radius"
android:topRightRadius="@dimen/stiсkers_catalog_small_slider_image_corner_radius" />
android:topLeftRadius="@dimen/stickers_catalog_small_slider_image_corner_radius"
android:topRightRadius="@dimen/stickers_catalog_small_slider_image_corner_radius" />
</shape>
</item>
</ripple>
@@ -5,9 +5,9 @@
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
<corners
android:bottomLeftRadius="@dimen/stiсkers_catalog_vertical_list_image_corner_radius"
android:bottomLeftRadius="@dimen/stickers_catalog_vertical_list_image_corner_radius"
android:bottomRightRadius="4.0dip"
android:topLeftRadius="@dimen/stiсkers_catalog_vertical_list_image_corner_radius"
android:topLeftRadius="@dimen/stickers_catalog_vertical_list_image_corner_radius"
android:topRightRadius="4.0dip" />
</shape>
</item>
+1 -1
View File
@@ -28,7 +28,7 @@
android:layout_weight="1.0"
android:fontFamily="@string/font_family_regular"
android:singleLine="true"
android:text="Играет 8 Ваших друзей"
android:text="@string/eight_friends"
android:textColor="@color/subhead_gray"
android:textSize="15.0sp" />
@@ -11,10 +11,10 @@
android:layout_height="48.0dip"
app:bcb_anim_duration="100"
app:bcb_cancel_bg_color="?background_content"
app:bcb_cancel_text="Отмена"
app:bcb_cancel_text="@string/cancel"
app:bcb_cancel_text_color="?accent"
app:bcb_divider="@color/black_alpha12"
app:bcb_send_bg_color="?accent"
app:bcb_send_text="Отправить"
app:bcb_send_text="@string/send"
app:bcb_send_text_color="@color/white" />
</FrameLayout>
@@ -23,14 +23,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Принять" />
android:text="@string/group_accept_member" />
<TextView
style="@style/VKUIButton.Primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Принять" />
android:text="@string/group_accept_member" />
</LinearLayout>
<TextView
@@ -52,14 +52,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Отправить" />
android:text="@string/send" />
<TextView
style="@style/VKUIButton.Primary.Rounded"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Отправить" />
android:text="@string/send" />
</LinearLayout>
<TextView
@@ -81,14 +81,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Отклонить" />
android:text="@string/vkim_msg_request_reject" />
<TextView
style="@style/VKUIButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Отклонить" />
android:text="@string/vkim_msg_request_reject" />
</LinearLayout>
<TextView
@@ -110,14 +110,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Убрать" />
android:text="@string/apps_remove_action" />
<TextView
style="@style/VKUIButton.Secondary.Rounded"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Убрать" />
android:text="@string/apps_remove_action" />
</LinearLayout>
<TextView
@@ -139,14 +139,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Запросить" />
android:text="@string/vkim_request_money" />
<TextView
style="@style/VKUIButton.Muted"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Запросить" />
android:text="@string/vkim_request_money" />
</LinearLayout>
<TextView
@@ -168,14 +168,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Удалить" />
android:text="@string/delete" />
<TextView
style="@style/VKUIButton.Muted.Rounded"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Удалить" />
android:text="@string/delete" />
</LinearLayout>
<TextView
@@ -197,14 +197,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Подробнее" />
android:text="@string/accessibility_more" />
<TextView
style="@style/VKUIButton.Tertiary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Подробнее" />
android:text="@string/accessibility_more" />
</LinearLayout>
<TextView
@@ -226,14 +226,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Купить" />
android:text="@string/buy" />
<TextView
style="@style/VKUIButton.Outline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Купить" />
android:text="@string/buy" />
</LinearLayout>
<TextView
@@ -255,14 +255,14 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="9 голосов" />
android:text="@string/nine_votes" />
<TextView
style="@style/VKUIButton.Green"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="9 голосов" />
android:text="@string/nine_votes" />
</LinearLayout>
<TextView
@@ -286,13 +286,13 @@
android:layout_height="wrap_content"
android:layout_marginRight="8.0dip"
android:clickable="true"
android:text="Слушать" />
android:text="@string/music_artist_listen_all_btn" />
<TextView
style="@style/VKUIButton.MediaOverlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Слушать" />
android:text="@string/music_artist_listen_all_btn" />
</LinearLayout>
</LinearLayout>
@@ -12,19 +12,19 @@
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image_bg"
android:layout_width="@dimen/stiсkers_catalog_double_stacked_slider_image_bg_size"
android:layout_height="@dimen/stiсkers_catalog_double_stacked_slider_image_bg_size"
android:layout_width="@dimen/stickers_catalog_double_stacked_slider_image_bg_size"
android:layout_height="@dimen/stickers_catalog_double_stacked_slider_image_bg_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="@dimen/stiсkers_catalog_double_stacked_slider_image_corner_radius"
app:roundedCornerRadius="@dimen/stickers_catalog_double_stacked_slider_image_corner_radius"
app:roundingBorderColor="?image_border"
app:roundingBorderWidth="0.5dip" />
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image"
android:layout_width="@dimen/stiсkers_catalog_double_stacked_slider_image_size"
android:layout_height="@dimen/stiсkers_catalog_double_stacked_slider_image_size"
android:layout_width="@dimen/stickers_catalog_double_stacked_slider_image_size"
android:layout_height="@dimen/stickers_catalog_double_stacked_slider_image_size"
app:layout_constraintBottom_toBottomOf="@id/pack_image_bg"
app:layout_constraintEnd_toEndOf="@id/pack_image_bg"
app:layout_constraintStart_toStartOf="@id/pack_image_bg"
@@ -10,19 +10,19 @@
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image_bg"
android:layout_width="@dimen/stiсkers_catalog_large_slider_image_bg_width"
android:layout_height="@dimen/stiсkers_catalog_large_slider_image_bg_height"
android:layout_width="@dimen/stickers_catalog_large_slider_image_bg_width"
android:layout_height="@dimen/stickers_catalog_large_slider_image_bg_height"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="@dimen/stiсkers_catalog_large_slider_image_corner_radius"
app:roundedCornerRadius="@dimen/stickers_catalog_large_slider_image_corner_radius"
app:roundingBorderColor="?image_border"
app:roundingBorderWidth="0.5dip" />
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image"
android:layout_width="@dimen/stiсkers_catalog_large_slider_image_size"
android:layout_height="@dimen/stiсkers_catalog_large_slider_image_size"
android:layout_width="@dimen/stickers_catalog_large_slider_image_size"
android:layout_height="@dimen/stickers_catalog_large_slider_image_size"
app:layout_constraintBottom_toBottomOf="@id/pack_image_bg"
app:layout_constraintEnd_toEndOf="@id/pack_image_bg"
app:layout_constraintStart_toStartOf="@id/pack_image_bg"
@@ -10,19 +10,19 @@
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image_bg"
android:layout_width="@dimen/stiсkers_catalog_small_slider_image_bg_size"
android:layout_height="@dimen/stiсkers_catalog_small_slider_image_bg_size"
android:layout_width="@dimen/stickers_catalog_small_slider_image_bg_size"
android:layout_height="@dimen/stickers_catalog_small_slider_image_bg_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="@dimen/stiсkers_catalog_small_slider_image_corner_radius"
app:roundedCornerRadius="@dimen/stickers_catalog_small_slider_image_corner_radius"
app:roundingBorderColor="?image_border"
app:roundingBorderWidth="0.5dip" />
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image"
android:layout_width="@dimen/stiсkers_catalog_small_slider_image_size"
android:layout_height="@dimen/stiсkers_catalog_small_slider_image_size"
android:layout_width="@dimen/stickers_catalog_small_slider_image_size"
android:layout_height="@dimen/stickers_catalog_small_slider_image_size"
app:layout_constraintBottom_toBottomOf="@id/pack_image_bg"
app:layout_constraintEnd_toEndOf="@id/pack_image_bg"
app:layout_constraintStart_toStartOf="@id/pack_image_bg"
@@ -13,19 +13,19 @@
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image_bg"
android:layout_width="@dimen/stiсkers_catalog_triple_stacked_slider_image_bg_size"
android:layout_height="@dimen/stiсkers_catalog_triple_stacked_slider_image_bg_size"
android:layout_width="@dimen/stickers_catalog_triple_stacked_slider_image_bg_size"
android:layout_height="@dimen/stickers_catalog_triple_stacked_slider_image_bg_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="@dimen/stiсkers_catalog_triple_stacked_slider_image_corner_radius"
app:roundedCornerRadius="@dimen/stickers_catalog_triple_stacked_slider_image_corner_radius"
app:roundingBorderColor="?image_border"
app:roundingBorderWidth="0.5dip" />
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image"
android:layout_width="@dimen/stiсkers_catalog_triple_stacked_slider_image_size"
android:layout_height="@dimen/stiсkers_catalog_triple_stacked_slider_image_size"
android:layout_width="@dimen/stickers_catalog_triple_stacked_slider_image_size"
android:layout_height="@dimen/stickers_catalog_triple_stacked_slider_image_size"
app:layout_constraintBottom_toBottomOf="@id/pack_image_bg"
app:layout_constraintEnd_toEndOf="@id/pack_image_bg"
app:layout_constraintStart_toStartOf="@id/pack_image_bg"
@@ -12,19 +12,19 @@
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image_bg"
android:layout_width="@dimen/stiсkers_catalog_double_stacked_slider_image_bg_size"
android:layout_height="@dimen/stiсkers_catalog_double_stacked_slider_image_bg_size"
android:layout_width="@dimen/stickers_catalog_double_stacked_slider_image_bg_size"
android:layout_height="@dimen/stickers_catalog_double_stacked_slider_image_bg_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="@dimen/stiсkers_catalog_double_stacked_slider_image_corner_radius"
app:roundedCornerRadius="@dimen/stickers_catalog_double_stacked_slider_image_corner_radius"
app:roundingBorderColor="?image_border"
app:roundingBorderWidth="0.5dip" />
<com.vk.imageloader.view.VKImageView
android:id="@id/pack_image"
android:layout_width="@dimen/stiсkers_catalog_double_stacked_slider_image_size"
android:layout_height="@dimen/stiсkers_catalog_double_stacked_slider_image_size"
android:layout_width="@dimen/stickers_catalog_double_stacked_slider_image_size"
android:layout_height="@dimen/stickers_catalog_double_stacked_slider_image_size"
app:layout_constraintBottom_toBottomOf="@id/pack_image_bg"
app:layout_constraintEnd_toEndOf="@id/pack_image_bg"
app:layout_constraintStart_toStartOf="@id/pack_image_bg"
+1 -1
View File
@@ -17,7 +17,7 @@
android:drawablePadding="20.0dip"
android:drawableTint="?accent"
android:gravity="center"
android:text="Добавить объект"
android:text="@string/add_object"
android:textColor="?accent"
android:textSize="15.0dip" />
</FrameLayout>
+1 -1
View File
@@ -12,7 +12,7 @@
android:layout_marginRight="32.0dip"
android:layout_marginBottom="16.0dip"
android:gravity="center"
android:text="Вы можете добавлять объекты, которыми вы сможете поделиться во время трансляции"
android:text="@string/collection_item_hint_text"
android:textColor="?content_placeholder_text"
android:textSize="15.0dip" />
</FrameLayout>
+1 -1
View File
@@ -35,5 +35,5 @@
android:layout_gravity="center_horizontal"
android:layout_marginTop="24.0dip"
android:clickable="true"
android:text="Отправить" />
android:text="@string/send" />
</LinearLayout>
@@ -10,7 +10,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8.0dip"
android:text="Имя" />
android:text="@string/vk_auth_sign_up_first_name" />
<EditText
android:id="@id/edit_text_1"
@@ -9,5 +9,5 @@
android:layout_width="fill_parent"
android:layout_height="64.0dip"
android:layout_margin="16.0dip"
android:text="Места нет в списке" />
android:text="@string/item_no_place_in_result_text" />
</FrameLayout>
+1 -1
View File
@@ -57,7 +57,7 @@
android:gravity="center|left"
android:paddingLeft="20.0dip"
android:paddingRight="20.0dip"
android:text="Смореть пост"
android:text="@string/watch_post_text"
android:textColor="@color/gray_800"
android:textSize="15.0dip"
android:visibility="gone" />
@@ -46,7 +46,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16.0dip"
android:text="для загрузки из сети"
android:text="@string/for_loading_from_network"
app:layout_constraintStart_toEndOf="@id/pb_auto_animation"
app:layout_constraintTop_toTopOf="@id/pb_auto_animation" />
</androidx.constraintlayout.widget.ConstraintLayout>

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