Compare commits
133
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c60b766f37 | ||
|
|
da9ded2ae1 | ||
|
|
29eb517bb9 | ||
|
|
84a3f6caff | ||
|
|
b34821463a | ||
|
|
127abbaaeb | ||
|
|
d462d42775 | ||
|
|
5e80ad7e4e | ||
|
|
e1aadade5f | ||
|
|
77d6f5d977 | ||
|
|
c4ae2ec0a3 | ||
|
|
07ee9269b7 | ||
|
|
3ee43f1c50 | ||
|
|
dd65196af9 | ||
|
|
5547de006b | ||
|
|
0fbf571c60 | ||
|
|
f5f05697b6 | ||
|
|
5f179f6a26 | ||
|
|
37c6d29e84 | ||
|
|
0e81ba31cb | ||
|
|
1f24d32109 | ||
|
|
ff16f84c43 | ||
|
|
5b929bf515 | ||
|
|
bdcb3db238 | ||
|
|
f7960b1695 | ||
|
|
825d1b95da | ||
|
|
0e7abaf3f0 | ||
|
|
2731989ae8 | ||
|
|
5ad09e11df | ||
|
|
653d2eeeee | ||
|
|
756ad615ed | ||
|
|
dd6abafad5 | ||
|
|
0434f06bb5 | ||
|
|
50971098ad | ||
|
|
1787f10fca | ||
|
|
6d2684db70 | ||
|
|
f0f1b3a946 | ||
|
|
ae9b703726 | ||
|
|
10512fb74b | ||
|
|
ce9bdba30c | ||
|
|
188c98589c | ||
|
|
e5fa42ff14 | ||
|
|
f42aa95003 | ||
|
|
b16dc816b6 | ||
|
|
b86fe4d65d | ||
|
|
d7e17416f1 | ||
|
|
91355f1dd5 | ||
|
|
ae9e3ed07c | ||
|
|
f701993b0f | ||
|
|
c5bf617f65 | ||
|
|
f09cae1684 | ||
|
|
99d7f06981 | ||
|
|
eaaf7e2bbf | ||
|
|
897382de2b | ||
|
|
55d02a8412 | ||
|
|
7733582238 | ||
|
|
754c8339df | ||
|
|
ebf7baaa65 | ||
|
|
8b26b12813 | ||
|
|
5deb4186f9 | ||
|
|
d3d501f94a | ||
|
|
634f1213d4 | ||
|
|
6fa97ee435 | ||
|
|
05b3342763 | ||
|
|
d434f42d12 | ||
|
|
084f13eda4 | ||
|
|
ed59b54618 | ||
|
|
df282b95ad | ||
|
|
1b38533c83 | ||
|
|
8f4c370ab2 | ||
|
|
9360ea4d85 | ||
|
|
c87d6581c8 | ||
|
|
7133fc6c03 | ||
|
|
46af5af250 | ||
|
|
5b9cc6778c | ||
|
|
5260ad8243 | ||
|
|
2996772020 | ||
|
|
d37534cb6b | ||
|
|
92eb48c21e | ||
|
|
d9e867cb6e | ||
|
|
f200c6e59a | ||
|
|
c668f3bf9a | ||
|
|
bd7afee09b | ||
|
|
ff09a4aec0 | ||
|
|
1e6c60f2ed | ||
|
|
beedb1538d | ||
|
|
8463f9e963 | ||
|
|
ce8f88b8d4 | ||
|
|
ff7d080b5a | ||
|
|
12ad83c607 | ||
|
|
cdf5d2c37c | ||
|
|
9af8e1729e | ||
|
|
d5219ed322 | ||
|
|
7af9a72e77 | ||
|
|
08817bde7e | ||
|
|
d1e9aadd71 | ||
|
|
b6307182cd | ||
|
|
cc70e55b53 | ||
|
|
ed08e97a50 | ||
|
|
44904786d9 | ||
|
|
12b67ce189 | ||
|
|
21b0edf092 | ||
|
|
2adb446d80 | ||
|
|
60738458bb | ||
|
|
a591026258 | ||
|
|
1bab7fa17c | ||
|
|
2713216728 | ||
|
|
f9a529275a | ||
|
|
e992203b7c | ||
|
|
0ed057d705 | ||
|
|
9b70ca6faf | ||
|
|
422c3e4a6c | ||
|
|
6dac880d61 | ||
|
|
c911b2d64e | ||
|
|
39f72f9058 | ||
|
|
2bff354ad0 | ||
|
|
cb55e9b96f | ||
|
|
33f551d464 | ||
|
|
282fa7bdda | ||
|
|
0abd97e8e1 | ||
|
|
5dd616685d | ||
|
|
aff99be92d | ||
|
|
c255f1e498 | ||
|
|
70342daf07 | ||
|
|
f95672e57d | ||
|
|
8f5da42df4 | ||
|
|
4022903069 | ||
|
|
4600c185e4 | ||
|
|
30e8ec0038 | ||
|
|
367b212ca3 | ||
|
|
6533feb62b | ||
|
|
95ef37f6a3 | ||
|
|
6216c66d95 |
@@ -4,7 +4,10 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- reopened
|
||||||
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
|||||||
@@ -25,3 +25,4 @@ smali/assets/version.properties
|
|||||||
app/src/main/assets/version.properties
|
app/src/main/assets/version.properties
|
||||||
smali/build/resources.zip
|
smali/build/resources.zip
|
||||||
*.idsig
|
*.idsig
|
||||||
|
/smali/VTLite.apk.cache/
|
||||||
|
|||||||
@@ -8,14 +8,18 @@ VTosters Lite - это модифицированный клиент (деком
|
|||||||
|
|
||||||
Стабильные сборки находятся в [Releases](https://github.com/vtosters/lite/releases)
|
Стабильные сборки находятся в [Releases](https://github.com/vtosters/lite/releases)
|
||||||
|
|
||||||
## Откладка
|
Зеркало на нашем [Git](https://git.maki.su/gdlbo/lite)
|
||||||
|
|
||||||
Для откладки с помощью Android Studio необходимо пройти в `/smali/AndroidManifest.xml`
|
Зеркало на [Github](https://github.com/vtosters/lite)
|
||||||
|
|
||||||
|
## Отладка приложения
|
||||||
|
|
||||||
|
Для отладки с помощью Android Studio необходимо пройти в `/smali/AndroidManifest.xml`
|
||||||
```
|
```
|
||||||
android:debuggable="false" -> android:debuggable="true"
|
android:debuggable="false" -> android:debuggable="true"
|
||||||
```
|
```
|
||||||
|
|
||||||
Для дополнительной откладки ответов, доп логов и подмены данных для дебаг приложения необходимо включить **Режим разработчика**
|
Для дополнительной отладки ответов, доп логов и подмены данных для дебаг приложения необходимо включить **Режим разработчика**
|
||||||
```
|
```
|
||||||
Настройки -> Для разработчиков -> Режим разработчика
|
Настройки -> Для разработчиков -> Режим разработчика
|
||||||
```
|
```
|
||||||
@@ -92,4 +96,4 @@ android:debuggable="false" -> android:debuggable="true"
|
|||||||
build.bat
|
build.bat
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
+3
-2
@@ -86,12 +86,13 @@ android {
|
|||||||
sourceCompatibility JavaVersion.VERSION_11
|
sourceCompatibility JavaVersion.VERSION_11
|
||||||
targetCompatibility JavaVersion.VERSION_11
|
targetCompatibility JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
|
namespace 'ru.vtosters.lite'
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "androidx.multidex:multidex:2.0.1"
|
implementation "androidx.multidex:multidex:2.0.1"
|
||||||
implementation 'com.google.android.material:material:1.5.0'
|
implementation 'com.google.android.material:material:1.6.1'
|
||||||
implementation 'androidx.exifinterface:exifinterface:1.3.3'
|
implementation 'androidx.exifinterface:exifinterface:1.3.3'
|
||||||
implementation 'androidx.preference:preference:1.1.1'
|
implementation 'androidx.preference:preference:1.2.0'
|
||||||
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
|
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
package="ru.vtosters.lite">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package bruhcollective.itaysonlab.libvkx.client;
|
package bruhcollective.itaysonlab.libvkx.client;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanFalse;
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
@@ -36,7 +36,7 @@ public class LibVKXClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isIntegrationEnabled() {
|
public static boolean isIntegrationEnabled() {
|
||||||
return BooleanFalse("libvkx_integration") && isVkxInstalled();
|
return getBoolValue("libvkx_integration", false) && isVkxInstalled();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean play(MusicTrack musicTrack, List<MusicTrack> list, PlayerRefer playerRefer) {
|
public static boolean play(MusicTrack musicTrack, List<MusicTrack> list, PlayerRefer playerRefer) {
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import ru.f0x1d.net.NetCall;
|
import ru.vtosters.lite.net.NetCall;
|
||||||
import ru.f0x1d.net.NetCallback;
|
import ru.vtosters.lite.net.NetCallback;
|
||||||
import ru.f0x1d.net.NetClient;
|
import ru.vtosters.lite.net.NetClient;
|
||||||
import ru.f0x1d.net.NetRequest;
|
import ru.vtosters.lite.net.NetRequest;
|
||||||
import ru.f0x1d.net.NetResponse;
|
import ru.vtosters.lite.net.NetResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Aefyr on 11.05.2018.
|
* Created by Aefyr on 11.05.2018.
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.vk.core.ui.themes;
|
||||||
|
|
||||||
|
import com.vk.s.R;
|
||||||
|
import ru.vtosters.lite.utils.Themes;
|
||||||
|
|
||||||
|
public enum VKTheme {
|
||||||
|
DEFAULT_LIGHT(0, R.g.BaseStyle),
|
||||||
|
DARK(1, R.g.BaseDarkStyle),
|
||||||
|
AMOLED(2, Themes.getAmoledTheme());
|
||||||
|
|
||||||
|
private final long id;
|
||||||
|
private final int themeResId;
|
||||||
|
|
||||||
|
VKTheme(long j, int i) {
|
||||||
|
this.id = j;
|
||||||
|
this.themeResId = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final long a() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int b() {
|
||||||
|
return this.themeResId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.vk.im.ui.themes;
|
||||||
|
|
||||||
|
import static com.vk.im.ui.R.m.VkIm_Theme_VkApp_Dark;
|
||||||
|
import static com.vk.im.ui.R.m.VkIm_Theme_VkApp_Light;
|
||||||
|
import static com.vk.im.ui.R.m.VkIm_Theme_VkMe_Dark;
|
||||||
|
import static com.vk.im.ui.R.m.VkIm_Theme_VkMe_Light;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.utils.Themes;
|
||||||
|
|
||||||
|
public enum ImTheme {
|
||||||
|
VKAPP_LIGHT(0, VkIm_Theme_VkApp_Light),
|
||||||
|
VKAPP_DARK(3, VkIm_Theme_VkApp_Dark),
|
||||||
|
VKME_LIGHT(1, VkIm_Theme_VkMe_Light),
|
||||||
|
VKME_DARK(2, VkIm_Theme_VkMe_Dark),
|
||||||
|
VKME_AMOLED(5, Themes.getAmoledMeTheme()),
|
||||||
|
VKAPP_AMOLED(4, Themes.getAmoledImTheme());
|
||||||
|
|
||||||
|
private final int id;
|
||||||
|
private final int themeResId;
|
||||||
|
|
||||||
|
ImTheme(int i, int i2) {
|
||||||
|
this.id = i;
|
||||||
|
this.themeResId = i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int a() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int b() {
|
||||||
|
return this.themeResId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -164,8 +164,18 @@ public final class R {
|
|||||||
public static final int start_values = 0x7f03005c;
|
public static final int start_values = 0x7f03005c;
|
||||||
public static final int proxy = 0x7f03005d;
|
public static final int proxy = 0x7f03005d;
|
||||||
public static final int proxy_value = 0x7f03005e;
|
public static final int proxy_value = 0x7f03005e;
|
||||||
public static final int msgcount = 0x7f03005f;
|
public static final int commentssort = 0x7f03005f;
|
||||||
public static final int msgcount_value = 0x7f030060;
|
public static final int commentssort_value = 0x7f030060;
|
||||||
|
public static final int darktheme = 0x7f030061;
|
||||||
|
public static final int darktheme_value = 0x7f030062;
|
||||||
|
public static final int lighttheme = 0x7f030063;
|
||||||
|
public static final int lighttheme_value = 0x7f030064;
|
||||||
|
public static final int msgcount = 0x7f030065;
|
||||||
|
public static final int msgcount_value = 0x7f030066;
|
||||||
|
public static final int newsupdate = 0x7f030067;
|
||||||
|
public static final int newsupdate_value = 0x7f030068;
|
||||||
|
public static final int undel = 0x7f030069;
|
||||||
|
public static final int undel_value = 0x7f03006a;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class attr {
|
public static final class attr {
|
||||||
@@ -2397,6 +2407,7 @@ public final class R {
|
|||||||
public static final int window_bg_transparent = 0x7f06028b;
|
public static final int window_bg_transparent = 0x7f06028b;
|
||||||
public static final int yellow = 0x7f06028c;
|
public static final int yellow = 0x7f06028c;
|
||||||
public static final int yellow_light = 0x7f06028d;
|
public static final int yellow_light = 0x7f06028d;
|
||||||
|
public static final int iclauncher = 0x7f06028e;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class dimen {
|
public static final class dimen {
|
||||||
@@ -14466,8 +14477,8 @@ public final class R {
|
|||||||
public static final int copytokenbtn = 0x7f111029;
|
public static final int copytokenbtn = 0x7f111029;
|
||||||
public static final int killappbtn = 0x7f11102a;
|
public static final int killappbtn = 0x7f11102a;
|
||||||
public static final int experts = 0x7f11102b;
|
public static final int experts = 0x7f11102b;
|
||||||
public static final int DNT_OFF = 0x7f11102c;
|
public static final int DNT_OFF_res_0x7f11102c = 0x7f11102c;
|
||||||
public static final int DNT_ON = 0x7f11102d;
|
public static final int DNT_ON_res_0x7f11102d = 0x7f11102d;
|
||||||
public static final int accounts = 0x7f11102e;
|
public static final int accounts = 0x7f11102e;
|
||||||
public static final int act_bot = 0x7f11102f;
|
public static final int act_bot = 0x7f11102f;
|
||||||
public static final int act_cnv = 0x7f111030;
|
public static final int act_cnv = 0x7f111030;
|
||||||
@@ -14988,6 +14999,144 @@ public final class R {
|
|||||||
public static final int vtlota = 0x7f111233;
|
public static final int vtlota = 0x7f111233;
|
||||||
public static final int DNR_ON = 0x7f111234;
|
public static final int DNR_ON = 0x7f111234;
|
||||||
public static final int DNR_OFF = 0x7f111235;
|
public static final int DNR_OFF = 0x7f111235;
|
||||||
|
public static final int DNT_ON_res_0x7f111236 = 0x7f111236;
|
||||||
|
public static final int DNT_OFF_res_0x7f111237 = 0x7f111237;
|
||||||
|
public static final int other_clear_stickers_cache_summary = 0x7f111238;
|
||||||
|
public static final int dockbar_editor = 0x7f111239;
|
||||||
|
public static final int dockbar_reset = 0x7f11123a;
|
||||||
|
public static final int dockbar_save = 0x7f11123b;
|
||||||
|
public static final int dockbar_selected_items = 0x7f11123c;
|
||||||
|
public static final int dockbar_unselected_items = 0x7f11123d;
|
||||||
|
public static final int download_latest_vtl = 0x7f11123e;
|
||||||
|
public static final int other_fix_dynamic_colors = 0x7f11123f;
|
||||||
|
public static final int other_reset_settings = 0x7f111240;
|
||||||
|
public static final int other_reset_settings_summary = 0x7f111241;
|
||||||
|
public static final int other_fix_app = 0x7f111242;
|
||||||
|
public static final int activity_dnr_summary = 0x7f111243;
|
||||||
|
public static final int activity_dnr_visual = 0x7f111244;
|
||||||
|
public static final int activity_dnr_warn = 0x7f111245;
|
||||||
|
public static final int activity_dns_summary = 0x7f111246;
|
||||||
|
public static final int activity_dnw_summary = 0x7f111247;
|
||||||
|
public static final int activity_undel = 0x7f111248;
|
||||||
|
public static final int activity_undel_attachments = 0x7f111249;
|
||||||
|
public static final int activity_undel_dial = 0x7f11124a;
|
||||||
|
public static final int activity_undel_enable = 0x7f11124b;
|
||||||
|
public static final int activity_undel_tag = 0x7f11124c;
|
||||||
|
public static final int activity_what_is_it = 0x7f11124d;
|
||||||
|
public static final int appearance_other_color_navbar_summary = 0x7f11124e;
|
||||||
|
public static final int appearance_other_color_webview_summary = 0x7f11124f;
|
||||||
|
public static final int appearance_theme_dark_theme = 0x7f111250;
|
||||||
|
public static final int appearance_theme_dialog_title = 0x7f111251;
|
||||||
|
public static final int appearance_theme_info = 0x7f111252;
|
||||||
|
public static final int appearance_theme_info_summary = 0x7f111253;
|
||||||
|
public static final int appearance_theme_light_theme = 0x7f111254;
|
||||||
|
public static final int appearance_theme_use_system = 0x7f111255;
|
||||||
|
public static final int appearance_theme_use_system_summary = 0x7f111256;
|
||||||
|
public static final int debug_cache = 0x7f111257;
|
||||||
|
public static final int debug_cache_trusted_hash = 0x7f111258;
|
||||||
|
public static final int debug_cache_video = 0x7f111259;
|
||||||
|
public static final int debug_cache_webview = 0x7f11125a;
|
||||||
|
public static final int debug_developer_dark_mode = 0x7f11125b;
|
||||||
|
public static final int debug_developer_force_ssl = 0x7f11125c;
|
||||||
|
public static final int debug_developer_force_ssl_summary = 0x7f11125d;
|
||||||
|
public static final int debug_developer_functions = 0x7f11125e;
|
||||||
|
public static final int debug_developer_has_music_subscription = 0x7f11125f;
|
||||||
|
public static final int debug_developer_has_music_subscription_summary = 0x7f111260;
|
||||||
|
public static final int debug_developer_is_music_restricted = 0x7f111261;
|
||||||
|
public static final int debug_developer_is_music_restricted_summary = 0x7f111262;
|
||||||
|
public static final int debug_developer_mode = 0x7f111263;
|
||||||
|
public static final int debug_developer_mode_summary = 0x7f111264;
|
||||||
|
public static final int debug_developer_old_about = 0x7f111265;
|
||||||
|
public static final int debug_developer_ssfs_custom = 0x7f111266;
|
||||||
|
public static final int debug_domains = 0x7f111267;
|
||||||
|
public static final int debug_domains_api = 0x7f111268;
|
||||||
|
public static final int debug_domains_awayphp = 0x7f111269;
|
||||||
|
public static final int debug_domains_editing = 0x7f11126a;
|
||||||
|
public static final int debug_domains_editing_summary = 0x7f11126b;
|
||||||
|
public static final int debug_domains_oauth = 0x7f11126c;
|
||||||
|
public static final int debug_domains_vkui_host = 0x7f11126d;
|
||||||
|
public static final int debug_domains_vkui_spa = 0x7f11126e;
|
||||||
|
public static final int debug_experimental = 0x7f11126f;
|
||||||
|
public static final int debug_experimental_language = 0x7f111270;
|
||||||
|
public static final int debug_experimental_language_summary = 0x7f111271;
|
||||||
|
public static final int debug_experimental_libverify = 0x7f111272;
|
||||||
|
public static final int debug_experimental_libverify_summary = 0x7f111273;
|
||||||
|
public static final int debug_experimental_opusmodule = 0x7f111274;
|
||||||
|
public static final int debug_experimental_page_stats = 0x7f111275;
|
||||||
|
public static final int debug_experimental_page_stats_summary = 0x7f111276;
|
||||||
|
public static final int debug_experimental_usevkui = 0x7f111277;
|
||||||
|
public static final int debug_experimental_vk_me_mode = 0x7f111278;
|
||||||
|
public static final int debug_experimental_vk_sans_font = 0x7f111279;
|
||||||
|
public static final int debug_logging = 0x7f11127a;
|
||||||
|
public static final int debug_logging_api = 0x7f11127b;
|
||||||
|
public static final int debug_logging_api_errors = 0x7f11127c;
|
||||||
|
public static final int debug_logging_api_errors_summary = 0x7f11127d;
|
||||||
|
public static final int debug_logging_api_summary = 0x7f11127e;
|
||||||
|
public static final int debug_logging_apply_spaces = 0x7f11127f;
|
||||||
|
public static final int debug_logging_apply_spaces_summary = 0x7f111280;
|
||||||
|
public static final int debug_logging_breakpoints = 0x7f111281;
|
||||||
|
public static final int debug_logging_breakpoints_summary = 0x7f111282;
|
||||||
|
public static final int debug_logging_file = 0x7f111283;
|
||||||
|
public static final int debug_logging_file_summary = 0x7f111284;
|
||||||
|
public static final int debug_logging_force_stats_sending = 0x7f111285;
|
||||||
|
public static final int debug_logging_memleak = 0x7f111286;
|
||||||
|
public static final int debug_logging_visualise_viewposttime = 0x7f111287;
|
||||||
|
public static final int debug_logging_visualise_viewposttime_summary = 0x7f111288;
|
||||||
|
public static final int debug_logging_webview = 0x7f111289;
|
||||||
|
public static final int debug_other = 0x7f11128a;
|
||||||
|
public static final int debug_proxy = 0x7f11128b;
|
||||||
|
public static final int debug_proxy_enable = 0x7f11128c;
|
||||||
|
public static final int debug_proxy_enable_summary = 0x7f11128d;
|
||||||
|
public static final int debug_proxy_force = 0x7f11128e;
|
||||||
|
public static final int debug_proxy_force_summary = 0x7f11128f;
|
||||||
|
public static final int debug_show_settings_item = 0x7f111290;
|
||||||
|
public static final int debug_system = 0x7f111291;
|
||||||
|
public static final int debug_system_fcm = 0x7f111292;
|
||||||
|
public static final int debug_system_fcm_copy_token = 0x7f111293;
|
||||||
|
public static final int debug_system_google_now = 0x7f111294;
|
||||||
|
public static final int debug_system_language = 0x7f111295;
|
||||||
|
public static final int debug_system_terminate = 0x7f111296;
|
||||||
|
public static final int debug_tests = 0x7f111297;
|
||||||
|
public static final int debug_tests_ads = 0x7f111298;
|
||||||
|
public static final int debug_tests_bd = 0x7f111299;
|
||||||
|
public static final int debug_tests_captcha = 0x7f11129a;
|
||||||
|
public static final int debug_tests_crash = 0x7f11129b;
|
||||||
|
public static final int debug_tests_pretty_cards = 0x7f11129c;
|
||||||
|
public static final int debug_tests_spa = 0x7f11129d;
|
||||||
|
public static final int debug_tests_spa_uri = 0x7f11129e;
|
||||||
|
public static final int debug_tests_validation = 0x7f11129f;
|
||||||
|
public static final int debug_warning = 0x7f1112a0;
|
||||||
|
public static final int debug_warning_summary = 0x7f1112a1;
|
||||||
|
public static final int feed_ads_carousel_summary = 0x7f1112a2;
|
||||||
|
public static final int feed_ads_regular_summary = 0x7f1112a3;
|
||||||
|
public static final int feed_ads_sources = 0x7f1112a4;
|
||||||
|
public static final int feed_ads_sources_summary = 0x7f1112a5;
|
||||||
|
public static final int feed_ads_stories_summary = 0x7f1112a6;
|
||||||
|
public static final int feed_other_cache_summary = 0x7f1112a7;
|
||||||
|
public static final int feed_other_sort_comments = 0x7f1112a8;
|
||||||
|
public static final int feed_other_sort_comments_summary = 0x7f1112a9;
|
||||||
|
public static final int feed_other_update = 0x7f1112aa;
|
||||||
|
public static final int feed_other_update_dialog_title = 0x7f1112ab;
|
||||||
|
public static final int feed_recommendations_authors_summary = 0x7f1112ac;
|
||||||
|
public static final int feed_recommendations_friends_reacted_summary = 0x7f1112ad;
|
||||||
|
public static final int feed_recommendations_friends_summary = 0x7f1112ae;
|
||||||
|
public static final int interface_global_old_icons = 0x7f1112af;
|
||||||
|
public static final int interface_global_old_icons_summary = 0x7f1112b0;
|
||||||
|
public static final int messages_interface_calls_summary = 0x7f1112b1;
|
||||||
|
public static final int messages_interface_tails_summary = 0x7f1112b2;
|
||||||
|
public static final int messages_other_choose_count = 0x7f1112b3;
|
||||||
|
public static final int messages_other_download_first = 0x7f1112b4;
|
||||||
|
public static final int proxy_if = 0x7f1112b5;
|
||||||
|
public static final int proxy_login_title = 0x7f1112b6;
|
||||||
|
public static final int proxy_password_title = 0x7f1112b7;
|
||||||
|
public static final int vkx_download = 0x7f1112b8;
|
||||||
|
public static final int vk_fix_music = 0x7f1112b9;
|
||||||
|
public static final int vk_fix_music_summary = 0x7f1112ba;
|
||||||
|
public static final int vkx_integration = 0x7f1112bb;
|
||||||
|
public static final int vk_fix_music_other = 0x7f1112bc;
|
||||||
|
public static final int vkx_title = 0x7f1112bd;
|
||||||
|
public static final int vkx_why = 0x7f1112be;
|
||||||
|
public static final int vkx_why_summary = 0x7f1112bf;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class style {
|
public static final class style {
|
||||||
@@ -15929,9 +16078,11 @@ public final class R {
|
|||||||
public static final int MD_Button_Borderless = 0x7f1203a7;
|
public static final int MD_Button_Borderless = 0x7f1203a7;
|
||||||
public static final int MD_Button_Borderless_Dialog = 0x7f1203a8;
|
public static final int MD_Button_Borderless_Dialog = 0x7f1203a8;
|
||||||
public static final int MaterialDialogTheme_Dark = 0x7f1203a9;
|
public static final int MaterialDialogTheme_Dark = 0x7f1203a9;
|
||||||
public static final int BaseAmoledStyle = 0x7f1203aa;
|
public static final int ActionBarThemeFix = 0x7f1203aa;
|
||||||
public static final int BaseAmoledTheme = 0x7f1203ab;
|
public static final int BaseAmoledStyle = 0x7f1203ab;
|
||||||
public static final int Vk_Theme_client_amoled_generated = 0x7f1203ac;
|
public static final int BaseAmoledTheme = 0x7f1203ac;
|
||||||
|
public static final int Vk_Theme_client_amoled_generated = 0x7f1203ad;
|
||||||
|
public static final int VkIm_Theme_VkApp_Amoled = 0x7f1203ae;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class xml {
|
public static final class xml {
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
package ru.f0x1d.net;
|
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getUserToken;
|
|
||||||
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
|
|
||||||
import com.vk.core.network.Network;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
public class F0x1dRequest {
|
|
||||||
|
|
||||||
public static void makeRequest(byte[] bArr, F0x1dRequestCallback f0x1dRequestCallback) {
|
|
||||||
new MakeRequestTask(bArr, f0x1dRequestCallback).execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void makeRequest(String str, F0x1dRequestCallback f0x1dRequestCallback) {
|
|
||||||
new MakeRequestTask(str.getBytes(), f0x1dRequestCallback).execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void makeRequestToaster(String str, F0x1dRequestCallback f0x1dRequestCallback, boolean z) {
|
|
||||||
new MakeRequestTask(str.getBytes(), f0x1dRequestCallback, true, !z).execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface F0x1dRequestCallback {
|
|
||||||
void onResponse(String str);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class MakeRequestTask extends AsyncTask<Void, Void, String> {
|
|
||||||
private final F0x1dRequestCallback callback;
|
|
||||||
private boolean mIsPut;
|
|
||||||
private boolean mIsVkToasterRequest;
|
|
||||||
private final byte[] url;
|
|
||||||
|
|
||||||
public MakeRequestTask(byte[] bArr, F0x1dRequestCallback f0x1dRequestCallback) {
|
|
||||||
this.mIsVkToasterRequest = false;
|
|
||||||
this.mIsPut = false;
|
|
||||||
this.callback = f0x1dRequestCallback;
|
|
||||||
this.url = bArr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MakeRequestTask(byte[] bArr, F0x1dRequestCallback f0x1dRequestCallback, boolean z, boolean z2) {
|
|
||||||
this.mIsVkToasterRequest = false;
|
|
||||||
this.mIsPut = false;
|
|
||||||
this.callback = f0x1dRequestCallback;
|
|
||||||
this.url = bArr;
|
|
||||||
this.mIsVkToasterRequest = z;
|
|
||||||
this.mIsPut = z2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String doInBackground(Void... voidArr) {
|
|
||||||
try {
|
|
||||||
HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(new String(this.url)).openConnection();
|
|
||||||
httpURLConnection.setRequestMethod(this.mIsPut ? "PUT" : "GET");
|
|
||||||
if (this.mIsVkToasterRequest) {
|
|
||||||
httpURLConnection.setRequestProperty("Token", getUserToken());
|
|
||||||
}
|
|
||||||
if (!this.mIsVkToasterRequest) {
|
|
||||||
httpURLConnection.setRequestProperty("User-Agent", Network.a.a().a());
|
|
||||||
}
|
|
||||||
httpURLConnection.setRequestProperty("Content-Type", this.mIsVkToasterRequest ? "Content-Type" : "application/x-www-form-urlencoded");
|
|
||||||
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
|
|
||||||
StringBuffer stringBuffer = new StringBuffer();
|
|
||||||
while (true) {
|
|
||||||
String readLine = bufferedReader.readLine();
|
|
||||||
if (readLine != null) {
|
|
||||||
stringBuffer.append(readLine);
|
|
||||||
} else {
|
|
||||||
bufferedReader.close();
|
|
||||||
return stringBuffer.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
return e.getLocalizedMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPostExecute(String str) {
|
|
||||||
super.onPostExecute(str);
|
|
||||||
this.callback.onResponse(str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
package ru.vtosters.lite.audio.gcm;
|
package ru.vtosters.lite.audio.gcm;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.VKVersion;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.VKVersionBuild;
|
||||||
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
|
||||||
@@ -108,7 +111,7 @@ public class GCMFix {
|
|||||||
params.add("X-X-subscription=841415684880");
|
params.add("X-X-subscription=841415684880");
|
||||||
}
|
}
|
||||||
params.add("X-X-subtype=841415684880");
|
params.add("X-X-subtype=841415684880");
|
||||||
params.add("X-app_ver=3439");
|
params.add("X-app_ver=" + VKVersionBuild());
|
||||||
params.add("X-kid=|ID|" + rid + "|");
|
params.add("X-kid=|ID|" + rid + "|");
|
||||||
params.add("X-osv=30");
|
params.add("X-osv=30");
|
||||||
params.add("X-sig=" + sig);
|
params.add("X-sig=" + sig);
|
||||||
@@ -129,12 +132,12 @@ public class GCMFix {
|
|||||||
if (!del) {
|
if (!del) {
|
||||||
params.add("X-gmp_app_id=1:841415684880:android:632f429381141121");
|
params.add("X-gmp_app_id=1:841415684880:android:632f429381141121");
|
||||||
}
|
}
|
||||||
params.add("X-app_ver_name=5.29");
|
params.add("X-app_ver_name=" + VKVersion());
|
||||||
params.add("app=com.vkontakte.android");
|
params.add("app=com.vkontakte.android");
|
||||||
params.add("sender=841415684880");
|
params.add("sender=841415684880");
|
||||||
params.add("device=" + androidId);
|
params.add("device=" + androidId);
|
||||||
params.add("cert=48761eef50ee53afc4cc9c5f10e6bde7f8f5b82f");
|
params.add("cert=48761eef50ee53afc4cc9c5f10e6bde7f8f5b82f");
|
||||||
params.add("app_ver=3439");
|
params.add("app_ver=" + VKVersionBuild());
|
||||||
params.add("gcm_ver=11949470");
|
params.add("gcm_ver=11949470");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.vtosters.lite.badmanners;
|
package ru.vtosters.lite.deviceinfo;
|
||||||
|
|
||||||
public class Device {
|
public class Device {
|
||||||
private String androidId;
|
private String androidId;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.vtosters.lite.badmanners;
|
package ru.vtosters.lite.deviceinfo;
|
||||||
|
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package ru.vtosters.lite.dnr;
|
package ru.vtosters.lite.dnr;
|
||||||
|
|
||||||
import static ru.f0x1d.net.F0x1dRequest.makeRequest;
|
import static ru.vtosters.lite.net.Request.makeRequest;
|
||||||
import static ru.vtosters.lite.utils.Globals.getUserToken;
|
import static ru.vtosters.lite.utils.Globals.getUserToken;
|
||||||
import static ru.vtosters.lite.utils.Proxy.getApiCom;
|
import static ru.vtosters.lite.utils.Proxy.getApiCom;
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package ru.vtosters.lite.dnr;
|
package ru.vtosters.lite.dnr;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanFalse;
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
public class DNRPrefs {
|
public class DNRPrefs {
|
||||||
public static boolean getStoriesRead() {
|
public static boolean getStoriesRead() {
|
||||||
return BooleanFalse("read_s");
|
return getBoolValue("read_s", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean getMarkAsReadWithoutExceptions(int peerId) {
|
public static boolean getMarkAsReadWithoutExceptions(int peerId) {
|
||||||
@@ -28,27 +28,27 @@ public class DNRPrefs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean readPM(int peer) {
|
public static boolean readPM(int peer) {
|
||||||
return (peer > 0 && peer < 2000000000) && BooleanFalse("read_pm");
|
return (peer > 0 && peer < 2000000000) && getBoolValue("read_pm", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean readConversations(int peer) {
|
public static boolean readConversations(int peer) {
|
||||||
return (peer > 2000000000) && BooleanFalse("read_conversations");
|
return (peer > 2000000000) && getBoolValue("read_conversations", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean readBots(int peer) {
|
public static boolean readBots(int peer) {
|
||||||
return (peer < 0) && BooleanFalse("read_bot");
|
return (peer < 0) && getBoolValue("read_bot", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean writePM(int peer) {
|
public static boolean writePM(int peer) {
|
||||||
return (peer > 0 && peer < 2000000000) && BooleanFalse("write_pm");
|
return (peer > 0 && peer < 2000000000) && getBoolValue("write_pm", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean writeConversations(int peer) {
|
public static boolean writeConversations(int peer) {
|
||||||
return (peer > 2000000000) && BooleanFalse("write_conversations");
|
return (peer > 2000000000) && getBoolValue("write_conversations", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean writeBots(int peer) {
|
public static boolean writeBots(int peer) {
|
||||||
return (peer < 0) && BooleanFalse("write_bot");
|
return (peer < 0) && getBoolValue("write_bot", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean getActivityWithoutExceptions(int peerId) {
|
public static boolean getActivityWithoutExceptions(int peerId) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package ru.vtosters.lite.downloaders;
|
package ru.vtosters.lite.downloaders;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.DownloadManager;
|
import android.app.DownloadManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -48,7 +50,7 @@ public class VideoDownloader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (list.isEmpty()) {
|
if (list.isEmpty()) {
|
||||||
ToastUtils.a("Данное видео невозможно скачать");
|
ToastUtils.a(getString("videodownloaderr"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
package ru.vtosters.lite.encryption;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import com.vk.im.engine.models.messages.Msg;
|
||||||
|
import com.vk.im.engine.models.messages.MsgFromUser;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.base.IMProcessor;
|
||||||
|
import ru.vtosters.lite.encryption.processors.BeeCryptProcessor;
|
||||||
|
import ru.vtosters.lite.encryption.processors.DefaultCoffeeProcessor;
|
||||||
|
import ru.vtosters.lite.encryption.processors.DonateCoffeeProcessor;
|
||||||
|
import ru.vtosters.lite.encryption.processors.MP3InvisibleProcessor;
|
||||||
|
import ru.vtosters.lite.encryption.processors.VTostersAESProcessor;
|
||||||
|
import ru.vtosters.lite.encryption.processors.VTostersProcessor;
|
||||||
|
|
||||||
|
public class EncryptProvider {
|
||||||
|
public static List<IMProcessor> processors = new ArrayList<>();
|
||||||
|
|
||||||
|
public static IMProcessor getProcessorFor(int peerId) {
|
||||||
|
IMProcessor enabled = null;
|
||||||
|
for (IMProcessor processor: EncryptProvider.processors) {
|
||||||
|
if (processor.isUsedToEncrypt(peerId)) {
|
||||||
|
enabled = processor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getBody(MsgFromUser msg) {
|
||||||
|
return msg.E();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getPeerId(Msg msg) {
|
||||||
|
return msg.b();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will run through EVERY single processor available.
|
||||||
|
public static String decryptMessage(MsgFromUser msg) {
|
||||||
|
return decryptMessage(getBody(msg), getPeerId(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decryptMessage(String msgBody, int peer) {
|
||||||
|
try {
|
||||||
|
for (IMProcessor processor : processors) {
|
||||||
|
if ((processor.isUsed() || !processor.isPublic()) && processor.isEncrypted(msgBody) && (processor.isPublic() || getKeyForProcessor(processor, peer) != null))
|
||||||
|
return "\uD83D\uDD12 " + processor.decode(msgBody, getKeyForProcessor(processor, peer));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return msgBody;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] getKeyForProcessor(IMProcessor processor, int peer) {
|
||||||
|
if (processor.isPublic()) return null;
|
||||||
|
String keyString = processor.getEncryptionKeyFor(peer);
|
||||||
|
if (keyString == null) return null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
byte[] hash = digest.digest(keyString.getBytes());
|
||||||
|
byte[] key = new byte[16];
|
||||||
|
System.arraycopy(hash, 0, key, 0, key.length);
|
||||||
|
return key;
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return keyString.getBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will use only the processor which was chosen in chat menu [that's why ID is needed, bruh]
|
||||||
|
public static String encryptMessage(MsgFromUser msg) {
|
||||||
|
|
||||||
|
String msgBody = getBody(msg);
|
||||||
|
|
||||||
|
Log.d("EncryptProvider", "encryptMessage: msg = " + msg.toString());
|
||||||
|
Log.d("EncryptProvider", "encryptMessage: body = " + msgBody);
|
||||||
|
Log.d("EncryptProvider", "encryptMessage: peerId = " + getPeerId(msg));
|
||||||
|
|
||||||
|
for (IMProcessor processor: processors) {
|
||||||
|
int peer = getPeerId(msg);
|
||||||
|
if (processor.isUsedToEncrypt(peer)) {
|
||||||
|
return processor.encode(msgBody, getKeyForProcessor(processor, peer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return msgBody;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For rendering UI
|
||||||
|
public static List<Pair<String, String>> getUserVisibleEncoders() {
|
||||||
|
List<Pair<String, String>> theList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (IMProcessor processor: processors) {
|
||||||
|
if (processor.isPublic()) theList.add(new Pair<>("VT_IMDecode_"+processor.getPrefKey(), processor.getUIName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return theList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
processors.add(new VTostersProcessor());
|
||||||
|
processors.add(new VTostersAESProcessor());
|
||||||
|
processors.add(new DefaultCoffeeProcessor());
|
||||||
|
processors.add(new DonateCoffeeProcessor());
|
||||||
|
processors.add(new BeeCryptProcessor());
|
||||||
|
processors.add(new MP3InvisibleProcessor());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package ru.vtosters.lite.encryption.base;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.utils.Globals;
|
||||||
|
|
||||||
|
public abstract class IMProcessor {
|
||||||
|
// By default it checks start and end tag.
|
||||||
|
public boolean isEncrypted(String source) {
|
||||||
|
//Log.d("IMProcessor", "Checking if encrypted: "+source+" / "+getUIName());
|
||||||
|
return source.startsWith(startTag()) && source.endsWith(endTag());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key can be null - if it's a public processor
|
||||||
|
@NonNull protected abstract String encodeInternal(@NonNull String source, @Nullable byte[] key);
|
||||||
|
@NonNull protected abstract String decodeInternal(@NonNull String source, @Nullable byte[] key);
|
||||||
|
|
||||||
|
// Automatically removes tags. Magic!
|
||||||
|
@NonNull
|
||||||
|
public String encode(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
//Log.d("IMProcessor", "Encoding "+source);
|
||||||
|
return startTag() + encodeInternal(source, key) + endTag();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public String decode(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
//Log.d("IMProcessor", "Decoding");
|
||||||
|
return decodeInternal(source.substring(startTag().length(), source.length() - endTag().length()), key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public - no key required.
|
||||||
|
public boolean isPublic() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// UI thing
|
||||||
|
@NonNull abstract public String getUIName();
|
||||||
|
@NonNull abstract public String getPrefKey();
|
||||||
|
|
||||||
|
@NonNull public String startTag() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
@NonNull public String endTag() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUsed() {
|
||||||
|
//Log.d("IMProcessor", "Checking if decoded with "+getUIName());
|
||||||
|
return getBoolValue("VT_IMDecode_"+getPrefKey(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUsedToEncrypt(int id) {
|
||||||
|
//Log.d("IMProcessor", "Checking if "+id+" is ready to be encrypted with "+getUIName());
|
||||||
|
return getBoolValue("VT_IMEncode_"+getPrefKey()+"_"+id, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enableEncryptFor(int id) {
|
||||||
|
Globals.getDefprefs().edit().putBoolean("VT_IMEncode_"+getPrefKey()+"_"+id, true).apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disableEncryptFor(int id) {
|
||||||
|
Globals.getDefprefs().edit().putBoolean("VT_IMEncode_"+getPrefKey()+"_"+id, false).apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEncryptionKeyFor(int id, @Nullable String key) {
|
||||||
|
if (key == null || key.isEmpty()) key = "VTAesDefault";
|
||||||
|
Globals.getDefprefs().edit().putString("VT_IMEncodeKey_"+getPrefKey()+"_"+id, key).apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public String getEncryptionKeyFor(int id) {
|
||||||
|
return Globals.getDefprefs().getString("VT_IMEncodeKey_"+getPrefKey()+"_"+id, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
package ru.vtosters.lite.encryption.processors;
|
||||||
|
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.base.IMProcessor;
|
||||||
|
|
||||||
|
public class BeeCryptProcessor extends IMProcessor {
|
||||||
|
private static final String BC_CHARSET = "жъЖЪ";
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String encodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
String a = Base64.encodeToString(source.getBytes(StandardCharsets.UTF_8), 2);
|
||||||
|
StringBuilder res = new StringBuilder();
|
||||||
|
for (int i = 0; i < a.length(); i++) {
|
||||||
|
StringBuilder bintxt = new StringBuilder();
|
||||||
|
int c = a.charAt(i);
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
bintxt.insert(0, BC_CHARSET.charAt(c % 4));
|
||||||
|
c /= 4;
|
||||||
|
}
|
||||||
|
res.append(bintxt);
|
||||||
|
}
|
||||||
|
return res.toString();
|
||||||
|
} catch (java.lang.Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEncrypted(String source) {
|
||||||
|
return source.matches("[жъЖЪ]{16,}");
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String decodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
StringBuilder b64 = new StringBuilder();
|
||||||
|
int i = 0;
|
||||||
|
while (i < source.length() - 3) {
|
||||||
|
try {
|
||||||
|
String bintxt = source.substring(i, i + 4);
|
||||||
|
int c = 0;
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
c = (c * 4) + Math.max(0, BC_CHARSET.indexOf(bintxt.charAt(j)));
|
||||||
|
}
|
||||||
|
b64.append((char) c);
|
||||||
|
i += 4;
|
||||||
|
} catch (java.lang.Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new String(Base64.decode(b64.toString(), 2), StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getUIName() {
|
||||||
|
return "MP3 [beecrypt]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "mp3_bc";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package ru.vtosters.lite.encryption.processors;
|
||||||
|
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.base.IMProcessor;
|
||||||
|
|
||||||
|
public class DefaultCoffeeProcessor extends IMProcessor {
|
||||||
|
private final static String KEY = "stupidUsersMustD";
|
||||||
|
private static Cipher dCipher, eCipher;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "AES");
|
||||||
|
|
||||||
|
dCipher = Cipher.getInstance("AES");
|
||||||
|
dCipher.init(Cipher.DECRYPT_MODE, key);
|
||||||
|
|
||||||
|
eCipher = Cipher.getInstance("AES");
|
||||||
|
eCipher.init(Cipher.ENCRYPT_MODE, key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String toHex(String text) {
|
||||||
|
char[] chars = text.toCharArray();
|
||||||
|
StringBuilder str = new StringBuilder();
|
||||||
|
for (char aChar : chars) {
|
||||||
|
String s = Integer.toHexString(aChar);
|
||||||
|
if (s.length() < 2) s = "0" + s;
|
||||||
|
str.append(s.toUpperCase()).append(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
String string = str.toString();
|
||||||
|
return string.substring(0, string.length()-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String fromHex(String text) {
|
||||||
|
text = text.replace(" ", "");
|
||||||
|
char[] chars = text.toCharArray();
|
||||||
|
char[] chars2 = new char[chars.length/2];
|
||||||
|
for (int i = 0; i < chars.length; i+=2) {
|
||||||
|
String c = String.valueOf(chars[i]) + chars[i + 1];
|
||||||
|
chars2[i/2] = (char) Integer.parseInt(c, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String(chars2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String encodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
return toHex(Base64.encodeToString(eCipher.doFinal(source.getBytes()), 0));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String decodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
return new String(dCipher.doFinal(Base64.decode(fromHex(source), 0)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public String startTag() {
|
||||||
|
return "VK CO FF EE ";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public String endTag() {
|
||||||
|
return " VK CO FF EE";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getUIName() {
|
||||||
|
return "VK Coffee [default]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "coffee_default";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package ru.vtosters.lite.encryption.processors;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
public class DonateCoffeeProcessor extends DefaultCoffeeProcessor {
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public String startTag() {
|
||||||
|
return "II ";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public String endTag() {
|
||||||
|
return " II";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getUIName() {
|
||||||
|
return "VK Coffee [hidden]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "coffee_donate";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package ru.vtosters.lite.encryption.processors;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.base.IMProcessor;
|
||||||
|
|
||||||
|
public class MP3InvisibleProcessor extends IMProcessor {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String encodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
byte[] bytes = source.getBytes(StandardCharsets.UTF_8);
|
||||||
|
java.lang.String[] plainText = new String[bytes.length];
|
||||||
|
for (int i = 0; i < plainText.length; i++) {
|
||||||
|
plainText[i] = toStr(bytes[i] & 255, " ");
|
||||||
|
}
|
||||||
|
return " " + TextUtils.join(" ", plainText);
|
||||||
|
} catch (java.lang.Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String decodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
java.lang.String[] t = source.replaceAll("^" + " ", "").split(" ");
|
||||||
|
byte[] plainText = new byte[t.length];
|
||||||
|
for (int i = 0; i < plainText.length; i++) {
|
||||||
|
plainText[i] = (byte) toNum(t[i], " ");
|
||||||
|
}
|
||||||
|
return new String(plainText, StandardCharsets.UTF_8);
|
||||||
|
} catch (java.lang.Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String toStr(int a, String cc) {
|
||||||
|
StringBuilder s = new StringBuilder();
|
||||||
|
while (a > 0) {
|
||||||
|
s.insert(0, cc.charAt(a % cc.length()));
|
||||||
|
a /= cc.length();
|
||||||
|
}
|
||||||
|
return s.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int toNum(String a, String cc) {
|
||||||
|
int n = 0;
|
||||||
|
for (int i = 0; i < a.length(); i++) {
|
||||||
|
int start = (a.length() - i) - 1;
|
||||||
|
n = (int) (((double) n) + (((double) cc.indexOf(a.substring(start, start + 1))) * Math.pow(cc.length(), i)));
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEncrypted(String source) {
|
||||||
|
return source.matches("^" + " " + "([" + " " + "\\s]*)");
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getUIName() {
|
||||||
|
return "MP3 [invisible]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "mp3";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
package ru.vtosters.lite.encryption.processors;
|
||||||
|
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.InvalidAlgorithmParameterException;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.NoSuchPaddingException;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.base.IMProcessor;
|
||||||
|
import ru.vtosters.lite.utils.Globals;
|
||||||
|
|
||||||
|
public class VTostersAESProcessor extends IMProcessor {
|
||||||
|
private final static String CIPHER_INSTANCE = "AES/CBC/PKCS7Padding";
|
||||||
|
private final static String KEY_METHOD = "AES";
|
||||||
|
|
||||||
|
private HashMap<byte[], Cipher> decodeMap = new HashMap<>(), encodeMap = new HashMap<>();
|
||||||
|
|
||||||
|
public void free(byte[] key) {
|
||||||
|
decodeMap.remove(key);
|
||||||
|
encodeMap.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private Cipher wrapEncoder(byte[] key) throws InvalidAlgorithmParameterException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
|
||||||
|
if (encodeMap.containsKey(key)) return encodeMap.get(key);
|
||||||
|
|
||||||
|
Triple<Cipher, SecretKeySpec, IvParameterSpec> encodeCipher = getBaseCipher(key);
|
||||||
|
encodeCipher.first.init(Cipher.ENCRYPT_MODE, encodeCipher.second, encodeCipher.third);
|
||||||
|
encodeMap.put(key, encodeCipher.first);
|
||||||
|
|
||||||
|
return encodeCipher.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private Cipher wrapDecoder(byte[] key) throws InvalidAlgorithmParameterException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
|
||||||
|
if (decodeMap.containsKey(key)) return decodeMap.get(key);
|
||||||
|
|
||||||
|
Triple<Cipher, SecretKeySpec, IvParameterSpec> decodeCipher = getBaseCipher(key);
|
||||||
|
decodeCipher.first.init(Cipher.DECRYPT_MODE, decodeCipher.second, decodeCipher.third);
|
||||||
|
decodeMap.put(key, decodeCipher.first);
|
||||||
|
|
||||||
|
return decodeCipher.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private Triple<Cipher, SecretKeySpec, IvParameterSpec> getBaseCipher(byte[] key) throws NoSuchPaddingException, NoSuchAlgorithmException {
|
||||||
|
byte[] off = new byte[16];
|
||||||
|
System.arraycopy(key, 0, off, 0, off.length);
|
||||||
|
return new Triple<>(Cipher.getInstance(CIPHER_INSTANCE), new SecretKeySpec(key, KEY_METHOD), new IvParameterSpec(off));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String encodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
return Base64.encodeToString(wrapEncoder(key).doFinal(source.getBytes(StandardCharsets.UTF_8)), Base64.DEFAULT);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String decodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
try {
|
||||||
|
return new String(wrapDecoder(key).doFinal(Base64.decode(source, Base64.DEFAULT)), StandardCharsets.UTF_8);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPublic() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String startTag() {
|
||||||
|
return "VT0ST3RS [AES] ";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String endTag() {
|
||||||
|
return " VT0ST3RS [AES]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getUIName() {
|
||||||
|
return "VTosters [AES]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "vtaes";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getEncryptionKeyFor(int id) {
|
||||||
|
return Globals.getDefprefs().getString("VT_IMEncodeKey_"+getPrefKey()+"_"+id, "VTAesDefault");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Triple<F, S, T> {
|
||||||
|
public final F first;
|
||||||
|
public final S second;
|
||||||
|
public final T third;
|
||||||
|
|
||||||
|
public Triple(F first, S second, T third) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
this.third = third;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package ru.vtosters.lite.encryption.processors;
|
||||||
|
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.base.IMProcessor;
|
||||||
|
|
||||||
|
public class VTostersProcessor extends IMProcessor {
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String encodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
return Base64.encodeToString(source.getBytes(), Base64.DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
protected String decodeInternal(@NonNull String source, @Nullable byte[] key) {
|
||||||
|
return new String(Base64.decode(source, Base64.DEFAULT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public String startTag() {
|
||||||
|
return "VT0ST3RS ";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public String endTag() {
|
||||||
|
return " VT0ST3RS";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getUIName() {
|
||||||
|
return "VTosters Classique [Base64]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String getPrefKey() {
|
||||||
|
return "vt64";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package ru.vtosters.lite.f0x1d;
|
package ru.vtosters.lite.f0x1d;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.About.*;
|
import static ru.vtosters.lite.utils.About.getBuildNumber;
|
||||||
import static ru.vtosters.lite.utils.Globals.*;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Preferences.*;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
@@ -20,7 +20,7 @@ import com.vtosters.lite.R;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
|
||||||
import ru.vtosters.lite.badmanners.DeviceInfoCollector;
|
import ru.vtosters.lite.deviceinfo.DeviceInfoCollector;
|
||||||
|
|
||||||
public class Crashreporter {
|
public class Crashreporter {
|
||||||
protected static String logString;
|
protected static String logString;
|
||||||
@@ -37,7 +37,7 @@ public class Crashreporter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void start(Thread.UncaughtExceptionHandler uncaughtExceptionHandler, Thread thread, Throwable th, Activity activity) {
|
static void start(Thread.UncaughtExceptionHandler uncaughtExceptionHandler, Thread thread, Throwable th, Activity activity) {
|
||||||
logString = getStackTrace(th) + "\n\n" + new DeviceInfoCollector().collect(getContext()).toDeviceName() + "\n VTL Version: " + VERSIONNAME + ", build: " + getBuildNumber();
|
logString = getStackTrace(th) + "\n\n" + new DeviceInfoCollector().collect(getContext()).toDeviceName() + ", commit: " + getBuildNumber();
|
||||||
if (Build.VERSION.SDK_INT >= 26) {
|
if (Build.VERSION.SDK_INT >= 26) {
|
||||||
var notificationChannel = new NotificationChannel("crashes", "crash", NotificationManager.IMPORTANCE_DEFAULT);
|
var notificationChannel = new NotificationChannel("crashes", "crash", NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
notificationChannel.enableVibration(true);
|
notificationChannel.enableVibration(true);
|
||||||
@@ -61,13 +61,13 @@ public class Crashreporter {
|
|||||||
|
|
||||||
var builder = new Notification.Builder(getContext());
|
var builder = new Notification.Builder(getContext());
|
||||||
builder.setSmallIcon(R.drawable.ic_bug_24);
|
builder.setSmallIcon(R.drawable.ic_bug_24);
|
||||||
builder.setContentTitle("VTL Крашнулся!");
|
builder.setContentTitle(getString("vtl_crashed"));
|
||||||
builder.setContentText(logString);
|
builder.setContentText(logString);
|
||||||
builder.setStyle(new Notification.BigTextStyle().bigText(logString));
|
builder.setStyle(new Notification.BigTextStyle().bigText(logString));
|
||||||
builder.setAutoCancel(true);
|
builder.setAutoCancel(true);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
|
||||||
builder.addAction(new Notification.Action(0, "Загрузить логи", PendingIntent.getActivity(getContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT)));
|
builder.addAction(new Notification.Action(0, getString("vtl_crash_upload"), PendingIntent.getActivity(getContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT)));
|
||||||
builder.addAction(new Notification.Action(0, "Сохранить в файл", psaveLogIntent));
|
builder.addAction(new Notification.Action(0, getString("vtl_crash_save"), psaveLogIntent));
|
||||||
} else {
|
} else {
|
||||||
builder.setContentIntent(PendingIntent.getActivity(activity, 0, foxbinIntent, PendingIntent.FLAG_ONE_SHOT));
|
builder.setContentIntent(PendingIntent.getActivity(activity, 0, foxbinIntent, PendingIntent.FLAG_ONE_SHOT));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package ru.vtosters.lite.f0x1d;
|
package ru.vtosters.lite.f0x1d;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
@@ -42,6 +42,7 @@ public class VTVerifications {
|
|||||||
|
|
||||||
public static void load(Context context) {
|
public static void load(Context context) {
|
||||||
mVerificationsCache = context.getSharedPreferences("vt_another_data", 0);
|
mVerificationsCache = context.getSharedPreferences("vt_another_data", 0);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
processArray(new JSONArray(getLoaded(VERIFICATIONS_KEY)), sVerificationsMap, null);
|
processArray(new JSONArray(getLoaded(VERIFICATIONS_KEY)), sVerificationsMap, null);
|
||||||
processArray(new JSONArray(getLoaded(PROMETHEUS_KEY)), sPrometheusMap, null);
|
processArray(new JSONArray(getLoaded(PROMETHEUS_KEY)), sPrometheusMap, null);
|
||||||
@@ -53,7 +54,7 @@ public class VTVerifications {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Request request = new Request.Builder()
|
Request request = new Request.Builder()
|
||||||
.url("https://gdlbo.net/vktoaster/getGalo4kiBatch")
|
.url("https://vtosters.app/vktoaster/getGalo4kiBatch")
|
||||||
.a(RequestBody.a(MediaType.b("application/json; charset=UTF-8"), "{\"types\":[0,228,404,1337]}"))
|
.a(RequestBody.a(MediaType.b("application/json; charset=UTF-8"), "{\"types\":[0,228,404,1337]}"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@@ -102,9 +103,7 @@ public class VTVerifications {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasPrometheus(int i) {
|
public static boolean hasPrometheus(int i) {
|
||||||
|
|
||||||
return sPrometheusMap.get(i) != null ? sPrometheusMap.get(i) : false;
|
return sPrometheusMap.get(i) != null ? sPrometheusMap.get(i) : false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isDeveloper(int i) {
|
public static boolean isDeveloper(int i) {
|
||||||
@@ -132,13 +131,20 @@ public class VTVerifications {
|
|||||||
return Base64.encodeToString(str.getBytes(), 1);
|
return Base64.encodeToString(str.getBytes(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean vtverif() {
|
||||||
|
return getBoolValue("VT_Verification", true);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isVerified(JSONObject jSONObject) {
|
public static boolean isVerified(JSONObject jSONObject) {
|
||||||
if (jSONObject.optInt("verified", 0) == 1) {
|
if (jSONObject.optInt("verified", 0) == 1) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!BooleanTrue("VT_Verification")) {
|
|
||||||
|
if (!getBoolValue("VT_Verification", true)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return isVerified((jSONObject.optString(NavigatorKeys.j) == null || (!jSONObject.optString(NavigatorKeys.j).equals("group") && !jSONObject.optString(NavigatorKeys.j).equals("page"))) ? jSONObject.optInt("id", 0) : -jSONObject.optInt("id", 0));
|
return isVerified((jSONObject.optString(NavigatorKeys.j) == null || (!jSONObject.optString(NavigatorKeys.j).equals("group") && !jSONObject.optString(NavigatorKeys.j).equals("page"))) ? jSONObject.optInt("id", 0) : -jSONObject.optInt("id", 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,16 +152,19 @@ public class VTVerifications {
|
|||||||
if (jSONObject.optInt("trending", 0) == 1) {
|
if (jSONObject.optInt("trending", 0) == 1) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!BooleanTrue("VT_Fire")) {
|
|
||||||
|
if (!getBoolValue("VT_Fire", true)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hasPrometheus((jSONObject.optString(NavigatorKeys.j) == null || (!jSONObject.optString(NavigatorKeys.j).equals("group") && !jSONObject.optString(NavigatorKeys.j).equals("page"))) ? jSONObject.optInt("id", 0) : -jSONObject.optInt("id", 0));
|
return hasPrometheus((jSONObject.optString(NavigatorKeys.j) == null || (!jSONObject.optString(NavigatorKeys.j).equals("group") && !jSONObject.optString(NavigatorKeys.j).equals("page"))) ? jSONObject.optInt("id", 0) : -jSONObject.optInt("id", 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasDeveloper(JSONObject jSONObject) {
|
public static boolean hasDeveloper(JSONObject jSONObject) {
|
||||||
if (!BooleanTrue("VT_Dev")) {
|
if (!getBoolValue("VT_Dev", true)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return isDeveloper((jSONObject.optString(NavigatorKeys.j) == null || (!jSONObject.optString(NavigatorKeys.j).equals("group") && !jSONObject.optString(NavigatorKeys.j).equals("page"))) ? jSONObject.optInt("id", 0) : -jSONObject.optInt("id", 0));
|
return isDeveloper((jSONObject.optString(NavigatorKeys.j) == null || (!jSONObject.optString(NavigatorKeys.j).equals("group") && !jSONObject.optString(NavigatorKeys.j).equals("page"))) ? jSONObject.optInt("id", 0) : -jSONObject.optInt("id", 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package ru.vtosters.lite.foaf;
|
|||||||
|
|
||||||
import static android.widget.Toast.LENGTH_SHORT;
|
import static android.widget.Toast.LENGTH_SHORT;
|
||||||
import static android.widget.Toast.makeText;
|
import static android.widget.Toast.makeText;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
import static ru.vtosters.lite.utils.Globals.getString;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.Proxy.getApiCom;
|
import static ru.vtosters.lite.utils.Proxy.getApiCom;
|
||||||
import static ru.vtosters.lite.utils.Proxy.proxy;
|
import static ru.vtosters.lite.utils.Proxy.proxy;
|
||||||
@@ -25,9 +26,7 @@ import java.util.regex.Matcher;
|
|||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import ru.vtosters.lite.net.Request;
|
||||||
import ru.f0x1d.net.F0x1dRequest;
|
|
||||||
import ru.vtosters.lite.utils.Preferences;
|
|
||||||
|
|
||||||
public class FoafBase {
|
public class FoafBase {
|
||||||
private static final Pattern FOAF_REGEX = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
|
private static final Pattern FOAF_REGEX = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
|
||||||
@@ -36,7 +35,7 @@ public class FoafBase {
|
|||||||
private static final OkHttpClient client = new OkHttpClient();
|
private static final OkHttpClient client = new OkHttpClient();
|
||||||
|
|
||||||
public static int GetLastSeenInt(int i) throws ParseException, IOException {
|
public static int GetLastSeenInt(int i) throws ParseException, IOException {
|
||||||
Matcher matcher = FOAF_REGEX_LAST_SEEN.matcher(client.newCall(new Request.Builder().url(getLink(i)).build()).b().body().string());
|
Matcher matcher = FOAF_REGEX_LAST_SEEN.matcher(client.newCall(new okhttp3.Request.Builder().url(getLink(i)).build()).b().body().string());
|
||||||
if (!matcher.find()) {
|
if (!matcher.find()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -64,12 +63,12 @@ public class FoafBase {
|
|||||||
|
|
||||||
public static void loadAndShow(Context context, int i) {
|
public static void loadAndShow(Context context, int i) {
|
||||||
ProgressDialog progressDialog = new ProgressDialog(context);
|
ProgressDialog progressDialog = new ProgressDialog(context);
|
||||||
progressDialog.setMessage("Загрузка...");
|
progressDialog.setMessage(getString("com_facebook_loading"));
|
||||||
progressDialog.setCancelable(false);
|
progressDialog.setCancelable(false);
|
||||||
progressDialog.show();
|
progressDialog.show();
|
||||||
|
|
||||||
F0x1dRequest.F0x1dRequestCallback callback = str -> FoafBase.lambdaLoadAndShow(progressDialog, context, i, str);
|
Request.RequestCallback callback =str -> FoafBase.lambdaLoadAndShow(progressDialog, context, i, str);
|
||||||
F0x1dRequest.makeRequest(getLink(i), callback);
|
Request.makeRequest(getLink(i), callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lambdaLoadAndShow(ProgressDialog progressDialog, Context context, int i, String str) {
|
static void lambdaLoadAndShow(ProgressDialog progressDialog, Context context, int i, String str) {
|
||||||
@@ -81,7 +80,7 @@ public class FoafBase {
|
|||||||
matcher2.find();
|
matcher2.find();
|
||||||
String normalHumanDate = getNormalHumanDate(matcher.group(1));
|
String normalHumanDate = getNormalHumanDate(matcher.group(1));
|
||||||
getNormalHumanDate(matcher2.group(1));
|
getNormalHumanDate(matcher2.group(1));
|
||||||
AlertDialog.a a2 = new VkAlertDialog.a(context).a(R.string.addinf);
|
AlertDialog.a a2 = new VkAlertDialog.a(context).a(getIdentifier("addinf", "string"));
|
||||||
a2.b(getString("foafid") + " " + i + getString("foafregdate") + " " + normalHumanDate + getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).b(17039370, null).b().show();
|
a2.b(getString("foafid") + " " + i + getString("foafregdate") + " " + normalHumanDate + getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).b(17039370, null).b().show();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.f0x1d.net;
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.f0x1d.net;
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.f0x1d.net;
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
import java.net.PasswordAuthentication;
|
import java.net.PasswordAuthentication;
|
||||||
import java.net.Proxy;
|
import java.net.Proxy;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.f0x1d.net;
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package ru.f0x1d.net;
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getUserToken;
|
||||||
|
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import com.vk.core.network.Network;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
public class Request {
|
||||||
|
public static void makeRequest(byte[] bArr, RequestCallback RequestCallback) {
|
||||||
|
new MakeRequestTask(bArr, RequestCallback).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void makeRequest(String str, RequestCallback RequestCallback) {
|
||||||
|
new MakeRequestTask(str.getBytes(), RequestCallback).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface RequestCallback {
|
||||||
|
void onResponse(String str);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MakeRequestTask extends AsyncTask<Void, Void, String> {
|
||||||
|
private final RequestCallback callback;
|
||||||
|
private boolean mIsPut;
|
||||||
|
private boolean mIsVTostersRequest;
|
||||||
|
private final byte[] url;
|
||||||
|
|
||||||
|
public MakeRequestTask(byte[] bArr, RequestCallback RequestCallback) {
|
||||||
|
mIsVTostersRequest = false;
|
||||||
|
mIsPut = false;
|
||||||
|
callback = RequestCallback;
|
||||||
|
url = bArr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String doInBackground(Void... voidArr) {
|
||||||
|
try {
|
||||||
|
HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(new String(url)).openConnection();
|
||||||
|
httpURLConnection.setRequestMethod(mIsPut ? "PUT" : "GET");
|
||||||
|
|
||||||
|
if (mIsVTostersRequest) {
|
||||||
|
httpURLConnection.setRequestProperty("Token", getUserToken());
|
||||||
|
}
|
||||||
|
if (!mIsVTostersRequest) {
|
||||||
|
httpURLConnection.setRequestProperty("User-Agent", Network.a.a().a());
|
||||||
|
}
|
||||||
|
|
||||||
|
httpURLConnection.setRequestProperty("Content-Type", mIsVTostersRequest ? "Content-Type" : "application/x-www-form-urlencoded");
|
||||||
|
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
|
||||||
|
|
||||||
|
StringBuffer stringBuffer = new StringBuffer();
|
||||||
|
while (true) {
|
||||||
|
String readLine = bufferedReader.readLine();
|
||||||
|
if (readLine != null) {
|
||||||
|
stringBuffer.append(readLine);
|
||||||
|
} else {
|
||||||
|
bufferedReader.close();
|
||||||
|
return stringBuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
return e.getLocalizedMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPostExecute(String str) {
|
||||||
|
super.onPostExecute(str);
|
||||||
|
callback.onResponse(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,8 @@ package ru.vtosters.lite.ui.dialogs;
|
|||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.edit;
|
import static ru.vtosters.lite.utils.Globals.edit;
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
@@ -17,14 +18,14 @@ import ru.vtosters.lite.utils.OEMDetector;
|
|||||||
|
|
||||||
public class DisableBattery {
|
public class DisableBattery {
|
||||||
public static void alert(Activity activity) {
|
public static void alert(Activity activity) {
|
||||||
if (OEMDetector.isOEM() && Build.VERSION.SDK_INT >= 23 && BooleanTrue("showDoze")) {
|
if (OEMDetector.isOEM() && Build.VERSION.SDK_INT >= 23 && getBoolValue("showDoze", true)) {
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
if (!((PowerManager) context.getSystemService(Context.POWER_SERVICE)).isIgnoringBatteryOptimizations(context.getPackageName())) {
|
if (!((PowerManager) context.getSystemService(Context.POWER_SERVICE)).isIgnoringBatteryOptimizations(context.getPackageName())) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||||
builder.setTitle("Выключите оптимизацию батареи!");
|
builder.setTitle(getString("batteryissuetitle"));
|
||||||
builder.setMessage("Из-за того, что Вы используете оболочку из списка ниже - уведомления могут приходить с задержкой или не приходить вовсе. \n Для того, чтобы это исправить - нажмите на кнопку \"Отключить оптимизацию\". \n\nПрошивки на которых наблюдаются проблемы с пушами:\nFlyme, EMUI, MIUI, ColorOS, Samsung Experience или TouchWiz, Magic UI, ZenUI, Funtouch OS");
|
builder.setMessage(getString("batteryissuesumm"));
|
||||||
builder.setCancelable(false);
|
builder.setCancelable(false);
|
||||||
builder.setPositiveButton("Отключить оптимизацию", new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString("batteryissuebtn1"), new DialogInterface.OnClickListener() {
|
||||||
@Override // android.content.DialogInterface.OnClickListener
|
@Override // android.content.DialogInterface.OnClickListener
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
Intent intent = new Intent("android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS");
|
Intent intent = new Intent("android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS");
|
||||||
@@ -35,7 +36,7 @@ public class DisableBattery {
|
|||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setNeutralButton("Игнорировать", new DialogInterface.OnClickListener() {
|
builder.setNeutralButton(getString("batteryissuebtn2"), new DialogInterface.OnClickListener() {
|
||||||
@Override // android.content.DialogInterface.OnClickListener
|
@Override // android.content.DialogInterface.OnClickListener
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
edit().putBoolean("showDoze", false).apply();
|
edit().putBoolean("showDoze", false).apply();
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ package ru.vtosters.lite.ui.dialogs;
|
|||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.edit;
|
import static ru.vtosters.lite.utils.Globals.edit;
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.Globals.isGmsInstalled;
|
import static ru.vtosters.lite.utils.Globals.isGmsInstalled;
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
@@ -19,17 +20,17 @@ public class InstallGMS {
|
|||||||
public static void alert(final Activity activity) {
|
public static void alert(final Activity activity) {
|
||||||
if (!isGmsInstalled()) {
|
if (!isGmsInstalled()) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||||
builder.setTitle("Внимание!");
|
builder.setTitle(getString("debug_warning"));
|
||||||
builder.setMessage(Text());
|
builder.setMessage(getString("gmsissuesumm"));
|
||||||
builder.setCancelable(false);
|
builder.setCancelable(false);
|
||||||
builder.setPositiveButton("Продолжить без GMS", new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString("gmsissuebtn1"), new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
edit().putBoolean("showAlertGms", false).apply();
|
edit().putBoolean("showAlertGms", false).apply();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setNeutralButton("Установить GMS", new DialogInterface.OnClickListener() {
|
builder.setNeutralButton(getString("gmsissuebtn2"), new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
@@ -39,13 +40,9 @@ public class InstallGMS {
|
|||||||
context.startActivity(a2);
|
context.startActivity(a2);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (BooleanTrue("showAlertGms")) {
|
if (getBoolValue("showAlertGms", true)) {
|
||||||
builder.show();
|
builder.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String Text() {
|
|
||||||
return "На вашем устройстве отсутствует компонент Google Play Services (GMS), который необходим для корректной работы VTosters Lite";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package ru.vtosters.lite.ui.dialogs;
|
package ru.vtosters.lite.ui.dialogs;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.edit;
|
import static ru.vtosters.lite.utils.Globals.edit;
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
@@ -18,17 +19,17 @@ public class Start {
|
|||||||
activity.requestPermissions(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 228);
|
activity.requestPermissions(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 228);
|
||||||
}
|
}
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||||
builder.setTitle("Внимание!");
|
builder.setTitle(getString("debug_warning"));
|
||||||
builder.setMessage(getWelcome());
|
builder.setMessage(getWelcome());
|
||||||
builder.setCancelable(false);
|
builder.setCancelable(false);
|
||||||
builder.setPositiveButton("Продолжить", new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(getString("startbtn2"), new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
@Override // android.content.DialogInterface.OnClickListener
|
@Override // android.content.DialogInterface.OnClickListener
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
edit().putBoolean("showAlert", false).apply();
|
edit().putBoolean("showAlert", false).apply();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setNeutralButton("Новости", new DialogInterface.OnClickListener() {
|
builder.setNeutralButton(getString("startbtn1"), new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
@Override // android.content.DialogInterface.OnClickListener
|
@Override // android.content.DialogInterface.OnClickListener
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
@@ -36,15 +37,18 @@ public class Start {
|
|||||||
activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/vtosters")));
|
activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/vtosters")));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (BooleanTrue("showAlert")) {
|
if (getBoolValue("showAlert", true)) {
|
||||||
builder.show();
|
builder.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getWelcome() {
|
private static String getWelcome() {
|
||||||
if (!OEMDetector.isOEM()) {
|
String Default = getString("startsumm1");
|
||||||
return "Модификация VTosters Lite не имеет никакого отношения к VK Group!\nРаспространяется полностью бесплатно!";
|
|
||||||
|
if (OEMDetector.isOEM()){
|
||||||
|
return Default + getString("startsumm2");
|
||||||
}
|
}
|
||||||
return "Модификация VTosters Lite не имеет никакого отношения к VK Group!\nРаспространяется полностью бесплатно!\n\nПриложение может некорректно работать в связи с тем, что вы, скорее всего, используете оболочку из списка ниже. Все проблемы с отображением и работой приложения связаны только с вашей прошивкой и только с ней. Все багрепорты, присланные из-за проблем на этой прошивке, не рассматриваются разработчиками и не будут исправлены.\n\nНажимая на кнопку \"Продолжить\", вы соглашаетесь с тем, что возможные баги приложения могут произойти из-за специфики вашей прошивки. Рекомендуем использовать прошивки на базе AOSP для получения максимальной стабильности.\n\nПрошивки на которых наблюдаются проблемы с приложениями:\nFlyme, EMUI, MIUI, ColorOS, Samsung Experience или TouchWiz, Magic UI, ZenUI, Funtouch OS";
|
|
||||||
|
return Default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
package ru.vtosters.lite.ui.fragments;
|
package ru.vtosters.lite.ui.fragments;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
|
||||||
|
import com.vk.navigation.Navigator;
|
||||||
|
import com.vk.newsfeed.NewsfeedSettingsFragment;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
|
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
|
||||||
|
|
||||||
@@ -10,5 +17,23 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
|
|||||||
public void b(Bundle bundle) {
|
public void b(Bundle bundle) {
|
||||||
super.b(bundle);
|
super.b(bundle);
|
||||||
a(R.xml.preferences_feed);
|
a(R.xml.preferences_feed);
|
||||||
|
prefs();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prefs() {
|
||||||
|
a("officialnewssett").a(new FeedFragment.openofficialsett());
|
||||||
|
}
|
||||||
|
|
||||||
|
public class openofficialsett implements Preference.c {
|
||||||
|
openofficialsett() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // android.support.v7.preference.Preference.c
|
||||||
|
public boolean a(Preference preference) {
|
||||||
|
Context context = getContext();
|
||||||
|
Intent a2 = new Navigator(NewsfeedSettingsFragment.class).a(context);
|
||||||
|
context.startActivity(a2);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,8 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
|
|||||||
|
|
||||||
@Override // android.support.v7.preference.Preference.c
|
@Override // android.support.v7.preference.Preference.c
|
||||||
public boolean a(Preference preference) {
|
public boolean a(Preference preference) {
|
||||||
|
SharedPreferences prefs = getContext().getSharedPreferences("stickers", Context.MODE_PRIVATE);
|
||||||
|
prefs.edit().clear().commit();
|
||||||
VKImageLoader.b();
|
VKImageLoader.b();
|
||||||
ImEngineProvider.a().h();
|
ImEngineProvider.a().h();
|
||||||
AudioMessageUtils.j();
|
AudioMessageUtils.j();
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package ru.vtosters.lite.ui.fragments;
|
package ru.vtosters.lite.ui.fragments;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Globals.componentSwitcher;
|
||||||
import static ru.vtosters.lite.utils.Globals.getString;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.IconHelper.switchToDefault;
|
|
||||||
import static ru.vtosters.lite.utils.IconHelper.switchToVK;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
@@ -22,10 +21,13 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment {
|
|||||||
|
|
||||||
public boolean apply(Preference preference, Object obj) {
|
public boolean apply(Preference preference, Object obj) {
|
||||||
if (((Boolean) obj).booleanValue()) {
|
if (((Boolean) obj).booleanValue()) {
|
||||||
switchToVK();
|
componentSwitcher("VTIconDefault", false);
|
||||||
|
componentSwitcher("VTIconVK", true);
|
||||||
} else {
|
} else {
|
||||||
switchToDefault();
|
componentSwitcher("VTIconDefault", true);
|
||||||
|
componentSwitcher("VTIconVK", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ToastUtils.a(getString("iconapplying"));
|
ToastUtils.a(getString("iconapplying"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.Globals.restartApplication;
|
import static ru.vtosters.lite.utils.Globals.restartApplication;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -40,7 +41,7 @@ public class DockBarFragment extends ToolbarFragment {
|
|||||||
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
|
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
|
||||||
|
|
||||||
Button save = new Button(n());
|
Button save = new Button(n());
|
||||||
save.setText("Сохранить");
|
save.setText(getString("dockbar_save"));
|
||||||
save.setOnClickListener(v -> {
|
save.setOnClickListener(v -> {
|
||||||
DockBarManager.getInstance().save();
|
DockBarManager.getInstance().save();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
@@ -54,7 +55,7 @@ public class DockBarFragment extends ToolbarFragment {
|
|||||||
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(convertDpToPixel(10), 0));
|
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(convertDpToPixel(10), 0));
|
||||||
|
|
||||||
Button reset = new Button(n());
|
Button reset = new Button(n());
|
||||||
reset.setText("Сбросить");
|
reset.setText(getString("dockbar_reset"));
|
||||||
reset.setOnClickListener(v -> {
|
reset.setOnClickListener(v -> {
|
||||||
DockBarManager.getInstance().delete();
|
DockBarManager.getInstance().delete();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
@@ -83,6 +84,6 @@ public class DockBarFragment extends ToolbarFragment {
|
|||||||
|
|
||||||
super.a(arg0, arg1);
|
super.a(arg0, arg1);
|
||||||
|
|
||||||
a("Редактор докбара");
|
a(getString("dockbar_editor"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||||
|
import static ru.vtosters.lite.utils.Themes.getAccentColor;
|
||||||
|
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
@@ -61,12 +63,18 @@ public class DockBarInjector {
|
|||||||
|
|
||||||
for (DockBarTab tab : sManager.getSelectedTabs()) {
|
for (DockBarTab tab : sManager.getSelectedTabs()) {
|
||||||
MenuItem add = menu.add(0, tab.id, 0, tab.titleID);
|
MenuItem add = menu.add(0, tab.id, 0, tab.titleID);
|
||||||
Drawable drawable = getContext().getResources().getDrawable(tab.iconID);
|
Drawable drawable = getResources().getDrawable(tab.iconID);
|
||||||
ColorStateList colorStateList = getContext().getResources().getColorStateList(com.vtosters.lite.R.color.bottom_navigation_item);
|
ColorStateList dockcolors = new ColorStateList(
|
||||||
// if (isAndroidMonet()) {
|
new int[][]{
|
||||||
// colorStateList = ColorStateList.valueOf(Themes.getAccentColor());
|
new int[]{android.R.attr.state_checked},
|
||||||
// }
|
new int[]{-android.R.attr.state_checked}
|
||||||
add.setIcon(new RecoloredDrawable(drawable, colorStateList));
|
},
|
||||||
|
new int[] {
|
||||||
|
getAccentColor(),
|
||||||
|
Color.parseColor("#ffaaaeb3")
|
||||||
|
}
|
||||||
|
);
|
||||||
|
add.setIcon(new RecoloredDrawable(drawable, dockcolors));
|
||||||
add.setShowAsAction(1);
|
add.setShowAsAction(1);
|
||||||
add.setCheckable(true);
|
add.setCheckable(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.Preferences.newfeed;
|
import static ru.vtosters.lite.utils.Preferences.newfeed;
|
||||||
import static ru.vtosters.lite.utils.Preferences.olddock;
|
import static ru.vtosters.lite.utils.Preferences.oldicons;
|
||||||
|
|
||||||
import com.vk.apps.AppsFragment;
|
import com.vk.apps.AppsFragment;
|
||||||
import com.vk.discover.DiscoverFragment;
|
import com.vk.discover.DiscoverFragment;
|
||||||
import com.vk.discover.GatewaysFragment;
|
|
||||||
import com.vk.fave.fragments.FaveTabFragment;
|
import com.vk.fave.fragments.FaveTabFragment;
|
||||||
import com.vk.feedlikes.fragments.FeedLikesFragment;
|
import com.vk.feedlikes.fragments.FeedLikesFragment;
|
||||||
import com.vk.menu.MenuFragment;
|
import com.vk.menu.MenuFragment;
|
||||||
@@ -52,8 +52,8 @@ public class DockBarManager {
|
|||||||
private final List<DockBarTab> mSelectedTabs = new ArrayList<>();
|
private final List<DockBarTab> mSelectedTabs = new ArrayList<>();
|
||||||
private final List<DockBarTab> mDisabledTabs = new ArrayList<>();
|
private final List<DockBarTab> mDisabledTabs = new ArrayList<>();
|
||||||
private final List<String> mGroups = Arrays.asList(
|
private final List<String> mGroups = Arrays.asList(
|
||||||
"Выбранные элементы докбара",
|
getString("dockbar_selected_items"),
|
||||||
"Невыбранные элементы"
|
getString("dockbar_unselected_items")
|
||||||
);
|
);
|
||||||
public DockBarManager() {
|
public DockBarManager() {
|
||||||
load();
|
load();
|
||||||
@@ -79,11 +79,11 @@ public class DockBarManager {
|
|||||||
File dockbar = new File(getContext().getFilesDir(), "dockbar.json");
|
File dockbar = new File(getContext().getFilesDir(), "dockbar.json");
|
||||||
|
|
||||||
if (!dockbar.exists()) {
|
if (!dockbar.exists()) {
|
||||||
mSelectedTabs.add(new DockBarTab("tab_news", olddock() ? R.drawable.ic_newsfeed_28 : R.drawable.ic_menu_newsfeed_outline_28, R.string.newsfeed, R.id.tab_news, newfeed() ? HomeFragment.class : NewsfeedFragment.class));
|
mSelectedTabs.add(new DockBarTab("tab_news", oldicons() ? R.drawable.ic_newsfeed_28 : R.drawable.ic_menu_newsfeed_outline_28, R.string.newsfeed, R.id.tab_news, newfeed() ? HomeFragment.class : NewsfeedFragment.class));
|
||||||
mSelectedTabs.add(new DockBarTab("tab_discover", olddock() ? R.drawable.ic_search_28 : R.drawable.ic_menu_search_outline_28, R.string.search, R.id.tab_discover, newfeed() ? GatewaysFragment.class : DiscoverFragment.class ));
|
mSelectedTabs.add(new DockBarTab("tab_discover", oldicons() ? R.drawable.ic_search_28 : R.drawable.ic_menu_search_outline_28, R.string.search, R.id.tab_discover, DiscoverFragment.class ));
|
||||||
mSelectedTabs.add(new DockBarTab("tab_messages", olddock() ? R.drawable.ic_menu_messages_28 : R.drawable.ic_message_28_outline, R.string.messages, R.id.tab_messages, DialogsFragment.class));
|
mSelectedTabs.add(new DockBarTab("tab_messages", oldicons() ? R.drawable.ic_menu_messages_28 : R.drawable.ic_message_28_outline, R.string.messages, R.id.tab_messages, DialogsFragment.class));
|
||||||
mSelectedTabs.add(new DockBarTab("tab_feedback", olddock() ? R.drawable.ic_menu_notifications_28 : R.drawable.ic_menu_notification_outline_28, R.string.feedback, R.id.tab_feedback, NotificationsContainerFragment.class));
|
mSelectedTabs.add(new DockBarTab("tab_feedback", oldicons() ? R.drawable.ic_menu_notifications_28 : R.drawable.ic_menu_notification_outline_28, R.string.feedback, R.id.tab_feedback, NotificationsContainerFragment.class));
|
||||||
mSelectedTabs.add(new DockBarTab("tab_menu", olddock() ? R.drawable.ic_menu_more_28 : R.drawable.ic_menu_more_outline_28, R.string.menu, R.id.tab_menu, MenuFragment.class));
|
mSelectedTabs.add(new DockBarTab("tab_menu", oldicons() ? R.drawable.ic_menu_more_28 : R.drawable.ic_menu_more_outline_28, R.string.menu, R.id.tab_menu, MenuFragment.class));
|
||||||
|
|
||||||
mDisabledTabs.add(new DockBarTab("tab_friends", R.drawable.ic_user_24, R.string.friends, R.id.menu_friends, FriendsFragment.class));
|
mDisabledTabs.add(new DockBarTab("tab_friends", R.drawable.ic_user_24, R.string.friends, R.id.menu_friends, FriendsFragment.class));
|
||||||
mDisabledTabs.add(new DockBarTab("tab_groups", R.drawable.ic_users_24, R.string.groups, R.id.menu_groups, GroupsFragment.class));
|
mDisabledTabs.add(new DockBarTab("tab_groups", R.drawable.ic_users_24, R.string.groups, R.id.menu_groups, GroupsFragment.class));
|
||||||
@@ -124,8 +124,8 @@ public class DockBarManager {
|
|||||||
} else {
|
} else {
|
||||||
if (tab.fragmentClass == HomeFragment.class) {
|
if (tab.fragmentClass == HomeFragment.class) {
|
||||||
tab.fragmentClass = NewsfeedFragment.class;
|
tab.fragmentClass = NewsfeedFragment.class;
|
||||||
} else if (tab.fragmentClass == GatewaysFragment.class) {
|
} else if (tab.fragmentClass == DiscoverFragment.class) {
|
||||||
tab.fragmentClass = GatewaysFragment.class;
|
tab.fragmentClass = DiscoverFragment.class;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mSelectedTabs.add(tab);
|
mSelectedTabs.add(tab);
|
||||||
@@ -145,12 +145,12 @@ public class DockBarManager {
|
|||||||
if (tab.fragmentClass == NewsfeedFragment.class) {
|
if (tab.fragmentClass == NewsfeedFragment.class) {
|
||||||
tab.fragmentClass = HomeFragment.class;
|
tab.fragmentClass = HomeFragment.class;
|
||||||
} else if (tab.fragmentClass == DiscoverFragment.class) {
|
} else if (tab.fragmentClass == DiscoverFragment.class) {
|
||||||
tab.fragmentClass = GatewaysFragment.class;
|
tab.fragmentClass = DiscoverFragment.class;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (tab.fragmentClass == HomeFragment.class) {
|
if (tab.fragmentClass == HomeFragment.class) {
|
||||||
tab.fragmentClass = NewsfeedFragment.class;
|
tab.fragmentClass = NewsfeedFragment.class;
|
||||||
} else if (tab.fragmentClass == GatewaysFragment.class) {
|
} else if (tab.fragmentClass == DiscoverFragment.class) {
|
||||||
tab.fragmentClass = DiscoverFragment.class;
|
tab.fragmentClass = DiscoverFragment.class;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-1
@@ -1,12 +1,16 @@
|
|||||||
package ru.vtosters.lite.ui.fragments.multiaccount;
|
package ru.vtosters.lite.ui.fragments.multiaccount;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Globals.getResources;
|
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.Globals.isNetworkConnected;
|
import static ru.vtosters.lite.utils.Globals.isNetworkConnected;
|
||||||
import static ru.vtosters.lite.utils.Globals.restartApplication;
|
import static ru.vtosters.lite.utils.Globals.restartApplication;
|
||||||
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
||||||
import static ru.vtosters.lite.utils.Themes.recolorDrawable;
|
import static ru.vtosters.lite.utils.Themes.recolorDrawable;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
@@ -116,7 +120,7 @@ public class MultiAccountAdapter extends RecyclerView.a<MultiAccountAdapter.Mult
|
|||||||
|
|
||||||
public void bind(MultiAccountItem item, int pos) {
|
public void bind(MultiAccountItem item, int pos) {
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
mNickname.setText("Добавить новый аккаунт");
|
mNickname.setText(getString("add_another_account"));
|
||||||
mContainer.setOnClickListener(v -> {
|
mContainer.setOnClickListener(v -> {
|
||||||
MultiAccountManager.addAccount();
|
MultiAccountManager.addAccount();
|
||||||
|
|
||||||
@@ -127,6 +131,8 @@ public class MultiAccountAdapter extends RecyclerView.a<MultiAccountAdapter.Mult
|
|||||||
VKAccount b = VKAccountManager.b();
|
VKAccount b = VKAccountManager.b();
|
||||||
PushSubscriber.a.a(b.b(), b.c());
|
PushSubscriber.a.a(b.b(), b.c());
|
||||||
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
|
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
|
||||||
|
SharedPreferences prefs = getContext().getSharedPreferences("stickers", Context.MODE_PRIVATE);
|
||||||
|
prefs.edit().clear().commit();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
});
|
});
|
||||||
Drawable drawable = recolorDrawable(getResources().getDrawable(R.drawable.ic_list_add));
|
Drawable drawable = recolorDrawable(getResources().getDrawable(R.drawable.ic_list_add));
|
||||||
@@ -143,6 +149,8 @@ public class MultiAccountAdapter extends RecyclerView.a<MultiAccountAdapter.Mult
|
|||||||
VKAccount b = VKAccountManager.b();
|
VKAccount b = VKAccountManager.b();
|
||||||
PushSubscriber.a.a(b.b(), b.c());
|
PushSubscriber.a.a(b.b(), b.c());
|
||||||
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
|
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
|
||||||
|
SharedPreferences prefs = getContext().getSharedPreferences("stickers", Context.MODE_PRIVATE);
|
||||||
|
prefs.edit().clear().commit();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -164,6 +172,8 @@ public class MultiAccountAdapter extends RecyclerView.a<MultiAccountAdapter.Mult
|
|||||||
VKAccount b = VKAccountManager.b();
|
VKAccount b = VKAccountManager.b();
|
||||||
PushSubscriber.a.a(b.b(), b.c());
|
PushSubscriber.a.a(b.b(), b.c());
|
||||||
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
|
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
|
||||||
|
SharedPreferences prefs = getContext().getSharedPreferences("stickers", Context.MODE_PRIVATE);
|
||||||
|
prefs.edit().clear().commit();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-3
@@ -12,6 +12,8 @@ import java.util.List;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.utils.Globals;
|
||||||
|
|
||||||
public class MultiAccountManager {
|
public class MultiAccountManager {
|
||||||
|
|
||||||
public static void migrate() {
|
public static void migrate() {
|
||||||
@@ -20,7 +22,15 @@ public class MultiAccountManager {
|
|||||||
SharedPreferences NewPrefs = getContext().getSharedPreferences("pref_account_manager0", Context.MODE_PRIVATE);
|
SharedPreferences NewPrefs = getContext().getSharedPreferences("pref_account_manager0", Context.MODE_PRIVATE);
|
||||||
SharedPreferences.Editor editor = NewPrefs.edit();
|
SharedPreferences.Editor editor = NewPrefs.edit();
|
||||||
editor.putString("key_vk_account", OldPrefsValue);
|
editor.putString("key_vk_account", OldPrefsValue);
|
||||||
editor.apply();
|
editor.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void migrationRestart() {
|
||||||
|
SharedPreferences prefs = getPreferences();
|
||||||
|
if (prefs.getBoolean("multiaccount_restart", true)) {
|
||||||
|
prefs.edit().putBoolean("multiaccount_restart", false).commit();
|
||||||
|
Globals.restartApplication();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SharedPreferences getCurrentAccount() {
|
public static SharedPreferences getCurrentAccount() {
|
||||||
@@ -80,7 +90,15 @@ public class MultiAccountManager {
|
|||||||
prefs.edit().clear().commit();
|
prefs.edit().clear().commit();
|
||||||
File file = new File(new File(getContext().getFilesDir().getParent(), "shared_prefs"), "pref_account_manager" + i);
|
File file = new File(new File(getContext().getFilesDir().getParent(), "shared_prefs"), "pref_account_manager" + i);
|
||||||
if (file.exists()) file.delete();
|
if (file.exists()) file.delete();
|
||||||
if (account == i && getAccountPrefsCount() > 0)
|
if (account == i && getAccountPrefsCount() > 0) {
|
||||||
switchAccount(buildList().get(0).index);
|
List<MultiAccountItem> accounts = buildList();
|
||||||
|
if (accounts.size() > 0)
|
||||||
|
switchAccount(buildList().get(0).index);
|
||||||
|
else {
|
||||||
|
getContext().getSharedPreferences("pref_account_manager", Context.MODE_PRIVATE)
|
||||||
|
.edit().clear().commit();
|
||||||
|
Globals.getPreferences().edit().putBoolean("multiaccount_restart", true).commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
|||||||
import static ru.vtosters.lite.utils.Globals.getResources;
|
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||||
import static ru.vtosters.lite.utils.Globals.getString;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
import static ru.vtosters.lite.utils.Themes.getAccentColor;
|
import static ru.vtosters.lite.utils.Themes.getAccentColor;
|
||||||
import static ru.vtosters.lite.utils.Themes.getNavbarColor;
|
|
||||||
import static ru.vtosters.lite.utils.Themes.getSTextAttr;
|
import static ru.vtosters.lite.utils.Themes.getSTextAttr;
|
||||||
|
import static ru.vtosters.lite.utils.Themes.getTabbarBackground;
|
||||||
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
||||||
import static ru.vtosters.lite.utils.Themes.recolorDrawable;
|
import static ru.vtosters.lite.utils.Themes.recolorDrawable;
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ public class StickersFragment extends ToolbarFragment {
|
|||||||
|
|
||||||
public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST";
|
public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST";
|
||||||
|
|
||||||
private final static int TYPE_DIRECT = 0, TYPE_SOCKS = 2, TYPE_TOASTER_SERVER = 3;
|
private final static int TYPE_DIRECT = 0, TYPE_SOCKS = 2;
|
||||||
private static final String TAG = "StickersFragment";
|
private static final String TAG = "StickersFragment";
|
||||||
public int from;
|
public int from;
|
||||||
public int to;
|
public int to;
|
||||||
@@ -97,7 +97,6 @@ public class StickersFragment extends ToolbarFragment {
|
|||||||
private void initGrabber() {
|
private void initGrabber() {
|
||||||
int method = TGPref.getTGConnectMethod();
|
int method = TGPref.getTGConnectMethod();
|
||||||
switch (method) {
|
switch (method) {
|
||||||
case TYPE_TOASTER_SERVER:
|
|
||||||
case TYPE_DIRECT:
|
case TYPE_DIRECT:
|
||||||
TelegramStickersGrabber.USE_PROXY = false;
|
TelegramStickersGrabber.USE_PROXY = false;
|
||||||
grabber.resetProxy();
|
grabber.resetProxy();
|
||||||
@@ -251,7 +250,6 @@ public class StickersFragment extends ToolbarFragment {
|
|||||||
openMenu(getString("stickersproxy1"));
|
openMenu(getString("stickersproxy1"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case TYPE_TOASTER_SERVER:
|
|
||||||
case TYPE_DIRECT:
|
case TYPE_DIRECT:
|
||||||
final Runnable work = () -> {
|
final Runnable work = () -> {
|
||||||
LinearLayout linearLayout = new LinearLayout(super.n());
|
LinearLayout linearLayout = new LinearLayout(super.n());
|
||||||
@@ -372,7 +370,7 @@ public class StickersFragment extends ToolbarFragment {
|
|||||||
holder.switchCompat.setOnCheckedChangeListener((buttonView, isChecked) -> stickersService.setPackEnabled(pack, isChecked, false));
|
holder.switchCompat.setOnCheckedChangeListener((buttonView, isChecked) -> stickersService.setPackEnabled(pack, isChecked, false));
|
||||||
holder.count.setText(pack.stickersCount + " " + getString("stickerscount"));
|
holder.count.setText(pack.stickersCount + " " + getString("stickerscount"));
|
||||||
|
|
||||||
holder.layout.setBackgroundColor(getNavbarColor());
|
holder.layout.setBackgroundColor(getTabbarBackground());
|
||||||
|
|
||||||
// Color костыль
|
// Color костыль
|
||||||
int color = getTextAttr();
|
int color = getTextAttr();
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
package ru.vtosters.lite.ui.fragments.tgstickers;
|
package ru.vtosters.lite.ui.fragments.tgstickers;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
import static ru.vtosters.lite.utils.Globals.getString;
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -19,7 +19,7 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
|
|||||||
public void b(Bundle bundle) {
|
public void b(Bundle bundle) {
|
||||||
super.b(bundle);
|
super.b(bundle);
|
||||||
|
|
||||||
int vtosterXml = getContext().getResources().getIdentifier("empty", "xml", getContext().getPackageName());
|
int vtosterXml = getIdentifier("empty", "xml");
|
||||||
this.a(vtosterXml);
|
this.a(vtosterXml);
|
||||||
|
|
||||||
PreferencesUtil.addPreferenceCategory(this, getString("sprefsstickers"));
|
PreferencesUtil.addPreferenceCategory(this, getString("sprefsstickers"));
|
||||||
@@ -85,7 +85,7 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int aq() {
|
public int aq() {
|
||||||
return getContext().getResources().getIdentifier("vtltgs", "string", getContext().getPackageName());
|
return getIdentifier("vtltgs", "string");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.*;
|
import static ru.vtosters.lite.utils.Globals.getApplicationName;
|
||||||
import static ru.vtosters.lite.utils.Preferences.*;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.VERSIONNAME;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.oldabout;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
@@ -17,32 +20,34 @@ public class About {
|
|||||||
public static void injectAbout(List<Items2> list) {
|
public static void injectAbout(List<Items2> list) {
|
||||||
list.clear();
|
list.clear();
|
||||||
list.add(new Items1());
|
list.add(new Items1());
|
||||||
|
|
||||||
if (!oldabout()) {
|
if (!oldabout()) {
|
||||||
list.add(new Items(21, com.vtosters.lite.R.string.opencommit));
|
list.add(new Items(21, getIdentifier("opencommit", "string")));
|
||||||
list.add(new Items(8, com.vtosters.lite.R.string.tgchannel));
|
list.add(new Items(8, getIdentifier("tgchannel", "string")));
|
||||||
list.add(new Items(9, com.vtosters.lite.R.string.tgchat));
|
list.add(new Items(9, getIdentifier("tgchat", "string")));
|
||||||
list.add(new Items(16, com.vtosters.lite.R.string.vtfaq));
|
list.add(new Items(16, getIdentifier("vtfaq", "string")));
|
||||||
list.add(new Items(19, com.vtosters.lite.R.string.vtsite));
|
list.add(new Items(19, getIdentifier("vtsite", "string")));
|
||||||
list.add(new Items(20, com.vtosters.lite.R.string.donate));
|
list.add(new Items(20, getIdentifier("donate", "string")));
|
||||||
list.add(new Items(17, com.vtosters.lite.R.string.vkgroup));
|
list.add(new Items(17, getIdentifier("vkgroup", "string")));
|
||||||
list.add(new Items(18, com.vtosters.lite.R.string.sett_debug));
|
list.add(new Items(18, getIdentifier("sett_debug", "string")));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
list.add(new Items(0, com.vtosters.lite.R.string.about_app_feedback));
|
|
||||||
list.add(new Items(1, com.vtosters.lite.R.string.about_app_estimate));
|
list.add(new Items(0, getIdentifier("about_app_feedback", "string")));
|
||||||
list.add(new Items(2, com.vtosters.lite.R.string.about_app_privacy));
|
list.add(new Items(1, getIdentifier("about_app_estimate", "string")));
|
||||||
list.add(new Items(5, com.vtosters.lite.R.string.about_app_cookie));
|
list.add(new Items(2, getIdentifier("about_app_privacy", "string")));
|
||||||
list.add(new Items(3, com.vtosters.lite.R.string.about_app_terms_to_use));
|
list.add(new Items(5, getIdentifier("about_app_cookie", "string")));
|
||||||
list.add(new Items(4, com.vtosters.lite.R.string.about_app_license));
|
list.add(new Items(3, getIdentifier("about_app_terms_to_use", "string")));
|
||||||
list.add(new Items(6, com.vtosters.lite.R.string.about_app_data_protect));
|
list.add(new Items(4, getIdentifier("about_app_license", "string")));
|
||||||
list.add(new Items(8, com.vtosters.lite.R.string.sett_debug));
|
list.add(new Items(6, getIdentifier("about_app_data_protect", "string")));
|
||||||
|
list.add(new Items(8, getIdentifier("sett_debug", "string")));
|
||||||
}
|
}
|
||||||
public static String getBuildNumber() {
|
public static String getBuildNumber() {
|
||||||
return getBuild(getContext(), "version.properties");
|
return getBuild(getContext(), "version.properties");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getCommitLink() {
|
public static String getCommitLink() {
|
||||||
return "https://github.com/vtosters/lite/commit/" + getBuild(getContext(), "version.properties");
|
return "https://git.maki.su/gdlbo/lite/commit/" + getBuild(getContext(), "version.properties"); // https://github.com/vtosters/lite/commit/ github repo
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getBuild(Context context, String name) {
|
public static String getBuild(Context context, String name) {
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
|
import android.content.ContentValues;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.vk.im.engine.events.OnMsgUpdateEvent;
|
||||||
|
import com.vk.im.engine.internal.longpoll.a.MsgDeleteLpTask;
|
||||||
|
import com.vk.im.engine.internal.storage.CacheEnvironment;
|
||||||
|
import com.vk.im.engine.models.messages.Msg;
|
||||||
|
import com.vk.im.engine.models.messages.MsgFromUser;
|
||||||
|
import com.vk.im.engine.models.messages.NestedMsg;
|
||||||
|
import com.vk.libsqliteext.CustomSqliteExtensions;
|
||||||
|
|
||||||
|
import org.sqlite.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import ru.vtosters.lite.encryption.EncryptProvider;
|
||||||
|
|
||||||
|
public class DeletedMessagesHandler {
|
||||||
|
private static List<Integer> sDeletedMessagesList = new ArrayList<>();
|
||||||
|
|
||||||
|
private static SQLiteDatabase sVKSQLiteDatabase;
|
||||||
|
private static int sBodyIndex = -1;
|
||||||
|
private static DeletedMessagesDBHelper sVTDatabase;
|
||||||
|
|
||||||
|
public static void reloadMessagesList() {
|
||||||
|
if (sVTDatabase == null) {
|
||||||
|
sVTDatabase = new DeletedMessagesDBHelper();
|
||||||
|
}
|
||||||
|
sDeletedMessagesList = new ArrayList<>(sVTDatabase.loadAllMessages());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void grabVKDatabase(CacheEnvironment storageEnvironment) {
|
||||||
|
sVKSQLiteDatabase = storageEnvironment.b();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hook() {
|
||||||
|
return getBoolValue("undeletemsg", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setBodyDBParser(Msg msg) {
|
||||||
|
if (!(msg instanceof MsgFromUser)) return;
|
||||||
|
|
||||||
|
for (Integer integer : sDeletedMessagesList) {
|
||||||
|
MsgFromUser msgFromUser = (MsgFromUser) msg;
|
||||||
|
checkForNestedMsg(msgFromUser.g);
|
||||||
|
if (integer == msg.d) {
|
||||||
|
editTextOfMsg((MsgFromUser) msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkForNestedMsg(List<NestedMsg> nestedMsgs) {
|
||||||
|
for (NestedMsg nestedMsg : nestedMsgs) {
|
||||||
|
if (!nestedMsg.i.isEmpty()) checkForNestedMsg(nestedMsg.i);
|
||||||
|
|
||||||
|
nestedMsg.b(EncryptProvider.decryptMessage(nestedMsg.E(), nestedMsg.h().c));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void editTextOfMsg(MsgFromUser msgFromUser) {
|
||||||
|
if (!msgFromUser.e.startsWith(getPreifxUndelete())) {
|
||||||
|
msgFromUser.e = getPreifxUndelete() + EncryptProvider.decryptMessage(msgFromUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getPreifxUndelete() {
|
||||||
|
return getPrefsValue("undeletemsg_prefix_value") + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateDialog(MsgDeleteLpTask msgDeleteLpTask) {
|
||||||
|
Cursor c = getMessageFromDatabaseById(msgDeleteLpTask.c);
|
||||||
|
if (c == null) return;
|
||||||
|
|
||||||
|
int localId = c.getInt(c.getColumnIndex("local_id"));
|
||||||
|
|
||||||
|
String str = DeletedMessagesHandler.class.getSimpleName();
|
||||||
|
msgDeleteLpTask.a.a(str, new OnMsgUpdateEvent(str, msgDeleteLpTask.b, localId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void hookDeletedMessageId(MsgDeleteLpTask msgDeleteLpTask) {
|
||||||
|
if (!hook()) return;
|
||||||
|
|
||||||
|
int messageId = msgDeleteLpTask.c;
|
||||||
|
|
||||||
|
Cursor c = getMessageFromDatabaseById(messageId);
|
||||||
|
if (c == null) return;
|
||||||
|
if (sBodyIndex == -1) sBodyIndex = c.getColumnIndex("body");
|
||||||
|
if (TextUtils.isEmpty(c.getString(sBodyIndex))) {
|
||||||
|
deleteMessageFromDB(messageId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sDeletedMessagesList.add(messageId);
|
||||||
|
sVTDatabase.saveDeletedMessage(messageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Cursor getMessageFromDatabaseById(int messageId) {
|
||||||
|
String query = "SELECT * FROM messages WHERE vk_id = " + messageId;
|
||||||
|
Cursor c = CustomSqliteExtensions.a(sVKSQLiteDatabase, query);
|
||||||
|
if (!c.moveToFirst()) return null;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteMessageFromDB(int messageId) {
|
||||||
|
sVKSQLiteDatabase.execSQL("DELETE FROM messages WHERE vk_id = " + messageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DeletedMessagesDBHelper extends SQLiteOpenHelper {
|
||||||
|
public DeletedMessagesDBHelper() {
|
||||||
|
super(getContext(), "deleted_msgs", null, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(android.database.sqlite.SQLiteDatabase db) {
|
||||||
|
db.execSQL("create table deleted_msgs (id integer primary key, msgId integer)");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpgrade(android.database.sqlite.SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveDeletedMessage(int msgId) {
|
||||||
|
android.database.sqlite.SQLiteDatabase sqLiteDatabase = getWritableDatabase();
|
||||||
|
|
||||||
|
ContentValues contentValues = new ContentValues();
|
||||||
|
contentValues.put("msgId", msgId);
|
||||||
|
|
||||||
|
sqLiteDatabase.insert("deleted_msgs", null, contentValues);
|
||||||
|
sqLiteDatabase.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Integer> loadAllMessages() {
|
||||||
|
List<Integer> msgIdsList = new ArrayList<>();
|
||||||
|
|
||||||
|
Cursor cursor = getReadableDatabase().query("deleted_msgs", null, null, null, null, null, null);
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
int msgIdIndex = cursor.getColumnIndex("msgId");
|
||||||
|
|
||||||
|
do {
|
||||||
|
msgIdsList.add(cursor.getInt(msgIdIndex));
|
||||||
|
} while (cursor.moveToNext());
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return msgIdsList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ package ru.vtosters.lite.utils;
|
|||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Globals.isEmpty;
|
import static ru.vtosters.lite.utils.Globals.isEmpty;
|
||||||
import static ru.vtosters.lite.utils.Preferences.*;
|
import static ru.vtosters.lite.utils.Preferences.isEnableExternalOpening;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
|
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.support.v4.app.FragmentTransaction;
|
||||||
|
|
||||||
|
public class FragAnimationKit {
|
||||||
|
// Q
|
||||||
|
private static final int actOpenEnter = getIdentifier("q_enter", "anim");
|
||||||
|
private static final int actCloseExit = getIdentifier("q_pop_exit", "anim");
|
||||||
|
// Slide
|
||||||
|
private static final int SactOpenEnter = getIdentifier("legacy_enter", "anim");
|
||||||
|
private static final int SactCloseExit = getIdentifier("legacy_pop_exit", "anim");
|
||||||
|
// Fade
|
||||||
|
private static final int FadeOpenEnter = getIdentifier("vkme_enter_slide_up", "anim");
|
||||||
|
private static final int FadeCloseExit = getIdentifier("vkme_enter_slide_down", "anim");
|
||||||
|
// System
|
||||||
|
private static final Resources resources = Resources.getSystem();
|
||||||
|
private static final int SSactOpenEnter = resources.getIdentifier("activity_open_enter", "anim","android");
|
||||||
|
private static final int SSactCloseExit = resources.getIdentifier("activity_close_exit", "anim", "android");
|
||||||
|
// System [task]
|
||||||
|
private static final int SSTactOpenEnter = resources.getIdentifier("task_open_enter", "anim","android");
|
||||||
|
private static final int SSTactCloseExit = resources.getIdentifier("task_close_exit", "anim", "android");
|
||||||
|
|
||||||
|
public static void animateOpen(FragmentTransaction transaction) {
|
||||||
|
setAnimations(transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void animateClose(FragmentTransaction transaction) {
|
||||||
|
setAnimations(transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setAnimations(FragmentTransaction transaction) {
|
||||||
|
if (transaction != null && !getPrefsValue("anim_rtrn_type").equals("noanim")) {
|
||||||
|
switch (getPrefsValue("anim_rtrn_type")) {
|
||||||
|
case "q":
|
||||||
|
transaction.a(
|
||||||
|
actOpenEnter,
|
||||||
|
actCloseExit
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "fade":
|
||||||
|
transaction.a(
|
||||||
|
FadeOpenEnter,
|
||||||
|
FadeCloseExit
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "slide":
|
||||||
|
transaction.a(
|
||||||
|
SactOpenEnter,
|
||||||
|
SactCloseExit
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "system":
|
||||||
|
transaction.a(
|
||||||
|
SSactOpenEnter,
|
||||||
|
SSactCloseExit
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "system_task":
|
||||||
|
transaction.a(
|
||||||
|
SSTactOpenEnter,
|
||||||
|
SSTactCloseExit
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Preferences.getLocale;
|
import static ru.vtosters.lite.utils.Preferences.getLocale;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.preferences;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.app.NotificationChannel;
|
import android.app.NotificationChannel;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
@@ -16,10 +18,12 @@ import android.net.NetworkInfo;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
|
||||||
import com.vk.core.util.ToastUtils;
|
|
||||||
import com.vtosters.lite.UserProfile;
|
import com.vtosters.lite.UserProfile;
|
||||||
import com.vtosters.lite.VKActivity;
|
import com.vtosters.lite.VKActivity;
|
||||||
import com.vtosters.lite.api.ExtendedUserProfile;
|
import com.vtosters.lite.api.ExtendedUserProfile;
|
||||||
@@ -34,10 +38,23 @@ import java.util.Locale;
|
|||||||
public class Globals {
|
public class Globals {
|
||||||
private static final List<Activity> activities = new ArrayList<>();
|
private static final List<Activity> activities = new ArrayList<>();
|
||||||
|
|
||||||
// Current UserId
|
public static SharedPreferences getDefprefs() {
|
||||||
|
if (preferences == null) preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||||
|
return preferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void componentSwitcher(String component, Boolean enabled) {
|
||||||
|
var packageManager = getContext().getPackageManager();
|
||||||
|
packageManager.setComponentEnabledSetting(new ComponentName(getPackageName(), getPackageName() + "." + component), enabled? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
||||||
|
} // Component switcher for changing app icon
|
||||||
|
|
||||||
|
public static String getPrefsValue(String pref) {
|
||||||
|
return getPreferences().getString(pref, "");
|
||||||
|
} // Get pref value as string
|
||||||
|
|
||||||
public static int getUserId() {
|
public static int getUserId() {
|
||||||
return VKAccountManager.b().a();
|
return VKAccountManager.b().a();
|
||||||
}
|
} // Current UserId
|
||||||
|
|
||||||
public static String getUserSecret() {
|
public static String getUserSecret() {
|
||||||
return VKAccountManager.b().c();
|
return VKAccountManager.b().c();
|
||||||
@@ -49,17 +66,15 @@ public class Globals {
|
|||||||
|
|
||||||
public static SharedPreferences.Editor edit() {
|
public static SharedPreferences.Editor edit() {
|
||||||
return PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
|
return PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
|
||||||
}
|
} // Edit SharedPreferences
|
||||||
|
|
||||||
// Delete and reload msg cache
|
|
||||||
public static void reloadMSG() {
|
public static void reloadMSG() {
|
||||||
ImEngineProvider.a().h();
|
ImEngineProvider.a().h();
|
||||||
}
|
} // Delete and reload msg cache
|
||||||
|
|
||||||
// UserId Profile via userProfile
|
|
||||||
public static int getUserID(UserProfile userProfile) {
|
public static int getUserID(UserProfile userProfile) {
|
||||||
return userProfile.n;
|
return userProfile.n;
|
||||||
}
|
} // UserId Profile via userProfile
|
||||||
|
|
||||||
public static String getUserFirstName(UserProfile userProfile) {
|
public static String getUserFirstName(UserProfile userProfile) {
|
||||||
return userProfile.p;
|
return userProfile.p;
|
||||||
@@ -69,26 +84,25 @@ public class Globals {
|
|||||||
return userProfile.o;
|
return userProfile.o;
|
||||||
}
|
}
|
||||||
|
|
||||||
// UserId Profile via extendedUserProfile
|
|
||||||
public static int getUserID(ExtendedUserProfile extendedUserProfile) {
|
public static int getUserID(ExtendedUserProfile extendedUserProfile) {
|
||||||
return getUserID(fromEup(extendedUserProfile));
|
return getUserID(fromEup(extendedUserProfile));
|
||||||
}
|
} // UserId Profile via extendedUserProfile
|
||||||
|
|
||||||
public static UserProfile fromEup(ExtendedUserProfile extendedUserProfile) {
|
public static UserProfile fromEup(ExtendedUserProfile extendedUserProfile) {
|
||||||
return extendedUserProfile.a;
|
return extendedUserProfile.a;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Application restart (works on sdk 29+ too)
|
|
||||||
public static void restartApplication() {
|
public static void restartApplication() {
|
||||||
Context ctx = getContext();
|
Context ctx = getContext();
|
||||||
PackageManager pm = ctx.getPackageManager();
|
PackageManager pm = ctx.getPackageManager();
|
||||||
|
|
||||||
Intent intent = pm.getLaunchIntentForPackage(ctx.getPackageName());
|
Intent intent = pm.getLaunchIntentForPackage(ctx.getPackageName());
|
||||||
Intent mainIntent = Intent.makeRestartActivityTask(intent.getComponent());
|
Intent mainIntent = Intent.makeRestartActivityTask(intent.getComponent());
|
||||||
ctx.startActivity(mainIntent);
|
ctx.startActivity(mainIntent);
|
||||||
Runtime.getRuntime().exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Global Context
|
Runtime.getRuntime().exit(0);
|
||||||
|
} // Application restart (works on sdk 29+ too)
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static Context getContext() {
|
public static Context getContext() {
|
||||||
try {
|
try {
|
||||||
@@ -100,9 +114,9 @@ public class Globals {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
} // Getting the global context through reflection to use context on application initialization
|
||||||
|
|
||||||
|
|
||||||
// Google Market Services check
|
|
||||||
public static boolean isGmsInstalled() {
|
public static boolean isGmsInstalled() {
|
||||||
try {
|
try {
|
||||||
getContext().getPackageManager().getPackageInfo("com.google.android.gms", 0);
|
getContext().getPackageManager().getPackageInfo("com.google.android.gms", 0);
|
||||||
@@ -110,18 +124,28 @@ public class Globals {
|
|||||||
} catch (Exception unused) {
|
} catch (Exception unused) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
} // Google Market Services check
|
||||||
|
|
||||||
public static Resources getResources() {
|
public static Resources getResources() {
|
||||||
return getContext().getResources();
|
return getContext().getResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getIdentifier(String str, String str2) {
|
public static int getIdentifier(String name, String type) {
|
||||||
return getResources().getIdentifier(str, str2, getContext().getPackageName());
|
try {
|
||||||
}
|
return getResources().getIdentifier(name, type, getContext().getPackageName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d("VTLite", "Not found " + name + "as type " + type);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} // Get res id
|
||||||
|
|
||||||
public static String getString(String str) {
|
public static String getString(String resourcename) {
|
||||||
return getContext().getString(Integer.parseInt(String.valueOf(getContext().getResources().getIdentifier(str, "string", getContext().getPackageName()))));
|
return getContext().getString(getIdentifier(resourcename, "string"));
|
||||||
|
} // Get string via getIdentifier
|
||||||
|
|
||||||
|
public static String getStringDate(@StringRes int i, Object... objArr) {
|
||||||
|
return getContext().getString(i, objArr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getPackageName() {
|
public static String getPackageName() {
|
||||||
@@ -129,7 +153,7 @@ public class Globals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int convertDpToPixel(float f) {
|
public static int convertDpToPixel(float f) {
|
||||||
return (int) (f * ((float) getContext().getResources().getDisplayMetrics().densityDpi / 160.0f));
|
return (int) (f * ((float) getResources().getDisplayMetrics().densityDpi / 160.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SharedPreferences getPreferences() {
|
public static SharedPreferences getPreferences() {
|
||||||
@@ -137,7 +161,7 @@ public class Globals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void sendToast(String text) {
|
public static void sendToast(String text) {
|
||||||
ToastUtils.a(text);
|
Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEmpty(String str) {
|
public static boolean isEmpty(String str) {
|
||||||
@@ -148,28 +172,25 @@ public class Globals {
|
|||||||
ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
|
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
|
||||||
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
|
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
|
||||||
}
|
} // Network check
|
||||||
|
|
||||||
// Music channels fix
|
|
||||||
public static void fixGapps() {
|
public static void fixGapps() {
|
||||||
try {
|
try {
|
||||||
if (Build.VERSION.SDK_INT >= 26) {
|
if (Build.VERSION.SDK_INT >= 26) {
|
||||||
NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
boolean z = false;
|
boolean hasMusicChannel = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (notificationManager.getNotificationChannel("audio_playback_channel") != null) {
|
if (notificationManager.getNotificationChannel("audio_playback_channel") != null) {
|
||||||
z = true;
|
hasMusicChannel = true;
|
||||||
}
|
}
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {}
|
||||||
}
|
if (!hasMusicChannel) {
|
||||||
if (!z) {
|
notificationManager.createNotificationChannel(new NotificationChannel("audio_playback_channel", getResources().getString(getIdentifier("audio_message_play_error", "string")), NotificationManager.IMPORTANCE_LOW));
|
||||||
notificationManager.createNotificationChannel(new NotificationChannel("audio_playback_channel", getResources().getString(com.vtosters.lite.R.string.audio_message_play_error), NotificationManager.IMPORTANCE_LOW));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {}
|
||||||
}
|
} // Music channels fix
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void registerActivities(Application application) {
|
public static void registerActivities(Application application) {
|
||||||
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
|
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
|
||||||
@@ -207,24 +228,41 @@ public class Globals {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Activity getCurrentActivity() {
|
||||||
|
if (activities.size() == 0) return null;
|
||||||
|
else return activities.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
public static String getApplicationName() {
|
public static String getApplicationName() {
|
||||||
return getContext().getApplicationInfo().loadLabel(getContext().getPackageManager()).toString();
|
return getContext().getApplicationInfo().loadLabel(getContext().getPackageManager()).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Language changer and BaseContext inject
|
|
||||||
public static Context BaseContextLocale(Context context) {
|
public static Context BaseContextLocale(Context context) {
|
||||||
Locale locale = new Locale(getLocale());
|
Locale locale = new Locale(getLocale());
|
||||||
Locale.setDefault(locale);
|
Locale.setDefault(locale);
|
||||||
|
|
||||||
var resources = context.getResources();
|
var resources = context.getResources();
|
||||||
var configuration = resources.getConfiguration();
|
var configuration = resources.getConfiguration();
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 24) {
|
if (Build.VERSION.SDK_INT >= 24) {
|
||||||
configuration.setLocale(locale);
|
configuration.setLocale(locale);
|
||||||
configuration.setLayoutDirection(locale);
|
configuration.setLayoutDirection(locale);
|
||||||
return context.createConfigurationContext(configuration);
|
return context.createConfigurationContext(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
configuration.locale = locale;
|
configuration.locale = locale;
|
||||||
configuration.setLayoutDirection(locale);
|
configuration.setLayoutDirection(locale);
|
||||||
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
|
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
|
} // Language changer and BaseContext injector
|
||||||
|
|
||||||
|
public static float[] getCenterScreenCoords() {
|
||||||
|
int width = getResources().getDisplayMetrics().widthPixels;
|
||||||
|
int height = getResources().getDisplayMetrics().heightPixels;
|
||||||
|
|
||||||
|
int centerWidth = width/2;
|
||||||
|
int centerHeight = height/2;
|
||||||
|
return new float[] {centerWidth, centerHeight};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
package ru.vtosters.lite.utils;
|
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
|
||||||
import static ru.vtosters.lite.utils.Globals.getPackageName;
|
|
||||||
|
|
||||||
import android.content.ComponentName;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
|
|
||||||
public class IconHelper {
|
|
||||||
public static void switchToVK() {
|
|
||||||
var packageManager = getContext().getPackageManager();
|
|
||||||
var packageName = getPackageName();
|
|
||||||
packageManager.setComponentEnabledSetting(new ComponentName(packageName, getPackageName() + ".VTIconDefault"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
|
||||||
packageManager.setComponentEnabledSetting(new ComponentName(packageName, getPackageName() + ".VTIconVK"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void switchToDefault() {
|
|
||||||
var packageManager = getContext().getPackageManager();
|
|
||||||
var packageName = getPackageName();
|
|
||||||
packageManager.setComponentEnabledSetting(new ComponentName(packageName, getPackageName() + ".VTIconDefault"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
|
|
||||||
packageManager.setComponentEnabledSetting(new ComponentName(packageName, getPackageName() + ".VTIconVK"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.donaterecomm;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.hasVerification;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class JsonInjectors {
|
||||||
|
public static JSONObject profileButton() throws JSONException {
|
||||||
|
String pic = "https:\\/\\/sun1-18.userapi.com\\/NLd_rNpGuSaBnPV6O-j5mqCGZk8BK8drAMd2LQ\\/5R-DEF37PFs.png";
|
||||||
|
String title = "Помоги проекту донатом и получи бонус!";
|
||||||
|
String link = "https:\\/\\/vk.com\\/vtosters_official";
|
||||||
|
String text_color = "2D81E0";
|
||||||
|
|
||||||
|
JSONObject jsonObj = new JSONObject("{\"action\":{\"target\":\"internal\",\"type\":\"open_url\",\"url\":\"" + link + "\"},\"title\":\"" + title + "\",\"icons\":[{\"url\":\"" + pic + "\",\"width\":20,\"height\":20},{\"url\":\"" + pic + "\",\"width\":40,\"height\":40},{\"url\":\"" + pic + "\",\"width\":60,\"height\":60},{\"url\":\"" + pic + "\",\"width\":80,\"height\":80}],\"text_color\":\"" + text_color + "\"}");
|
||||||
|
return jsonObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONObject discoverBanner() throws JSONException {
|
||||||
|
String smallimg = "https:\\/\\/sun1-25.userapi.com\\/3D4YtNHjgwoyxav3FksnYRINp_FhWULuDKYdcA\\/zfCUgKMS0O4.png";
|
||||||
|
String background = "https:\\/\\/images.wsj.net\\/im-501403";
|
||||||
|
String title = "Задонать";
|
||||||
|
String desc = "Помоги проекту донатом и получи приятные бонусы на аккаунт";
|
||||||
|
String text_color = "ffffff";
|
||||||
|
|
||||||
|
JSONObject jsonObj = new JSONObject("{\"title\":\"" + title + "\",\"description\":\"" + desc + "\",\"text_color\":\"#" + text_color + "\",\"image\":[{\"url\":\"" + smallimg + "\",\"width\":72,\"height\":72},{\"url\":\"" + smallimg + "\",\"width\":108,\"height\":108},{\"url\":\"" + smallimg + "\",\"width\":144,\"height\":144},{\"url\":\"" + smallimg + "\",\"width\":216,\"height\":216},{\"url\":\"" + smallimg + "\",\"width\":288,\"height\":288}],\"background\":[{\"url\":\"" + background + "\",\"width\":344,\"height\":215},{\"url\":\"" + background + "\",\"width\":516,\"height\":323},{\"url\":\"" + background + "\",\"width\":680,\"height\":426},{\"url\":\"" + background + "\",\"width\":1032,\"height\":645},{\"url\":\"" + background + "\",\"width\":1376,\"height\":860}]}");
|
||||||
|
return jsonObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONObject discoverBannerButton() throws JSONException {
|
||||||
|
String link = "vk.com\\/vtosters_official";
|
||||||
|
|
||||||
|
JSONObject jsonObj = new JSONObject("{\"type\":\"open_url\",\"url\":\"" + link + "\",\"target\":\"internal\"}");
|
||||||
|
return jsonObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String haveDonateBanner() {
|
||||||
|
Random random = new Random();
|
||||||
|
int randomshower = random.nextInt(8);
|
||||||
|
|
||||||
|
return hasVerification() || donaterecomm() || randomshower != 1 ? "null" : "info";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String haveDonateButton() {
|
||||||
|
Random random = new Random();
|
||||||
|
int randomshower = random.nextInt(10);
|
||||||
|
|
||||||
|
return hasVerification() || donaterecomm() || randomshower != 1 ? "null" : "buttons";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,20 +3,20 @@ package ru.vtosters.lite.utils;
|
|||||||
import static java.lang.Long.MAX_VALUE;
|
import static java.lang.Long.MAX_VALUE;
|
||||||
import static ru.vtosters.lite.ui.fragments.dockbar.DockBarManager.getInstance;
|
import static ru.vtosters.lite.ui.fragments.dockbar.DockBarManager.getInstance;
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
|
import static ru.vtosters.lite.utils.Preferences.CommentsSort;
|
||||||
import static ru.vtosters.lite.utils.Preferences.adsgroup;
|
import static ru.vtosters.lite.utils.Preferences.adsgroup;
|
||||||
import static ru.vtosters.lite.utils.Preferences.adsstories;
|
import static ru.vtosters.lite.utils.Preferences.adsstories;
|
||||||
import static ru.vtosters.lite.utils.Preferences.authorsrecomm;
|
import static ru.vtosters.lite.utils.Preferences.authorsrecomm;
|
||||||
import static ru.vtosters.lite.utils.Preferences.copyright_post;
|
import static ru.vtosters.lite.utils.Preferences.copyright_post;
|
||||||
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
|
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
import static ru.vtosters.lite.utils.Preferences.newfeed;
|
import static ru.vtosters.lite.utils.Preferences.newfeed;
|
||||||
import static ru.vtosters.lite.utils.Preferences.postsrecomm;
|
import static ru.vtosters.lite.utils.Preferences.postsrecomm;
|
||||||
|
|
||||||
import com.vk.apps.AppsFragment;
|
import com.vk.apps.AppsFragment;
|
||||||
import com.vk.core.preference.Preference;
|
import com.vk.core.preference.Preference;
|
||||||
import com.vk.discover.DiscoverFragment;
|
import com.vk.discover.DiscoverFragment;
|
||||||
import com.vk.discover.GatewaysFragment;
|
|
||||||
import com.vk.fave.fragments.FaveTabFragment;
|
import com.vk.fave.fragments.FaveTabFragment;
|
||||||
import com.vk.menu.MenuFragment;
|
import com.vk.menu.MenuFragment;
|
||||||
import com.vk.music.fragment.MusicFragment;
|
import com.vk.music.fragment.MusicFragment;
|
||||||
@@ -52,9 +52,7 @@ public class Newsfeed {
|
|||||||
|
|
||||||
public static boolean isBlockedByFilter(String str) {
|
public static boolean isBlockedByFilter(String str) {
|
||||||
for (String str2 : mFilters) {
|
for (String str2 : mFilters) {
|
||||||
if (str.toLowerCase().contains(str2.toLowerCase())) {
|
if (str.toLowerCase().contains(str2.toLowerCase())) return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -67,16 +65,16 @@ public class Newsfeed {
|
|||||||
getFilter("default_ad_list", "StandartFilter.txt");
|
getFilter("default_ad_list", "StandartFilter.txt");
|
||||||
getFilter("shitposting", "IDontWantToReadIt.txt");
|
getFilter("shitposting", "IDontWantToReadIt.txt");
|
||||||
|
|
||||||
String string = getPreferences().getString("spamfilters", "");
|
String customfilters = getPrefsValue("spamfilters");
|
||||||
|
|
||||||
if (!string.isEmpty()) {
|
if (!customfilters.isEmpty()) {
|
||||||
mFilters.addAll(Arrays.asList(string.split(", ")));
|
mFilters.addAll(Arrays.asList(customfilters.split(", ")));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getFilter(String boolname, String filename) {
|
public static void getFilter(String boolname, String filename) {
|
||||||
if (BooleanTrue(boolname)) {
|
if (getBoolValue(boolname, true)) {
|
||||||
try {
|
try {
|
||||||
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getContext().getAssets().open(filename)));
|
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getContext().getAssets().open(filename)));
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -92,35 +90,34 @@ public class Newsfeed {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // Get needed filter list from assets
|
||||||
|
|
||||||
public static boolean injectFilters(JSONObject jSONObject) {
|
public static boolean injectFilters(JSONObject jSONObject) {
|
||||||
String optString = jSONObject.optString(NavigatorKeys.j, "");
|
String optString = jSONObject.optString(NavigatorKeys.j, "");
|
||||||
if (!ads(optString) && !authors_rec(optString) && !recomm(optString) && !friendrecomm(optString)) {
|
if (!ads(optString) && !checkCopyright(optString) && !authors_rec(optString) && !recomm(optString) && !friendrecomm(optString)) {
|
||||||
String optString2 = jSONObject.optString("post_type", "");
|
String optString2 = jSONObject.optString("post_type", "");
|
||||||
if (!ads(optString2) && !authors_rec(optString2) && !recomm(optString2) && !friendrecomm(optString2)) {
|
if (!ads(optString2) && !authors_rec(optString2) && !recomm(optString2) && !friendrecomm(optString2)) {
|
||||||
String optString3 = jSONObject.optString("filters", "");
|
String optString3 = jSONObject.optString("filters", "");
|
||||||
if (ads(optString3) || authors_rec(optString3) || recomm(optString3) || friendrecomm(optString3) || isBlockedByFilter(jSONObject.optString(NavigatorKeys.x, "")) || checkCopyright(jSONObject) || captions(jSONObject)) {
|
if (ads(optString3) || authors_rec(optString3) || recomm(optString3) || friendrecomm(optString3) || isBlockedByFilter(jSONObject.optString(NavigatorKeys.x, "")) || captions(jSONObject)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !AD(jSONObject);
|
return !AD(jSONObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
} // json newsfeed/posts injector to detect and delete posts
|
||||||
|
|
||||||
public static boolean authors_rec(String str) {
|
public static boolean authors_rec(String str) {
|
||||||
return str.equals("authors_rec") && !authorsrecomm();
|
return str.equals("authors_rec") && authorsrecomm();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean captions(JSONObject jSONObject) {
|
public static boolean captions(JSONObject jSONObject) {
|
||||||
try {
|
try {
|
||||||
JSONObject jSONObject2 = jSONObject.getJSONObject("caption");
|
JSONObject jSONObject2 = jSONObject.getJSONObject("caption");
|
||||||
if (!Preferences.captions()) {
|
if (Preferences.captions()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
boolean postsrecomm = postsrecomm();
|
return (jSONObject2.getString(NavigatorKeys.j).equals("explorebait") && postsrecomm()) || ((jSONObject2.getString(NavigatorKeys.j).equals("shared") && postsrecomm()) || ((jSONObject.getString(NavigatorKeys.j).equals("digest") && postsrecomm()) || ((jSONObject2.getString(NavigatorKeys.j).equals("commented") && postsrecomm()) || (jSONObject2.getString(NavigatorKeys.j).equals("voted") && postsrecomm()))));
|
||||||
return (jSONObject2.getString(NavigatorKeys.j).equals("explorebait") && !postsrecomm) || ((jSONObject2.getString(NavigatorKeys.j).equals("shared") && postsrecomm) || ((jSONObject.getString(NavigatorKeys.j).equals("digest") && postsrecomm) || ((jSONObject2.getString(NavigatorKeys.j).equals("commented") && postsrecomm) || (jSONObject2.getString(NavigatorKeys.j).equals("voted") && postsrecomm))));
|
|
||||||
} catch (JSONException unused) {
|
} catch (JSONException unused) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -134,31 +131,31 @@ public class Newsfeed {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean recomm(String str) {
|
public static boolean recomm(String str) {
|
||||||
return (str.equals("user_rec") || str.equals("live_recommended") || str.equals("inline_user_rec")) && !postsrecomm();
|
return (str.equals("user_rec") || str.equals("live_recommended") || str.equals("inline_user_rec")) && postsrecomm();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean friendrecomm(String str) {
|
public static boolean friendrecomm(String str) {
|
||||||
return str.equals("friends_recommendations") && !friendsrecomm();
|
return str.equals("friends_recommendations") && friendsrecomm();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean AD(JSONObject jSONObject) {
|
public static boolean AD(JSONObject jSONObject) {
|
||||||
return jSONObject.optInt("marked_as_ads", 0) == 1 && adsgroup();
|
return jSONObject.optInt("marked_as_ads", 0) == 1 && adsgroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean checkCopyright(JSONObject jSONObject) {
|
public static boolean checkCopyright(String str) {
|
||||||
return jSONObject.optInt("copyright", 0) == 1 && copyright_post();
|
return str.equals("copyright") && copyright_post();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String friendsads() {
|
public static String friendsads() {
|
||||||
return postsrecomm() ? "user_rec" : "null";
|
return postsrecomm() ? "null" : "user_rec";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getFriendRecomm() {
|
public static String getFriendRecomm() {
|
||||||
return friendsrecomm() ? "friends_recommendations" : "null";
|
return friendsrecomm() ? "null" : "friends_recommendations";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String authorsads() {
|
public static String authorsads() {
|
||||||
return authorsrecomm() ? "authors_rec" : "null";
|
return authorsrecomm() ? "null" : "authors_rec";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String widgetads() {
|
public static String widgetads() {
|
||||||
@@ -173,93 +170,63 @@ public class Newsfeed {
|
|||||||
return adsstories() ? "null" : "ads";
|
return adsstories() ? "null" : "ads";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getCommentsSort(String def) {
|
public static String getCommentsSort(int value) {
|
||||||
String string = getPreferences().getString("commentssort", "");
|
return !CommentsSort() && value == 2 || value == 1 ? "desc" : "asc";
|
||||||
if (string.isEmpty()) {
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
if (string.equals("new")) {
|
|
||||||
return "desc";
|
|
||||||
}
|
|
||||||
if (string.equals("old")) {
|
|
||||||
return "asc";
|
|
||||||
}
|
|
||||||
return def;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getUpdateNewsfeed(boolean refresh_timeout) {
|
public static long getUpdateNewsfeed(boolean refresh_timeout) {
|
||||||
String string = getPreferences().getString("newsupdate", "");
|
switch (getPrefsValue("newsupdate")) {
|
||||||
if (string.isEmpty()) {
|
case "no_update":
|
||||||
return Preference.b().getLong(refresh_timeout ? "refresh_timeout_top" : "refresh_timeout_recent", 600000L);
|
return MAX_VALUE;
|
||||||
|
case "imd_update":
|
||||||
|
return 10000L;
|
||||||
|
default:
|
||||||
|
return Preference.b().getLong(refresh_timeout ? "refresh_timeout_top" : "refresh_timeout_recent", 600000L);
|
||||||
}
|
}
|
||||||
if (string.equals("no_update")) {
|
|
||||||
return MAX_VALUE;
|
|
||||||
}
|
|
||||||
if (string.equals("imd_update")) {
|
|
||||||
return 10000L;
|
|
||||||
}
|
|
||||||
return Preference.b().getLong(refresh_timeout ? "refresh_timeout_top" : "refresh_timeout_recent", 600000L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Class getStartFragment() {
|
public static Class getStartFragment() {
|
||||||
String string = getPreferences().getString("start_values", "");
|
switch (getPrefsValue("start_values")) {
|
||||||
if (string.equals("default")) {
|
case "newsfeed":
|
||||||
return getInstance().getSelectedTabs().get(0).fragmentClass;
|
return newfeed() ? HomeFragment.class : NewsfeedFragment.class;
|
||||||
|
case "messenger":
|
||||||
|
return DialogsFragment.class;
|
||||||
|
case "groups":
|
||||||
|
return GroupsFragment.class;
|
||||||
|
case "music":
|
||||||
|
return MusicFragment.class;
|
||||||
|
case "friends":
|
||||||
|
return FriendsFragment.class;
|
||||||
|
case "photos":
|
||||||
|
return PhotosFragment.class;
|
||||||
|
case "videos":
|
||||||
|
return VideosFragment.class;
|
||||||
|
case "settings":
|
||||||
|
return SettingsListFragment.class;
|
||||||
|
case "apps":
|
||||||
|
return AppsFragment.class;
|
||||||
|
case "discover":
|
||||||
|
return DiscoverFragment.class;
|
||||||
|
case "notifications":
|
||||||
|
return NotificationsContainerFragment.class;
|
||||||
|
case "money":
|
||||||
|
return MoneyTransfersFragment.class;
|
||||||
|
case "games":
|
||||||
|
return GamesFragment.class;
|
||||||
|
case "liked":
|
||||||
|
return FaveTabFragment.class;
|
||||||
|
case "menu":
|
||||||
|
return MenuFragment.class;
|
||||||
|
case "profile":
|
||||||
|
return ProfileFragment.class;
|
||||||
|
case "lives":
|
||||||
|
return LivesTabsFragment.class;
|
||||||
|
case "docs":
|
||||||
|
return DocumentsViewFragment.class;
|
||||||
|
case "brtd":
|
||||||
|
return BirthdaysFragment.class;
|
||||||
|
default:
|
||||||
|
return getInstance().getSelectedTabs().get(0).fragmentClass;
|
||||||
}
|
}
|
||||||
if (string.equals("newsfeed")) {
|
|
||||||
return newfeed() ? HomeFragment.class : NewsfeedFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("messenger")) {
|
|
||||||
return DialogsFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("groups")) {
|
|
||||||
return GroupsFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("music")) {
|
|
||||||
return MusicFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("friends")) {
|
|
||||||
return FriendsFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("photos")) {
|
|
||||||
return PhotosFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("videos")) {
|
|
||||||
return VideosFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("settings")) {
|
|
||||||
return SettingsListFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("apps")) {
|
|
||||||
return AppsFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("discover")) {
|
|
||||||
return newfeed() ? GatewaysFragment.class : DiscoverFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("notifications")) {
|
|
||||||
return NotificationsContainerFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("money")) {
|
|
||||||
return MoneyTransfersFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("games")) {
|
|
||||||
return GamesFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("liked")) {
|
|
||||||
return FaveTabFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("menu")) {
|
|
||||||
return MenuFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("profile")) {
|
|
||||||
return ProfileFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("lives")) {
|
|
||||||
return LivesTabsFragment.class;
|
|
||||||
}
|
|
||||||
if (string.equals("docs")) {
|
|
||||||
return DocumentsViewFragment.class;
|
|
||||||
}
|
|
||||||
return string.equals("brtd") ? BirthdaysFragment.class : getInstance().getSelectedTabs().get(0).fragmentClass;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,18 +37,15 @@ public class OEMDetector {
|
|||||||
|
|
||||||
private static String getSystemProperty(String str) {
|
private static String getSystemProperty(String str) {
|
||||||
BufferedReader bufferedReader;
|
BufferedReader bufferedReader;
|
||||||
Throwable th;
|
|
||||||
BufferedReader bufferedReader2 = null;
|
|
||||||
try {
|
try {
|
||||||
bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("getprop " + str).getInputStream()), 1024);
|
bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("getprop " + str).getInputStream()), 1024);
|
||||||
try {
|
try {
|
||||||
String readLine = bufferedReader.readLine();
|
|
||||||
try {
|
try {
|
||||||
bufferedReader.close();
|
bufferedReader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return readLine;
|
return bufferedReader.readLine();
|
||||||
} catch (IOException ignored) {
|
} catch (IOException ignored) {
|
||||||
}
|
}
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.dev;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.opusmodule;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.vk.medianative.MediaNative;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class OpusLoader {
|
||||||
|
private static long timetracker;
|
||||||
|
private static boolean inited;
|
||||||
|
|
||||||
|
public static void LoadLibrary(String libname){
|
||||||
|
try {
|
||||||
|
System.loadLibrary(libname);
|
||||||
|
inited = true;
|
||||||
|
} catch (UnsatisfiedLinkError unused2) {
|
||||||
|
if(dev()) Log.d("VTLite", "Failed to load " + libname);
|
||||||
|
inited = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getLength() {
|
||||||
|
if (isReadyToUse()) {
|
||||||
|
long length = System.currentTimeMillis() - timetracker;
|
||||||
|
timetracker = System.currentTimeMillis();
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int AudioStartRecordBridge(String str) {
|
||||||
|
if (isReadyToUse()) {
|
||||||
|
// Init custom AudioStartRecord
|
||||||
|
timetracker = System.currentTimeMillis();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return MediaNative.nativeAudioStartRecord(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int AudioWriteFrameBridge(ByteBuffer buffer, int length) {
|
||||||
|
if (isReadyToUse()) {
|
||||||
|
// Init custom AudioWriteFrame
|
||||||
|
}
|
||||||
|
return MediaNative.nativeAudioWriteFrame(buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AudioStopRecordBridge() {
|
||||||
|
if (isReadyToUse()) {
|
||||||
|
// Init custom AudioStopRecord
|
||||||
|
}
|
||||||
|
MediaNative.nativeAudioStopRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isReadyToUse() {
|
||||||
|
return opusmodule() && inited;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,88 +1,128 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
|
import static android.os.Build.VERSION;
|
||||||
|
import static ru.vtosters.lite.f0x1d.VTVerifications.isVerified;
|
||||||
import static ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountManager.migrate;
|
import static ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountManager.migrate;
|
||||||
import static ru.vtosters.lite.utils.Globals.*;
|
import static ru.vtosters.lite.utils.DeletedMessagesHandler.reloadMessagesList;
|
||||||
import static ru.vtosters.lite.utils.Newsfeed.*;
|
import static ru.vtosters.lite.utils.Globals.fixGapps;
|
||||||
import static ru.vtosters.lite.utils.Proxy.*;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getString;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getStringDate;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getUserId;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.registerActivities;
|
||||||
|
import static ru.vtosters.lite.utils.Newsfeed.setupFilters;
|
||||||
|
import static ru.vtosters.lite.utils.OpusLoader.LoadLibrary;
|
||||||
|
import static ru.vtosters.lite.utils.Proxy.setProxy;
|
||||||
|
import static ru.vtosters.lite.utils.Themes.systemThemeChanger;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.vk.core.util.Screen;
|
import com.vk.core.util.Screen;
|
||||||
|
import com.vk.im.engine.models.users.UserSex;
|
||||||
import com.vtosters.lite.data.Users;
|
import com.vtosters.lite.data.Users;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
public class Preferences {
|
public class Preferences {
|
||||||
|
public static SharedPreferences preferences = getContext().getSharedPreferences("com.vtosters.lite_preferences", Context.MODE_PRIVATE);
|
||||||
|
|
||||||
public static String VERSIONNAME = "Beta";
|
public static String VERSIONNAME = "Beta";
|
||||||
|
|
||||||
|
public static Integer VKBUILD = 12116; // 3439 orig
|
||||||
|
public static String VKVER = "7.24"; // 5.29 orig
|
||||||
|
|
||||||
public static void init(Application application) {
|
public static void init(Application application) {
|
||||||
setupFilters();
|
setupFilters();
|
||||||
fixGapps();
|
fixGapps();
|
||||||
setProxy();
|
setProxy();
|
||||||
migrate();
|
migrate();
|
||||||
|
reloadMessagesList();
|
||||||
registerActivities(application);
|
registerActivities(application);
|
||||||
|
LoadLibrary("vkopustest");
|
||||||
|
systemThemeChanger();
|
||||||
|
} // VK Init
|
||||||
|
|
||||||
|
public static void forceOffline() {
|
||||||
|
if (setoffline() && !offline()) {
|
||||||
|
Users.b();
|
||||||
|
}
|
||||||
|
setupFilters();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean BooleanFalse(String key) {
|
public static boolean getBoolValue(String key, Boolean value) {
|
||||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
if (preferences == null) {
|
||||||
return prefs.getBoolean(key, false);
|
preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||||
|
}
|
||||||
|
return preferences.getBoolean(key, value);
|
||||||
|
} // Set bool by default and get value
|
||||||
|
|
||||||
|
public static SharedPreferences getPrefsFromFile(String filename) {
|
||||||
|
return getContext().getSharedPreferences(filename, Context.MODE_PRIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean BooleanTrue(String key) {
|
public static boolean opusmodule() {
|
||||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
return getBoolValue("opusmodule", true);
|
||||||
return prefs.getBoolean(key, true);
|
}
|
||||||
|
|
||||||
|
public static boolean systemtheme() {
|
||||||
|
return getBoolValue("systemtheme", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean authorsrecomm() {
|
public static boolean authorsrecomm() {
|
||||||
return BooleanTrue("authorsrecomm");
|
return getBoolValue("authorsrecomm", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean captions() {
|
public static boolean captions() {
|
||||||
return BooleanTrue("captions");
|
return getBoolValue("captions", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean copyright_post() {
|
public static boolean copyright_post() {
|
||||||
return BooleanFalse("copyright_post");
|
return getBoolValue("copyright_post", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean default_ad_list() {
|
public static boolean default_ad_list() {
|
||||||
return BooleanFalse("default_ad_list");
|
return getBoolValue("default_ad_list", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shitposting() {
|
public static boolean shitposting() {
|
||||||
return BooleanFalse("shitposting");
|
return getBoolValue("shitposting", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean friendsrecomm() {
|
public static boolean friendsrecomm() {
|
||||||
return BooleanTrue("friendsrecomm");
|
return getBoolValue("friendsrecomm", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isBGStickersEnabled() {
|
public static boolean isBGStickersEnabled() {
|
||||||
return BooleanTrue("isBGStickersEnabled");
|
return getBoolValue("isBGStickersEnabled", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean ads() {
|
public static boolean ads() {
|
||||||
return BooleanFalse("__dbg_no_ads");
|
return getBoolValue("__dbg_no_ads", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean adsgroup() {
|
public static boolean adsgroup() {
|
||||||
return BooleanFalse("adsgroup");
|
return getBoolValue("adsgroup", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean olddock() {
|
public static boolean oldicons() {
|
||||||
return BooleanFalse("olddock");
|
return getBoolValue("oldicons", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean adsslider() {
|
public static boolean adsslider() {
|
||||||
return BooleanFalse("__dbg_no_slider_ads");
|
return getBoolValue("__dbg_no_slider_ads", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean adsstories() {
|
public static boolean adsstories() {
|
||||||
return BooleanFalse("adsstories");
|
return getBoolValue("adsstories", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean alteremoji(Context context) {
|
public static boolean alteremoji(Context context) {
|
||||||
@@ -90,186 +130,183 @@ public class Preferences {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean alteremojipref() {
|
public static boolean alteremojipref() {
|
||||||
return BooleanFalse("alteremoji");
|
return getBoolValue("alteremoji", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean awayphp() {
|
public static boolean awayphp() {
|
||||||
return BooleanTrue("awayphp");
|
return getBoolValue("awayphp", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean VKUI_INJ() {
|
public static boolean VKUI_INJ() {
|
||||||
return BooleanTrue("VKUI_INJ");
|
return getBoolValue("VKUI_INJ", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean benchmark() {
|
public static boolean benchmark() {
|
||||||
return BooleanFalse("benchmark");
|
return getBoolValue("benchmark", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean calls() {
|
public static boolean calls() {
|
||||||
return BooleanTrue("calls");
|
return getBoolValue("calls", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean convUsersOnline() {
|
public static boolean convUsersOnline() {
|
||||||
return BooleanFalse("convUsersOnline");
|
return getBoolValue("convUsersOnline", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean darkmode() {
|
public static boolean darkmode() {
|
||||||
return BooleanTrue("darkmode");
|
return getBoolValue("darkmode", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean dev() {
|
public static boolean dev() {
|
||||||
return BooleanFalse("dev");
|
return getBoolValue("dev", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean devmenu() {
|
public static boolean devmenu() {
|
||||||
return BooleanFalse("devmenu");
|
return getBoolValue("devmenu", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean dnr() {
|
public static boolean dnr() {
|
||||||
return BooleanTrue("dnr");
|
return getBoolValue("dnr", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean dns() {
|
public static boolean dns() {
|
||||||
return BooleanTrue("dns");
|
return getBoolValue("dns", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean libverify() {
|
public static boolean libverify() {
|
||||||
return BooleanFalse("libverify");
|
return getBoolValue("libverify", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean dnt() {
|
public static boolean dnt() {
|
||||||
return BooleanTrue("dnt");
|
return getBoolValue("dnt", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean dockcounter() {
|
public static boolean dockcounter() {
|
||||||
return BooleanTrue("dockcounter");
|
return getBoolValue("dockcounter", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean feedcache() {
|
public static boolean feedcache() {
|
||||||
return BooleanTrue("feedcache");
|
return getBoolValue("feedcache", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void forceOffline() {
|
public static boolean CommentsSort() {
|
||||||
if (setoffline()) {
|
return getBoolValue("commentssorting", false);
|
||||||
Users.b();
|
|
||||||
}
|
|
||||||
setupFilters();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean fulltime() {
|
|
||||||
return BooleanTrue("fulltime");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean gcmfix() {
|
public static boolean gcmfix() {
|
||||||
return BooleanTrue("gcmfix");
|
return getBoolValue("gcmfix", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasMusicSubscription() {
|
public static boolean hasMusicSubscription() {
|
||||||
return BooleanTrue("hasMusicSubscription");
|
return getBoolValue("hasMusicSubscription", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEnableExternalOpening() {
|
public static boolean isEnableExternalOpening() {
|
||||||
return BooleanFalse("isEnableExternalOpening");
|
return getBoolValue("isEnableExternalOpening", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean iconvk() {
|
public static boolean iconvk() {
|
||||||
return BooleanFalse("iconvk");
|
return getBoolValue("iconvk", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean iconvkru() {
|
public static boolean iconvkru() {
|
||||||
return BooleanFalse("iconvkru");
|
return getBoolValue("iconvkru", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isMusicRestricted() {
|
public static boolean isMusicRestricted() {
|
||||||
return BooleanTrue("isMusicRestricted");
|
return getBoolValue("isMusicRestricted", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean msgflat() {
|
public static boolean msgflat() {
|
||||||
return BooleanFalse("msgflat");
|
return getBoolValue("msgflat", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean msgtails() {
|
public static boolean msgtails() {
|
||||||
return BooleanTrue("msgtails");
|
return getBoolValue("msgtails", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean navbar() {
|
public static boolean navbar() {
|
||||||
return BooleanTrue("navbar");
|
return getBoolValue("navbar", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean newfeed() {
|
public static boolean newfeed() {
|
||||||
return BooleanTrue("newfeed");
|
return getBoolValue("newfeed", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean offline() {
|
public static boolean offline() {
|
||||||
return BooleanTrue("offline");
|
return getBoolValue("offline", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean oldabout() {
|
public static boolean oldabout() {
|
||||||
return BooleanFalse("oldabout");
|
return getBoolValue("oldabout", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean postsrecomm() {
|
public static boolean postsrecomm() {
|
||||||
return BooleanTrue("postsrecomm");
|
return getBoolValue("postsrecomm", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String readstatus() {
|
public static String readstatus() {
|
||||||
return dnr() ? "messages.markAsRead" : "null";
|
return dnr() ? "messages.markAsRead" : "null";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String copyrightfix() {
|
||||||
|
return copyright_post() ? "copyright" : "ads_easy_promote";
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean refsfilter() {
|
public static boolean refsfilter() {
|
||||||
return BooleanFalse("refsfilter");
|
return getBoolValue("refsfilter", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean setoffline() {
|
public static boolean setoffline() {
|
||||||
return BooleanFalse("setoffline");
|
return getBoolValue("setoffline", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shortinfo() {
|
public static boolean shortinfo() {
|
||||||
return BooleanTrue("shortinfo");
|
return getBoolValue("shortinfo", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shortlinkfilter() {
|
public static boolean shortlinkfilter() {
|
||||||
return BooleanFalse("shortlinkfilter");
|
return getBoolValue("shortlinkfilter", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shortpost() {
|
public static boolean shortpost() {
|
||||||
return BooleanTrue("shortpost");
|
return getBoolValue("shortpost", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean showmenu() {
|
public static boolean showmenu() {
|
||||||
return BooleanFalse("showmenu");
|
return getBoolValue("showmenu", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean ssl() {
|
public static boolean ssl() {
|
||||||
return BooleanTrue("ssl");
|
return getBoolValue("ssl", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean stories() {
|
public static boolean stories() {
|
||||||
return BooleanTrue("stories");
|
return getBoolValue("stories", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean swipe() {
|
public static boolean swipe() {
|
||||||
return BooleanTrue("swipe");
|
return getBoolValue("swipe", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean systememoji() {
|
public static boolean systememoji() {
|
||||||
return BooleanFalse("systememoji");
|
return getBoolValue("systememoji", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean unlockstats() {
|
public static boolean unlockstats() {
|
||||||
return BooleanFalse("unlockstats");
|
return getBoolValue("unlockstats", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean usevkui() {
|
public static boolean usevkui() {
|
||||||
return BooleanTrue("usevkui");
|
return getBoolValue("usevkui", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean vksans() {
|
public static boolean vksans() {
|
||||||
return BooleanFalse("vksans");
|
return getBoolValue("vksans", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean voice() {
|
public static boolean voice() {
|
||||||
return BooleanTrue("voice");
|
return getBoolValue("voice", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean newvideo() {
|
public static boolean newvideo() {
|
||||||
@@ -277,43 +314,99 @@ public class Preferences {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int getMsgCount() {
|
public static int getMsgCount() {
|
||||||
String customvalue = getPreferences().getString("msgcount", "");
|
String customvalue = getPrefsValue("msgcount");
|
||||||
return customvalue.isEmpty() ? 30 : Integer.parseInt(customvalue);
|
return customvalue.isEmpty() ? 30 : Integer.parseInt(customvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String MediacontentFix() {
|
public static String MediacontentFix() {
|
||||||
return Build.VERSION.SDK_INT >= 29 ? "date_modified DESC" : "datetaken DESC";
|
return VERSION.SDK_INT >= 29 ? "date_modified DESC" : "datetaken DESC";
|
||||||
}
|
} // Fix photo picker for sdk 29+
|
||||||
|
|
||||||
public static String MediacontentFix2() {
|
public static String MediacontentFix2() {
|
||||||
return Build.VERSION.SDK_INT >= 29 ? "date_modified" : "datetaken";
|
return VERSION.SDK_INT >= 29 ? "date_modified" : "datetaken";
|
||||||
}
|
} // Fix photo picker for sdk 29+
|
||||||
|
|
||||||
public static String MediacontentFix3() {
|
public static String MediacontentFix3() {
|
||||||
return Build.VERSION.SDK_INT >= 29 ? ", date_modified=" : ", dateTaken=";
|
return VERSION.SDK_INT >= 29 ? ", date_modified=" : ", dateTaken=";
|
||||||
}
|
} // Fix photo picker for sdk 29+
|
||||||
|
|
||||||
public static boolean color_grishka() {
|
public static boolean color_grishka() {
|
||||||
return BooleanTrue("color_grishka");
|
return getBoolValue("color_grishka", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean vkme_msg() {
|
public static boolean vkme_msg() {
|
||||||
return BooleanFalse("vkme_msg");
|
return getBoolValue("vkme_msg", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean roundedmsgs() {
|
||||||
|
return getBoolValue("roundedmsgs", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean disableanimstickers() {
|
||||||
|
return getBoolValue("disableanimstickers", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean donaterecomm() {
|
||||||
|
return getBoolValue("donaterecomm", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String VKVersion() {
|
public static String VKVersion() {
|
||||||
String string = getPreferences().getString("vkversion", "");
|
return VKVER;
|
||||||
if (!string.isEmpty()) {
|
}
|
||||||
return string;
|
|
||||||
}
|
public static int VKVersionBuild() {
|
||||||
return "5.29";
|
return VKBUILD;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long VKVersionBuildLong() {
|
||||||
|
return VKVersionBuild();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasVerification() {
|
||||||
|
return isVerified(getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getLocale() {
|
public static String getLocale() {
|
||||||
String string = getPreferences().getString("lang_value", "");
|
String string = getPrefsValue("lang_value");
|
||||||
|
|
||||||
if (string.equals("system")) {
|
if (string.equals("system")) {
|
||||||
return Locale.getDefault().getLanguage();
|
return Locale.getDefault().getLanguage();
|
||||||
}
|
}
|
||||||
|
|
||||||
return string.isEmpty() ? Locale.getDefault().getLanguage() : string;
|
return string.isEmpty() ? Locale.getDefault().getLanguage() : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean fulltime() {
|
||||||
|
return getPrefsValue("dateformat").equals("noyear") || getPrefsValue("dateformat").equals("full") || getPrefsValue("dateformat").equals("noseconds");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDateFormat() {
|
||||||
|
switch (getPrefsValue("dateformat")) {
|
||||||
|
case "noyear":
|
||||||
|
return getString("fulltime2");
|
||||||
|
case "full":
|
||||||
|
return getString("fulltime");
|
||||||
|
default:
|
||||||
|
return getString("fulltime3");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
|
public static SimpleDateFormat setDateFormat() {
|
||||||
|
return new SimpleDateFormat(getDateFormat());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getFormattedDate(UserSex type, long time){
|
||||||
|
SimpleDateFormat date = new SimpleDateFormat(getDateFormat(), Locale.getDefault());
|
||||||
|
|
||||||
|
if(!fulltime()) return null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
return getStringDate(type == UserSex.FEMALE ? getIdentifier("last_seen_profile_f", "string") : getIdentifier("last_seen_profile_m", "string"), date.format(new Date(time)));
|
||||||
|
} catch (Throwable th) {
|
||||||
|
Log.d("VTLite", "Format data error, type " + type + " , time " + time);
|
||||||
|
th.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,23 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.*;
|
import static java.lang.System.clearProperty;
|
||||||
import static ru.vtosters.lite.utils.Preferences.*;
|
import static java.lang.System.getProperties;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
public class Proxy {
|
public class Proxy {
|
||||||
public static String getOauthComAuth() {
|
public static String getOauthComAuth() {
|
||||||
String oauthComHttps = getOauthComHttps();
|
return getOauthComHttps() + "/authorize";
|
||||||
return oauthComHttps + "/authorize";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getOauthComAuthClient() {
|
public static String getOauthComAuthClient() {
|
||||||
String oauthComAuth = getOauthComAuth();
|
return getOauthComAuth() + "?client_id=";
|
||||||
return oauthComAuth + "?client_id=";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getOauthComBlank() {
|
public static String getOauthComBlank() {
|
||||||
String oauthComHttps = getOauthComHttps();
|
return getOauthComHttps() + "/blank.html";
|
||||||
return oauthComHttps + "/blank.html";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getOauthComBlankRedirect() {
|
public static String getOauthComBlankRedirect() {
|
||||||
@@ -30,8 +29,7 @@ public class Proxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getStaticComSupport() {
|
public static String getStaticComSupport() {
|
||||||
String staticCom = getStaticCom();
|
return getStaticCom() + "/support";
|
||||||
return staticCom + "/support";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String oauthFix() {
|
public static String oauthFix() {
|
||||||
@@ -39,132 +37,171 @@ public class Proxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getApiCom() {
|
public static String getApiCom() {
|
||||||
String string = getPreferences().getString("proxyapi", "");
|
String string = getPrefsValue("proxyapi");
|
||||||
if (!proxy() & string.isEmpty()) {
|
if (!proxy() & string.isEmpty()) return "api.vk.com";
|
||||||
return "api.vk.com";
|
|
||||||
}
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getAwayPhpCom() {
|
public static String getAwayPhpCom() {
|
||||||
String string = getPreferences().getString("proxyapi", "");
|
String string = getPrefsValue("proxyapi");
|
||||||
if (!proxy() & string.isEmpty()) {
|
if (!proxy() & string.isEmpty()) return "m.vk.com";
|
||||||
return "m.vk.com";
|
|
||||||
}
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getOauthCom() {
|
public static String getOauthCom() {
|
||||||
String string = getPreferences().getString("proxyoauth", "");
|
String string = getPrefsValue("proxyoauth");
|
||||||
if (!proxy() & string.isEmpty()) {
|
if (!proxy() & string.isEmpty()) return "oauth.vk.com";
|
||||||
return "oauth.vk.com";
|
|
||||||
}
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getStaticCom() {
|
public static String getStaticCom() {
|
||||||
String string = getPreferences().getString("proxystatic", "");
|
String string = getPrefsValue("proxystatic");
|
||||||
if (!proxy() & string.isEmpty()) {
|
if (!proxy() & string.isEmpty()) return "static.vk.com";
|
||||||
return "static.vk.com";
|
|
||||||
}
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String staticFix(String str) {
|
public static String staticFix(String str) {
|
||||||
String str2;
|
String str2;
|
||||||
String string = getPreferences().getString("proxystatic", "");
|
String string = getPrefsValue("proxystatic");
|
||||||
if (!proxy() & string.isEmpty()) {
|
|
||||||
return str;
|
if (!proxy() & string.isEmpty()) return str;
|
||||||
}
|
|
||||||
str2 = string;
|
str2 = string;
|
||||||
return str.replace(str2, "static.vk.com");
|
return str.replace(str2, "static.vk.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setProxy() {
|
public static void setProxy() {
|
||||||
switch (getPreferences().getString("proxy", "")) {
|
Properties properties = getProperties();
|
||||||
|
|
||||||
|
switch (getPrefsValue("proxy")) {
|
||||||
case "zaborona":
|
case "zaborona":
|
||||||
Properties properties = System.getProperties();
|
|
||||||
properties.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
|
properties.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
|
||||||
properties.setProperty("socksProxyPort", "1488");
|
properties.setProperty("socksProxyPort", "1488");
|
||||||
System.clearProperty("https.proxyHost");
|
resetProxySocks();
|
||||||
System.clearProperty("https.proxyPort");
|
|
||||||
System.clearProperty("http.proxyHost");
|
|
||||||
System.clearProperty("http.proxyPort");
|
|
||||||
break;
|
break;
|
||||||
case "socks":
|
case "socks":
|
||||||
Properties properties2 = System.getProperties();
|
properties.setProperty("socksProxyHost", proxyHostSocks());
|
||||||
properties2.setProperty("socksProxyHost", proxyHostSocks());
|
properties.setProperty("socksProxyPort", proxyPortSocks());
|
||||||
properties2.setProperty("socksProxyPort", proxyPortSocks());
|
resetProxySocks();
|
||||||
System.clearProperty("https.proxyHost");
|
|
||||||
System.clearProperty("https.proxyPort");
|
|
||||||
System.clearProperty("http.proxyHost");
|
|
||||||
System.clearProperty("http.proxyPort");
|
|
||||||
break;
|
break;
|
||||||
case "http":
|
case "http":
|
||||||
Properties properties3 = System.getProperties();
|
properties.setProperty("http.proxyHost", proxyHostHTTP());
|
||||||
properties3.setProperty("http.proxyHost", proxyHostHTTP());
|
properties.setProperty("http.proxyPort", proxyPortHTTP());
|
||||||
properties3.setProperty("http.proxyPort", proxyPortHTTP());
|
properties.setProperty("http.proxyUser", proxyUserHTTP());
|
||||||
System.clearProperty("socksProxyHost");
|
properties.setProperty("http.proxyPassword", proxyPassHTTP());
|
||||||
System.clearProperty("socksPortHost");
|
resetProxyHttp();
|
||||||
System.clearProperty("https.proxyHost");
|
|
||||||
System.clearProperty("https.proxyPort");
|
|
||||||
break;
|
break;
|
||||||
case "https":
|
case "https":
|
||||||
Properties properties4 = System.getProperties();
|
properties.setProperty("https.proxyHost", proxyHostHTTPS());
|
||||||
properties4.setProperty("https.proxyHost", proxyHostHTTPS());
|
properties.setProperty("https.proxyPort", proxyPortHTTPS());
|
||||||
properties4.setProperty("https.proxyPort", proxyPortHTTPS());
|
properties.setProperty("https.proxyUser", proxyUserHTTPS());
|
||||||
System.clearProperty("socksProxyHost");
|
properties.setProperty("https.proxyPassword", proxyPassHTTPS());
|
||||||
System.clearProperty("socksPortHost");
|
resetProxyHttps();
|
||||||
System.clearProperty("http.proxyHost");
|
|
||||||
System.clearProperty("http.proxyPort");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
System.clearProperty("socksProxyHost");
|
resetProxy();
|
||||||
System.clearProperty("socksPortHost");
|
|
||||||
System.clearProperty("https.proxyHost");
|
|
||||||
System.clearProperty("https.proxyPort");
|
|
||||||
System.clearProperty("http.proxyHost");
|
|
||||||
System.clearProperty("http.proxyPort");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void resetProxy() {
|
||||||
|
clearProperty("https.proxyHost");
|
||||||
|
clearProperty("https.proxyPort");
|
||||||
|
clearProperty("https.proxyUser");
|
||||||
|
clearProperty("https.proxyPassword");
|
||||||
|
clearProperty("http.proxyHost");
|
||||||
|
clearProperty("http.proxyPort");
|
||||||
|
clearProperty("http.proxyUser");
|
||||||
|
clearProperty("http.proxyPassword");
|
||||||
|
clearProperty("socksProxyHost");
|
||||||
|
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
|
||||||
|
|
||||||
public static String proxyHostHTTP() {
|
public static String proxyHostHTTP() {
|
||||||
String string = getPreferences().getString("proxyHostHTTP", "");
|
String string = getPrefsValue("proxyHostHTTP");
|
||||||
return string.isEmpty() ? "192.168.0.1" : string;
|
return string.isEmpty() ? "192.168.0.1" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String proxyHostHTTPS() {
|
public static String proxyHostHTTPS() {
|
||||||
String string = getPreferences().getString("proxyHostHTTPS", "");
|
String string = getPrefsValue("proxyHostHTTPS");
|
||||||
return string.isEmpty() ? "192.168.0.1" : string;
|
return string.isEmpty() ? "192.168.0.1" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String proxyHostSocks() {
|
public static String proxyHostSocks() {
|
||||||
String string = getPreferences().getString("proxyHostSocks", "");
|
String string = getPrefsValue("proxyHostSocks");
|
||||||
return string.isEmpty() ? "192.168.0.1" : string;
|
return string.isEmpty() ? "192.168.0.1" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String proxyPortHTTP() {
|
public static String proxyPortHTTP() {
|
||||||
String string = getPreferences().getString("proxyPortHTTP", "");
|
String string = getPrefsValue("proxyPortHTTP");
|
||||||
return string.isEmpty() ? "8888" : string;
|
return string.isEmpty() ? "8888" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String proxyPortHTTPS() {
|
public static String proxyPortHTTPS() {
|
||||||
String string = getPreferences().getString("proxyPortHTTPS", "");
|
String string = getPrefsValue("proxyPortHTTPS");
|
||||||
return string.isEmpty() ? "8888" : string;
|
return string.isEmpty() ? "8888" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String proxyPortSocks() {
|
public static String proxyPortSocks() {
|
||||||
String string = getPreferences().getString("proxyPortSocks", "");
|
String string = getPrefsValue("proxyPortSocks");
|
||||||
return string.isEmpty() ? "8888" : string;
|
return string.isEmpty() ? "8888" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean proxy() {
|
public static String proxyUserHTTP() {
|
||||||
return getPreferences().getString("proxy", "").equals("apiproxy");
|
String string = getPrefsValue("proxyUserHTTP");
|
||||||
|
return string.isEmpty() ? "" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Official vk proxy enforcer
|
public static String proxyUserHTTPS() {
|
||||||
public static boolean proxyvk() {
|
String string = getPrefsValue("proxyUserHTTPS");
|
||||||
return BooleanFalse("proxyvk");
|
return string.isEmpty() ? "" : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String proxyPassHTTP() {
|
||||||
|
String string = getPrefsValue("proxyPassHTTP");
|
||||||
|
return string.isEmpty() ? "" : string;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String proxyPassHTTPS() {
|
||||||
|
String string = getPrefsValue("proxyPassHTTPS");
|
||||||
|
return string.isEmpty() ? "" : string;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean proxy() {
|
||||||
|
return getPrefsValue("proxy").equals("apiproxy");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean proxyvk() {
|
||||||
|
return getBoolValue("proxyvk", false);
|
||||||
|
} // Official vk proxy enforcer
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.About.*;
|
import static ru.vtosters.lite.utils.About.getBuildNumber;
|
||||||
import static ru.vtosters.lite.utils.Globals.*;
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
import static ru.vtosters.lite.utils.Preferences.*;
|
import static ru.vtosters.lite.utils.Globals.getUserSecret;
|
||||||
import static ru.vtosters.lite.utils.Proxy.*;
|
import static ru.vtosters.lite.utils.Globals.getUserToken;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.dev;
|
||||||
import com.vk.core.ui.themes.VKThemeHelper;
|
import static ru.vtosters.lite.utils.Preferences.getLocale;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.vksans;
|
||||||
|
import static ru.vtosters.lite.utils.Proxy.proxy;
|
||||||
|
import static ru.vtosters.lite.utils.Themes.isDarkTheme;
|
||||||
|
|
||||||
public class SSFS {
|
public class SSFS {
|
||||||
public static String getSSFSLink() {
|
public static String getSSFSLink() {
|
||||||
@@ -13,20 +16,19 @@ public class SSFS {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String SSFSDomain() {
|
public static String SSFSDomain() {
|
||||||
String string = getPreferences().getString("ssfscustom", "");
|
String string = getPrefsValue("ssfscustom");
|
||||||
if (!string.isEmpty()) {
|
|
||||||
return string;
|
if (!string.isEmpty()) return string;
|
||||||
}
|
|
||||||
return "https://vtsf.vknext.net";
|
return "https://vtsf.vknext.net";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getDarkVKUI() {
|
public static String getDarkVKUI() {
|
||||||
return !VKThemeHelper.d() ? "1" : "0";
|
return isDarkTheme() ? "1" : "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getAmoledVKUI() {
|
public static String getAmoledVKUI() {
|
||||||
String string = getPreferences().getString("darktheme", "");
|
return getPrefsValue("darktheme").equals("amoled") && isDarkTheme() ? "1" : "0";
|
||||||
return string.equals("amoled") ? "1" : "0";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getUserProxy() {
|
public static String getUserProxy() {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import static android.widget.Toast.makeText;
|
|||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
|
||||||
@@ -32,7 +31,7 @@ public class SettBackup {
|
|||||||
public static void backupSettings() {
|
public static void backupSettings() {
|
||||||
SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
|
SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
|
||||||
String currentDateandTime = date.format(new Date());
|
String currentDateandTime = date.format(new Date());
|
||||||
var directory = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS) + "/VTLBackup_" + currentDateandTime + ".txt";
|
var directory = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS + "/VTLBackups/") + "/Backup_" + currentDateandTime + ".txt";
|
||||||
var file = new File(directory);
|
var file = new File(directory);
|
||||||
try {
|
try {
|
||||||
var exists = file.createNewFile();
|
var exists = file.createNewFile();
|
||||||
@@ -63,9 +62,7 @@ public class SettBackup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void restoreBackup() {
|
public static void restoreBackup() {
|
||||||
Intent intent = new Intent();
|
File dir = new File(getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS + "/VTLBackups/").getPath());;
|
||||||
intent.setAction(Intent.ACTION_GET_CONTENT);
|
// TODO Make restore backup from file list
|
||||||
intent.setType("text/plain");
|
|
||||||
getContext().startActivity(intent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,112 +1,162 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.Globals.*;
|
import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||||
import static ru.vtosters.lite.utils.Preferences.*;
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.color_grishka;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.isBGStickersEnabled;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.navbar;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.roundedmsgs;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.systemtheme;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.vksans;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
|
import android.content.res.Configuration;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.view.View;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
|
|
||||||
|
import androidx.core.graphics.ColorUtils;
|
||||||
|
|
||||||
import com.vk.core.d.RecoloredDrawable;
|
import com.vk.core.d.RecoloredDrawable;
|
||||||
import com.vk.core.ui.themes.VKTheme;
|
import com.vk.core.ui.themes.VKTheme;
|
||||||
import com.vk.core.ui.themes.VKThemeHelper;
|
import com.vk.core.ui.themes.VKThemeHelper;
|
||||||
import com.vk.im.ui.themes.ImTheme;
|
import com.vk.im.ui.themes.ImTheme;
|
||||||
|
import com.vk.im.ui.themes.ImThemeHelper;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class Themes {
|
public class Themes {
|
||||||
|
public static List<String> accentColors = Arrays.asList(
|
||||||
|
"5692d7", "528bcc", "7aa0cc", "518bcc", "6296d0", "2f68aa", "638ebf", "5181b8", "71aaeb", "4774a8", "5baaf4", "4186c8", "add3ff", "4774a8", "718198", "5a9eff", "99a2ad", "74a2d6", "e9eef3", "dfe3e7", "eff1f3", "5c9ce6", "4986cc", "4680c2"
|
||||||
|
);
|
||||||
|
|
||||||
|
public static void applyTheme(VKTheme theme, ImTheme imtheme) {
|
||||||
|
VKThemeHelper.b.a(theme); // VKThemeHelper.b.a(VKTheme value) VK Theme apply
|
||||||
|
ImThemeHelper.b.a(imtheme); // ImThemeHelper.b.a(ImTheme value) VK Theme Msg apply
|
||||||
|
} // Apply VKTheme and ImTheme (hard applying without dynamic theme changing)
|
||||||
|
|
||||||
|
public static boolean isDarkTheme() {
|
||||||
|
return !VKThemeHelper.d();
|
||||||
|
}
|
||||||
|
|
||||||
public static int getAccentColor() {
|
public static int getAccentColor() {
|
||||||
return VKThemeHelper.a(R.attr.accent);
|
return VKThemeHelper.a(R.attr.accent);
|
||||||
}
|
} // Color accent
|
||||||
|
|
||||||
public static int getTextAttr() {
|
public static int getTextAttr() {
|
||||||
return VKThemeHelper.a(R.attr.text_primary);
|
return VKThemeHelper.a(R.attr.text_primary);
|
||||||
}
|
} // Text Primary color
|
||||||
|
|
||||||
public static int getSTextAttr() {
|
public static int getSTextAttr() {
|
||||||
return VKThemeHelper.a(R.attr.text_secondary);
|
return VKThemeHelper.a(R.attr.text_secondary);
|
||||||
}
|
} // Text Secondary color
|
||||||
|
|
||||||
public static int getTabbarBackground() {
|
public static int getTabbarBackground() {
|
||||||
return VKThemeHelper.a(R.attr.tabbar_background);
|
return VKThemeHelper.a(R.attr.tabbar_background);
|
||||||
}
|
} // Tabbar/Navbar background
|
||||||
|
|
||||||
|
public static int getBackgroundContent() {
|
||||||
|
return VKThemeHelper.a(R.attr.background_content);
|
||||||
|
} // Background color in app
|
||||||
|
|
||||||
public static int getHeaderBackground() {
|
public static int getHeaderBackground() {
|
||||||
return VKThemeHelper.a(R.attr.header_background);
|
return VKThemeHelper.a(R.attr.header_background);
|
||||||
}
|
} // Toolbar/Header background
|
||||||
|
|
||||||
public static int getAmoledTheme() {
|
|
||||||
return getContext().getResources().getIdentifier("BaseAmoledStyle", "style", getContext().getPackageName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int picFix() {
|
|
||||||
return getContext().getResources().getIdentifier("ActionBarThemeFix", "style", getContext().getPackageName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getAmoledImTheme() {
|
|
||||||
return getContext().getResources().getIdentifier("VkIm.Theme.VkApp.Amoled", "style", getContext().getPackageName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VKTheme getDarkTheme() {
|
|
||||||
String string = getPreferences().getString("darktheme", "");
|
|
||||||
if (string.isEmpty()) {
|
|
||||||
return VKTheme.DARK;
|
|
||||||
}
|
|
||||||
if (string.equals("amoled")) {
|
|
||||||
return VKTheme.AMOLED;
|
|
||||||
}
|
|
||||||
return VKTheme.DARK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ImTheme getImDarkTheme() {
|
|
||||||
String string = getPreferences().getString("darktheme", "");
|
|
||||||
if (string.isEmpty()) {
|
|
||||||
return ImTheme.VKAPP_DARK;
|
|
||||||
}
|
|
||||||
if (string.equals("amoled")) {
|
|
||||||
return ImTheme.VKAPP_AMOLED;
|
|
||||||
}
|
|
||||||
return ImTheme.VKAPP_DARK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VKTheme getLightTheme() {
|
|
||||||
String string = getPreferences().getString("lighttheme", "");
|
|
||||||
if (string.isEmpty()) {
|
|
||||||
return VKTheme.DEFAULT_LIGHT;
|
|
||||||
}
|
|
||||||
return VKTheme.DEFAULT_LIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ImTheme getImLightTheme() {
|
|
||||||
String string = getPreferences().getString("lighttheme", "");
|
|
||||||
if (string.isEmpty()) {
|
|
||||||
return ImTheme.VKAPP_LIGHT;
|
|
||||||
}
|
|
||||||
return ImTheme.VKAPP_LIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getColorFromAttr(int attr) {
|
|
||||||
return VKThemeHelper.a(attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getHeaderText() {
|
public static int getHeaderText() {
|
||||||
return VKThemeHelper.a(R.attr.header_text);
|
return VKThemeHelper.a(R.attr.header_text);
|
||||||
|
} // Header/Toolbar color text
|
||||||
|
|
||||||
|
public static int getAmoledTheme() {
|
||||||
|
return getIdentifier("BaseAmoledStyle", "style");
|
||||||
|
} // Get Amoled theme id
|
||||||
|
|
||||||
|
public static int picFix() {
|
||||||
|
return getIdentifier("ActionBarThemeFix", "style");
|
||||||
|
} // Fix tabbar color in photo viewer
|
||||||
|
|
||||||
|
public static int getAmoledImTheme() {
|
||||||
|
return getIdentifier("VkIm.Theme.VkApp.Amoled", "style");
|
||||||
|
} // Get Amoled theme id for messages
|
||||||
|
|
||||||
|
public static int getAmoledMeTheme() {
|
||||||
|
return getIdentifier("VkIm.Theme.VkMe.Amoled", "style");
|
||||||
|
} // Get Amoled theme id for messages with rounded msg
|
||||||
|
|
||||||
|
public static int getAttrId(String attr) {
|
||||||
|
return getIdentifier(attr, "attr");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isAndroidMonet() {
|
public static void setBarTheme(View getview) {
|
||||||
if (color_grishka()) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
return Build.VERSION.SDK_INT >= 31;
|
getview.setSystemUiVisibility(getNeededColorNavbar() | getNeededColorStatusbar());
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
} // Set white/dark statusbar/navbar icons
|
||||||
|
|
||||||
|
public static int getNeededColorStatusbar() {
|
||||||
|
return VKThemeHelper.d() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? 8192 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getNeededColorNavbar() {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? VKThemeHelper.d() ? SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR : 0 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getNeededColorStatusbarFix() {
|
||||||
|
return VKThemeHelper.d() ? 8192 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VKTheme getDarkTheme() {
|
||||||
|
switch (getPrefsValue("darktheme")) {
|
||||||
|
case "amoled":
|
||||||
|
return VKTheme.AMOLED;
|
||||||
|
default:
|
||||||
|
return VKTheme.DARK;
|
||||||
|
}
|
||||||
|
} // Return needed theme for theme changer
|
||||||
|
|
||||||
|
public static ImTheme getImDarkTheme() {
|
||||||
|
switch (getPrefsValue("darktheme")) {
|
||||||
|
case "amoled":
|
||||||
|
return roundedmsgs() ? ImTheme.VKME_AMOLED : ImTheme.VKAPP_AMOLED;
|
||||||
|
default:
|
||||||
|
return roundedmsgs() ? ImTheme.VKME_DARK : ImTheme.VKAPP_DARK;
|
||||||
|
}
|
||||||
|
} // Return needed theme for theme changer
|
||||||
|
|
||||||
|
public static VKTheme getLightTheme() {
|
||||||
|
switch (getPrefsValue("lighttheme")) {
|
||||||
|
default:
|
||||||
|
return VKTheme.DEFAULT_LIGHT;
|
||||||
|
}
|
||||||
|
} // Return needed theme for theme changer
|
||||||
|
|
||||||
|
public static ImTheme getImLightTheme() {
|
||||||
|
switch (getPrefsValue("lighttheme")) {
|
||||||
|
default:
|
||||||
|
return roundedmsgs() ? ImTheme.VKME_LIGHT : ImTheme.VKAPP_LIGHT;
|
||||||
|
}
|
||||||
|
} // Return needed theme for theme changer
|
||||||
|
|
||||||
|
public static int getColorFromAttr(int attr) {
|
||||||
|
return VKThemeHelper.a(attr);
|
||||||
|
} // Get needed attr color
|
||||||
|
|
||||||
|
public static boolean isAndroidMonet() {
|
||||||
|
return color_grishka() && Build.VERSION.SDK_INT >= 31;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isColorRefAccented(int i) {
|
public static boolean isColorRefAccented(int i) {
|
||||||
return i == R.color.cornflower_blue || i == R.color.cornflower_blue_two || i == R.color.dot_unread || i == R.color.fave_promo_btn_pressed || i == R.color.im_back_to_vk_gradient_start || i == R.color.live_emoji_butt_hide || i == R.color.picker_tab_bg_selected || i == R.color.sky_300 || i == R.color.text_blue || i == R.color.tw__blue_default || i == R.color.tw__blue_pressed || i == R.color.white_blue32 || i == R.color.name || i == R.color.picker_blue || i == R.color.picker_blue_pressed || i == R.color.picker_tab_text_selected || i == R.color.sharing_blue_btn_pressed || i == R.color.sharing_blue_btn_normal || i == R.color.tip_background || i == R.color.vkim_msg_sending_ic || i == R.color.vkim_playing_drawable_rect || i == R.color.accent_blue || i == R.color.light_blue_gray || i == R.color.light_blue || i == R.color.blue_200 || i == R.color.header_blue || i == R.color.blue_200_muted || i == R.color.im_old_accent || i == R.color.im_old_accent_muted || i == R.color.im_dark_accent || i == R.color.im_dark_accent_muted || i == R.color.azure_A400 || i == R.color.blue || i == R.color.blue_400 || i == R.color.blue_300 || i == R.color.cool_blue;
|
return i == R.color.cornflower_blue || i == R.color.cornflower_blue_two || i == R.color.dot_unread || i == R.color.music_action_button_blue || i == R.color.fave_promo_btn_pressed || i == R.color.im_back_to_vk_gradient_start || i == R.color.live_emoji_butt_hide || i == R.color.picker_tab_bg_selected || i == R.color.sky_300 || i == R.color.text_blue || i == R.color.tw__blue_default || i == R.color.tw__blue_pressed || i == R.color.white_blue32 || i == R.color.name || i == R.color.picker_blue || i == R.color.picker_blue_pressed || i == R.color.picker_tab_text_selected || i == R.color.sharing_blue_btn_pressed || i == R.color.sharing_blue_btn_normal || i == R.color.tip_background || i == R.color.vkim_msg_sending_ic || i == R.color.vkim_playing_drawable_rect || i == R.color.accent_blue || i == R.color.light_blue_gray || i == R.color.light_blue || i == R.color.blue_200 || i == R.color.header_blue || i == R.color.blue_200_muted || i == R.color.im_old_accent || i == R.color.im_old_accent_muted || i == R.color.im_dark_accent || i == R.color.im_dark_accent_muted || i == R.color.azure_A400 || i == R.color.blue || i == R.color.blue_400 || i == R.color.blue_300 || i == R.color.cool_blue;
|
||||||
}
|
} // Accent colors
|
||||||
|
|
||||||
public static void themeMonetToolbar(ImageButton imageButton, Toolbar toolbar) {
|
public static void themeMonetToolbar(ImageButton imageButton, Toolbar toolbar) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
@@ -120,20 +170,82 @@ public class Themes {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new RecoloredDrawable(drawable, getAccentColor());
|
return new RecoloredDrawable(drawable, getAccentColor());
|
||||||
}
|
} // Recolor drawable to accent color
|
||||||
|
|
||||||
public static Drawable recolorDrawableToolbar(Drawable drawable) {
|
public static Drawable recolorDrawableToolbar(Drawable drawable) {
|
||||||
if (drawable == null) {
|
if (drawable == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new RecoloredDrawable(drawable, getHeaderText());
|
return new RecoloredDrawable(drawable, getHeaderText());
|
||||||
}
|
} // Recolor toolbar drawable to accent color
|
||||||
|
|
||||||
public static ColorStateList recolorCSL(ColorStateList colorStateList) {
|
public static ColorStateList recolorCSL(ColorStateList colorStateList) {
|
||||||
if (colorStateList == null) {
|
if (colorStateList == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return ColorStateList.valueOf(getAccentColor());
|
return ColorStateList.valueOf(getAccentColor());
|
||||||
|
} // Recolor ColorStateList to accent color
|
||||||
|
|
||||||
|
public static ColorStateList themeCSL(Context context, int color) {
|
||||||
|
if (isColorRefAccented(color) && isAndroidMonet()) {
|
||||||
|
return ColorStateList.valueOf(getAccentColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorStateList csl = context.getColorStateList(color);
|
||||||
|
try {
|
||||||
|
int unsel = csl.getColorForState(new int[]{-android.R.attr.state_selected}, Color.BLACK);
|
||||||
|
int sel = csl.getColorForState(new int[]{android.R.attr.state_selected}, Color.BLACK);
|
||||||
|
|
||||||
|
boolean isUnselAccent = isAccentedColor(unsel);
|
||||||
|
boolean isSelAccent = isAccentedColor(sel);
|
||||||
|
|
||||||
|
if (isUnselAccent || isSelAccent) {
|
||||||
|
|
||||||
|
return new ColorStateList(new int[][] {
|
||||||
|
new int[]{android.R.attr.state_selected}, new int[]{-android.R.attr.state_selected}
|
||||||
|
}, new int[] {isSelAccent ? getAccentColor() : sel, isUnselAccent ? getAccentColor() : unsel});
|
||||||
|
}
|
||||||
|
|
||||||
|
return csl;
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} // Recolor ColorStateList
|
||||||
|
|
||||||
|
public static int darken(int color, float by) {
|
||||||
|
float[] hsl = new float[3];
|
||||||
|
ColorUtils.colorToHSL(color, hsl);
|
||||||
|
hsl[2] -= by;
|
||||||
|
hsl[2] = Math.max(0f, Math.min(hsl[2], 1f));
|
||||||
|
return ColorUtils.HSLToColor(hsl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int lighten(int color, float factor) {
|
||||||
|
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
|
||||||
|
int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
|
||||||
|
int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
|
||||||
|
return Color.argb(Color.alpha(color), red, green, blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int fixTextColor(int resid) {
|
||||||
|
if (resid == R.color.music_action_button_gray || resid == R.color.cool_grey || resid == R.color.accent_blue){
|
||||||
|
return isDarkTheme()? R.color.white : R.color.cool_grey;
|
||||||
|
}
|
||||||
|
return resid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int halfAlpha(int src) {
|
||||||
|
return ColorUtils.setAlphaComponent(src, 169);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAccentedColor(ColorStateList target) {
|
||||||
|
return target != null && isAccentedColor(target.getDefaultColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAccentedColor(int target) {
|
||||||
|
return accentColors.contains(hex(target).toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getColor(Context context, int i) {
|
public static int getColor(Context context, int i) {
|
||||||
@@ -143,25 +255,27 @@ public class Themes {
|
|||||||
if (Build.VERSION.SDK_INT >= 23) {
|
if (Build.VERSION.SDK_INT >= 23) {
|
||||||
return context.getColor(i);
|
return context.getColor(i);
|
||||||
}
|
}
|
||||||
return context.getResources().getColor(i);
|
return getResources().getColor(i);
|
||||||
}
|
} // Android Support color injector + accent color checker
|
||||||
|
|
||||||
public static int getColor2(int i) {
|
public static int getColor2(int i) {
|
||||||
if (isColorRefAccented(i) && isAndroidMonet()) {
|
if (isColorRefAccented(i) && isAndroidMonet()) {
|
||||||
return getAccentColor();
|
return getAccentColor();
|
||||||
}
|
}
|
||||||
return getContext().getResources().getColor(i);
|
return getResources().getColor(i);
|
||||||
}
|
} // Android Support color injector + accent color checker
|
||||||
|
|
||||||
public static void setNavbarColor(Window window, int i) {
|
public static void setNavbarColor(Window window, int i) {
|
||||||
if (navbar() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (navbar() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
window.setNavigationBarColor(getNavbarColor());
|
window.setNavigationBarColor(getTabbarBackground());
|
||||||
|
window.getDecorView().setSystemUiVisibility(getNeededColorNavbar());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String hex(int i) {
|
public static String hex(int i) {
|
||||||
return String.format("#%06X", Integer.valueOf(i & 16777215));
|
return String.format("#%06X", Integer.valueOf(i & 16777215));
|
||||||
}
|
} // Get color as hex string
|
||||||
|
|
||||||
public static int vk_sans_display_demibold() {
|
public static int vk_sans_display_demibold() {
|
||||||
return vksans() ? R.font.vk_sans_display_demibold : R.font.tt_commons_demi_bold;
|
return vksans() ? R.font.vk_sans_display_demibold : R.font.tt_commons_demi_bold;
|
||||||
}
|
}
|
||||||
@@ -190,14 +304,33 @@ public class Themes {
|
|||||||
return vksans() ? R.font.vk_sans_text_regular : R.font.roboto_regular;
|
return vksans() ? R.font.vk_sans_text_regular : R.font.roboto_regular;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getNavbarColor() {
|
|
||||||
return VKThemeHelper.a(R.attr.tabbar_background);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getBackgroundStickers() {
|
public static String getBackgroundStickers() {
|
||||||
if (isBGStickersEnabled()) {
|
if (isBGStickersEnabled()) {
|
||||||
return "images_with_background";
|
return "images_with_background";
|
||||||
}
|
}
|
||||||
return "images";
|
return "images";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void systemThemeChanger() {
|
||||||
|
if (isDarkTheme()){
|
||||||
|
applyTheme(getDarkTheme(), getImDarkTheme());
|
||||||
|
} else {
|
||||||
|
applyTheme(getLightTheme(), getImLightTheme());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!systemtheme()) return;
|
||||||
|
|
||||||
|
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
switch (currentNightMode) {
|
||||||
|
case Configuration.UI_MODE_NIGHT_UNDEFINED:
|
||||||
|
applyTheme(getLightTheme(), getImLightTheme());
|
||||||
|
break;
|
||||||
|
case Configuration.UI_MODE_NIGHT_NO:
|
||||||
|
applyTheme(getLightTheme(), getImLightTheme());
|
||||||
|
break;
|
||||||
|
case Configuration.UI_MODE_NIGHT_YES:
|
||||||
|
applyTheme(getDarkTheme(), getImDarkTheme());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
package ru.vtosters.lite.utils;
|
package ru.vtosters.lite.utils;
|
||||||
|
|
||||||
|
import static android.util.Base64.encodeToString;
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||||
|
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||||
import static ru.vtosters.lite.utils.Themes.getColorFromAttr;
|
import static ru.vtosters.lite.utils.Themes.getColorFromAttr;
|
||||||
import static ru.vtosters.lite.utils.Themes.hex;
|
import static ru.vtosters.lite.utils.Themes.hex;
|
||||||
|
|
||||||
import android.util.Base64;
|
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
|
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
@@ -21,17 +22,13 @@ public class VKUIInjector {
|
|||||||
private static String loadedCSS = "";
|
private static String loadedCSS = "";
|
||||||
private static String loadedCSSAmoled = "";
|
private static String loadedCSSAmoled = "";
|
||||||
|
|
||||||
static {
|
|
||||||
}
|
|
||||||
|
|
||||||
public VKUIInjector() {
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String load(String str) {
|
private static String load(String str) {
|
||||||
try {
|
try {
|
||||||
InputStream open = getContext().getAssets().open(str);
|
InputStream open = getContext().getAssets().open(str);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open, StandardCharsets.UTF_8));
|
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open, StandardCharsets.UTF_8));
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
String readLine = bufferedReader.readLine();
|
String readLine = bufferedReader.readLine();
|
||||||
if (readLine != null) {
|
if (readLine != null) {
|
||||||
@@ -41,7 +38,9 @@ public class VKUIInjector {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@@ -66,21 +65,27 @@ public class VKUIInjector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void inject(WebView webView) {
|
public static void inject(WebView webView) {
|
||||||
String string = getPreferences().getString("darktheme", "");
|
String string = getPrefsValue("darktheme");
|
||||||
if (Preferences.BooleanTrue("VKUI_INJ")) {
|
|
||||||
|
if (getBoolValue("VKUI_INJ", true)) {
|
||||||
|
|
||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
if (true/*Themes.isAccentedCache()*/) {
|
if (true/*Themes.isAccentedCache()*/) {
|
||||||
sb.append("\n\n");
|
sb.append("\n\n");
|
||||||
sb.append(loadedCSS);
|
sb.append(loadedCSS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.equals("amoled")) {
|
if (string.equals("amoled")) {
|
||||||
sb.append("\n\n");
|
sb.append("\n\n");
|
||||||
sb.append(loadedCSSAmoled);
|
sb.append(loadedCSSAmoled);
|
||||||
}
|
}
|
||||||
inject(webView, Base64.encodeToString(sb.toString().getBytes(), 2));
|
|
||||||
|
inject(webView, encodeToString(sb.toString().getBytes(), 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Vtoasters Shit</string>
|
<string name="app_name">VTosters Lite</string>
|
||||||
</resources>
|
</resources>
|
||||||
+1
-1
@@ -5,7 +5,7 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.2.0-rc01'
|
classpath 'com.android.tools.build:gradle:7.2.1'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|||||||
+15
-1
@@ -1,3 +1,17 @@
|
|||||||
|
## For more details on how to configure your build environment visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
|
#
|
||||||
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
|
# Default value: -Xmx1024m -XX:MaxPermSize=256m
|
||||||
|
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
||||||
|
#
|
||||||
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
# org.gradle.parallel=true
|
||||||
|
#Fri Jun 03 17:38:03 MSK 2022
|
||||||
|
org.gradle.jvmargs=-Xmx1536M -Dkotlin.daemon.jvm.options\="-Xmx1536M"
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.jetifier.ignorelist=classes-dex2jar.jar, classes2-dex2jar.jar, classes3-dex2jar.jar, classes4-dex2jar.jar, classes5-dex2jar.jar, classes6-dex2jar.jar, classes7-dex2jar.jar
|
android.jetifier.ignorelist=classes-dex2jar.jar, classes2-dex2jar.jar, classes3-dex2jar.jar, classes4-dex2jar.jar, classes5-dex2jar.jar, classes6-dex2jar.jar, classes7-dex2jar.jar
|
||||||
|
|||||||
Binary file not shown.
@@ -1,18 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:shareInterpolator="false"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:shareInterpolator="false">
|
||||||
<scale
|
<scale
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"
|
|
||||||
android:duration="@integer/abc_config_activityDefaultDur"
|
android:duration="@integer/abc_config_activityDefaultDur"
|
||||||
|
android:fromXScale="0.9"
|
||||||
|
android:fromYScale="0.9"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
android:pivotX="50.0%"
|
android:pivotX="50.0%"
|
||||||
android:pivotY="100.0%"
|
android:pivotY="100.0%"
|
||||||
android:fromXScale="0.9"
|
|
||||||
android:toXScale="1.0"
|
android:toXScale="1.0"
|
||||||
android:fromYScale="0.9"
|
|
||||||
android:toYScale="1.0" />
|
android:toYScale="1.0" />
|
||||||
<alpha
|
<alpha
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"
|
|
||||||
android:duration="@integer/abc_config_activityShortDur"
|
android:duration="@integer/abc_config_activityShortDur"
|
||||||
android:fromAlpha="0.0"
|
android:fromAlpha="0.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
android:toAlpha="1.0" />
|
android:toAlpha="1.0" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:shareInterpolator="false"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:shareInterpolator="false">
|
||||||
<alpha
|
<alpha
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"
|
|
||||||
android:duration="@integer/abc_config_activityShortDur"
|
android:duration="@integer/abc_config_activityShortDur"
|
||||||
android:fromAlpha="0.0"
|
android:fromAlpha="0.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
android:toAlpha="1.0" />
|
android:toAlpha="1.0" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:shareInterpolator="false"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:shareInterpolator="false">
|
||||||
<alpha
|
<alpha
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"
|
|
||||||
android:duration="@integer/abc_config_activityShortDur"
|
android:duration="@integer/abc_config_activityShortDur"
|
||||||
android:fromAlpha="1.0"
|
android:fromAlpha="1.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
android:toAlpha="0.0" />
|
android:toAlpha="0.0" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:shareInterpolator="false"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:shareInterpolator="false">
|
||||||
<scale
|
<scale
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"
|
|
||||||
android:duration="@integer/abc_config_activityDefaultDur"
|
android:duration="@integer/abc_config_activityDefaultDur"
|
||||||
|
android:fromXScale="1.0"
|
||||||
|
android:fromYScale="1.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
android:pivotX="50.0%"
|
android:pivotX="50.0%"
|
||||||
android:pivotY="100.0%"
|
android:pivotY="100.0%"
|
||||||
android:fromXScale="1.0"
|
|
||||||
android:toXScale="0.9"
|
android:toXScale="0.9"
|
||||||
android:fromYScale="1.0"
|
|
||||||
android:toYScale="0.9" />
|
android:toYScale="0.9" />
|
||||||
<alpha
|
<alpha
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"
|
|
||||||
android:duration="@integer/abc_config_activityShortDur"
|
android:duration="@integer/abc_config_activityShortDur"
|
||||||
android:fromAlpha="1.0"
|
android:fromAlpha="1.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
android:toAlpha="0.0" />
|
android:toAlpha="0.0" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<alpha android:interpolator="@android:interpolator/decelerate_quad"
|
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:duration="@integer/config_tooltipAnimTime"
|
android:duration="@integer/config_tooltipAnimTime"
|
||||||
android:fromAlpha="0.0"
|
android:fromAlpha="0.0"
|
||||||
android:toAlpha="1.0"
|
android:interpolator="@android:interpolator/decelerate_quad"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android" />
|
android:toAlpha="1.0" />
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<alpha android:interpolator="@android:interpolator/accelerate_quad"
|
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:duration="@integer/config_tooltipAnimTime"
|
android:duration="@integer/config_tooltipAnimTime"
|
||||||
android:fromAlpha="1.0"
|
android:fromAlpha="1.0"
|
||||||
android:toAlpha="0.0"
|
android:interpolator="@android:interpolator/accelerate_quad"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android" />
|
android:toAlpha="0.0" />
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:zAdjustment="normal"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:zAdjustment="normal">
|
||||||
<alpha
|
<alpha
|
||||||
android:duration="300"
|
android:duration="300"
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
android:fillAfter="true"
|
||||||
|
android:fillBefore="true"
|
||||||
|
android:fillEnabled="true"
|
||||||
android:fromAlpha="1.0"
|
android:fromAlpha="1.0"
|
||||||
android:toAlpha="1.0"
|
android:toAlpha="1.0" />
|
||||||
android:fillEnabled="true" />
|
|
||||||
</set>
|
</set>
|
||||||
@@ -1,25 +1,25 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:shareInterpolator="false"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:zAdjustment="top"
|
android:shareInterpolator="false"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:zAdjustment="top">
|
||||||
<alpha
|
<alpha
|
||||||
android:interpolator="@android:interpolator/decelerate_cubic"
|
|
||||||
android:duration="300"
|
android:duration="300"
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
android:fillAfter="true"
|
||||||
|
android:fillBefore="true"
|
||||||
|
android:fillEnabled="true"
|
||||||
android:fromAlpha="1.0"
|
android:fromAlpha="1.0"
|
||||||
android:toAlpha="0.0"
|
|
||||||
android:fillEnabled="true" />
|
|
||||||
<scale
|
|
||||||
android:interpolator="@android:interpolator/decelerate_cubic"
|
android:interpolator="@android:interpolator/decelerate_cubic"
|
||||||
|
android:toAlpha="0.0" />
|
||||||
|
<scale
|
||||||
android:duration="300"
|
android:duration="300"
|
||||||
|
android:fillAfter="true"
|
||||||
|
android:fillBefore="true"
|
||||||
|
android:fillEnabled="true"
|
||||||
|
android:fromXScale="1.0"
|
||||||
|
android:fromYScale="1.0"
|
||||||
|
android:interpolator="@android:interpolator/decelerate_cubic"
|
||||||
android:pivotX="50.0%p"
|
android:pivotX="50.0%p"
|
||||||
android:pivotY="50.0%p"
|
android:pivotY="50.0%p"
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:fromXScale="1.0"
|
|
||||||
android:toXScale="0.8"
|
android:toXScale="0.8"
|
||||||
android:fromYScale="1.0"
|
android:toYScale="0.8" />
|
||||||
android:toYScale="0.8"
|
|
||||||
android:fillEnabled="true" />
|
|
||||||
</set>
|
</set>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:interpolator="@android:anim/decelerate_interpolator"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:interpolator="@android:anim/decelerate_interpolator">
|
||||||
<translate
|
<translate
|
||||||
android:duration="300"
|
android:duration="300"
|
||||||
android:fromYDelta="100.0%p"
|
android:fromYDelta="100.0%p"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:interpolator="@android:anim/accelerate_interpolator"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:interpolator="@android:anim/accelerate_interpolator">
|
||||||
<translate
|
<translate
|
||||||
android:duration="300"
|
android:duration="300"
|
||||||
android:fromYDelta="0.0%p"
|
android:fromYDelta="0.0%p"
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:duration="225"
|
||||||
|
android:interpolator="@android:interpolator/linear_out_slow_in">
|
||||||
|
<translate
|
||||||
|
android:fromYDelta="100.0%p"
|
||||||
|
android:toYDelta="0.0" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:duration="195"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_linear_in">
|
||||||
|
<translate
|
||||||
|
android:fromYDelta="0.0%p"
|
||||||
|
android:toYDelta="100.0%p" />
|
||||||
|
</set>
|
||||||
@@ -5,15 +5,15 @@
|
|||||||
android:state_pressed="true">
|
android:state_pressed="true">
|
||||||
<objectAnimator
|
<objectAnimator
|
||||||
android:duration="200"
|
android:duration="200"
|
||||||
|
android:propertyName="translationZ"
|
||||||
android:valueTo="2.0dip"
|
android:valueTo="2.0dip"
|
||||||
android:valueType="floatType"
|
android:valueType="floatType" />
|
||||||
android:propertyName="translationZ" />
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<objectAnimator
|
<objectAnimator
|
||||||
android:duration="200"
|
android:duration="200"
|
||||||
|
android:propertyName="translationZ"
|
||||||
android:valueTo="1.0dip"
|
android:valueTo="1.0dip"
|
||||||
android:valueType="floatType"
|
android:valueType="floatType" />
|
||||||
android:propertyName="translationZ" />
|
|
||||||
</item>
|
</item>
|
||||||
</selector>
|
</selector>
|
||||||
@@ -5,15 +5,15 @@
|
|||||||
android:state_pressed="true">
|
android:state_pressed="true">
|
||||||
<objectAnimator
|
<objectAnimator
|
||||||
android:duration="200"
|
android:duration="200"
|
||||||
|
android:propertyName="translationZ"
|
||||||
android:valueTo="4.0dip"
|
android:valueTo="4.0dip"
|
||||||
android:valueType="floatType"
|
android:valueType="floatType" />
|
||||||
android:propertyName="translationZ" />
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<objectAnimator
|
<objectAnimator
|
||||||
android:duration="200"
|
android:duration="200"
|
||||||
|
android:propertyName="translationZ"
|
||||||
android:valueTo="2.0dip"
|
android:valueTo="2.0dip"
|
||||||
android:valueType="floatType"
|
android:valueType="floatType" />
|
||||||
android:propertyName="translationZ" />
|
|
||||||
</item>
|
</item>
|
||||||
</selector>
|
</selector>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:duration="@integer/bottom_sheet_slide_duration"
|
android:duration="@integer/bottom_sheet_slide_duration"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:interpolator="@android:interpolator/fast_out_linear_in">
|
||||||
<translate
|
<translate
|
||||||
android:fromYDelta="20.000004%p"
|
android:fromYDelta="20.000004%p"
|
||||||
android:toYDelta="0.0" />
|
android:toYDelta="0.0" />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:interpolator="@android:anim/accelerate_interpolator"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:duration="@integer/bottom_sheet_slide_duration"
|
android:duration="@integer/bottom_sheet_slide_duration"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:interpolator="@android:interpolator/fast_out_slow_in">
|
||||||
<translate
|
<translate
|
||||||
android:fromYDelta="0.0"
|
android:fromYDelta="0.0"
|
||||||
android:toYDelta="20.000004%p" />
|
android:toYDelta="20.000004%p" />
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<translate android:fromYDelta="100.0%"
|
<translate xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:toYDelta="0.0"
|
android:fromYDelta="100.0%"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android" />
|
android:toYDelta="0.0" />
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<translate android:fromYDelta="0.0"
|
<translate xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:toYDelta="100.0%"
|
android:fromYDelta="0.0"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android" />
|
android:toYDelta="100.0%" />
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<alpha android:interpolator="@android:anim/accelerate_interpolator"
|
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:duration="200"
|
android:duration="200"
|
||||||
android:fromAlpha="1.0"
|
android:fromAlpha="1.0"
|
||||||
android:toAlpha="0.0"
|
android:interpolator="@android:anim/accelerate_interpolator"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android" />
|
android:toAlpha="0.0" />
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:pathData="M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1" />
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:controlX1="0.4"
|
||||||
|
android:controlX2="1.0"
|
||||||
|
android:controlY1="0.0"
|
||||||
|
android:controlY2="1.0" />
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shareInterpolator="false">
|
||||||
|
<scale
|
||||||
|
android:duration="@android:integer/config_shortAnimTime"
|
||||||
|
android:fromXScale="0.9"
|
||||||
|
android:fromYScale="0.9"
|
||||||
|
android:pivotX="50.0%"
|
||||||
|
android:pivotY="0.0%"
|
||||||
|
android:toXScale="1.0"
|
||||||
|
android:toYScale="1.0" />
|
||||||
|
<alpha
|
||||||
|
android:duration="@android:integer/config_shortAnimTime"
|
||||||
|
android:fromAlpha="0.0"
|
||||||
|
android:toAlpha="1.0" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:duration="100">
|
||||||
|
<translate
|
||||||
|
android:fromYDelta="-20.000004%"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
|
android:toYDelta="0.0" />
|
||||||
|
<alpha
|
||||||
|
android:fromAlpha="0.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
|
android:toAlpha="1.0" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:duration="100">
|
||||||
|
<translate
|
||||||
|
android:fromYDelta="20.000004%"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
|
android:toYDelta="0.0" />
|
||||||
|
<alpha
|
||||||
|
android:fromAlpha="0.0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
|
android:toAlpha="1.0" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:animation="@anim/item_animation_fall_down"
|
||||||
|
android:animationOrder="normal"
|
||||||
|
android:delay="14.999998%" />
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:animation="@anim/item_animation_fall_up"
|
||||||
|
android:animationOrder="reverse"
|
||||||
|
android:delay="14.999998%" />
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shareInterpolator="false">
|
||||||
|
<translate
|
||||||
|
android:duration="250"
|
||||||
|
android:fromXDelta="100.0%"
|
||||||
|
android:fromYDelta="0.0%"
|
||||||
|
android:toXDelta="0.0%"
|
||||||
|
android:toYDelta="0.0%" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shareInterpolator="false">
|
||||||
|
<translate
|
||||||
|
android:duration="250"
|
||||||
|
android:fromXDelta="0.0%"
|
||||||
|
android:fromYDelta="0.0%"
|
||||||
|
android:toXDelta="-100.0%"
|
||||||
|
android:toYDelta="0.0%" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shareInterpolator="false">
|
||||||
|
<translate
|
||||||
|
android:duration="250"
|
||||||
|
android:fromXDelta="-100.0%"
|
||||||
|
android:fromYDelta="0.0%"
|
||||||
|
android:toXDelta="0.0%"
|
||||||
|
android:toYDelta="0.0%" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shareInterpolator="false">
|
||||||
|
<translate
|
||||||
|
android:duration="250"
|
||||||
|
android:fromXDelta="0.0%"
|
||||||
|
android:fromYDelta="0.0%"
|
||||||
|
android:toXDelta="100.0%"
|
||||||
|
android:toYDelta="0.0%" />
|
||||||
|
</set>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<linearInterpolator />
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:controlX1="0.0"
|
||||||
|
android:controlX2="0.2"
|
||||||
|
android:controlY1="0.0"
|
||||||
|
android:controlY2="1.0" />
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set android:interpolator="@android:anim/decelerate_interpolator"
|
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:interpolator="@android:anim/decelerate_interpolator">
|
||||||
<scale
|
<scale
|
||||||
android:interpolator="@android:anim/bounce_interpolator"
|
|
||||||
android:duration="200"
|
android:duration="200"
|
||||||
|
android:fillAfter="false"
|
||||||
|
android:fromXScale="1.0"
|
||||||
|
android:fromYScale="1.0"
|
||||||
|
android:interpolator="@android:anim/bounce_interpolator"
|
||||||
android:pivotX="50.0%"
|
android:pivotX="50.0%"
|
||||||
android:pivotY="50.0%"
|
android:pivotY="50.0%"
|
||||||
android:fillAfter="false"
|
|
||||||
android:repeatCount="1"
|
android:repeatCount="1"
|
||||||
android:repeatMode="reverse"
|
android:repeatMode="reverse"
|
||||||
android:fromXScale="1.0"
|
|
||||||
android:toXScale="1.2"
|
android:toXScale="1.2"
|
||||||
android:fromYScale="1.0"
|
|
||||||
android:toYScale="1.2" />
|
android:toYScale="1.2" />
|
||||||
</set>
|
</set>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user