Compare commits

...
206 Commits
Author SHA1 Message Date
gdlbo 02b6e4a728 Fix dockbar issue 2022-05-02 13:30:51 +03:00
gdlbo 00c1e926e6 Fixed store stickers colors 2022-05-02 12:54:58 +03:00
gdlbo ef8109e2e8 Reworked some about menu 2022-05-02 12:40:57 +03:00
gdlbo 732ee76957 Disabled anim stickers 2022-05-02 12:31:30 +03:00
gdlbo b97d2261de Fixed bug with new feed design 2022-05-02 11:03:39 +03:00
gdlbo c362bfc8da Fixes + new update feed logic 2022-05-02 10:44:57 +03:00
gdlbo cc445e4aea Oh sh*t I am sorry (for refactoring) 2022-05-02 09:44:30 +03:00
gdlbo 4ac83d59b5 Color fixes 2022-04-30 14:25:40 +03:00
gdlbo 5025a5fa94 Refactoring + renaming 2022-04-30 13:48:04 +03:00
gdlbo b8cb19c8db Refactoring + renaming 2022-04-30 13:17:32 +03:00
gdlbo 593153de8f Updated README.md + version null fix 2022-04-29 22:22:07 +03:00
gdlbo 6c36b83d64 Github Actions test 2022-04-29 21:51:56 +03:00
gdlbo 1381fdd3bb Github Actions test 2022-04-29 21:48:08 +03:00
gdlbo f680a37eb1 gh actions test 3 2022-04-29 21:42:51 +03:00
gdlbo 4531b7af52 gh actions test 2 2022-04-29 21:38:24 +03:00
gdlbo 0c4d1af2dc fix 2022-04-29 21:29:20 +03:00
gdlbo d6a18ecca6 gh actions test 2022-04-29 21:27:25 +03:00
gdlbo dc768952c3 Updated README.md 2022-04-29 20:56:14 +03:00
gdlbo 57cdcfcbd1 color fixes 2022-04-29 16:49:30 +03:00
gdlbo fb4837ce40 color fixes 2022-04-28 22:02:35 +03:00
gdlbo b85e1e6937 color fixes 2022-04-28 21:56:54 +03:00
gdlbo 727201ece9 Some fixes 2022-04-28 21:21:20 +03:00
gdlbo c711c3126e Clean up code 2022-04-28 21:11:04 +03:00
gdlbo cdcf218160 Fixes 2022-04-28 20:57:57 +03:00
gdlbo ee652593c0 Backup system fixes 2022-04-28 19:07:11 +03:00
gdlbo 90773529e6 Reset/Save prefs system init 2022-04-28 18:29:31 +03:00
gdlbo 0134a7c82c Reset/Save prefs system init 2022-04-28 18:29:21 +03:00
gdlbo fec3d40d7d fixes 2022-04-27 23:06:43 +03:00
gdlbo bdf36f42d3 fixes for music popup 2022-04-27 21:34:14 +03:00
gdlbo 23967490e9 https://github.com/vtosters/lite/issues/181 + color fixes for tabs 2022-04-27 21:09:29 +03:00
gdlbo 3bcd197618 Fixed crash
https://github.com/vtosters/lite/issues/192
2022-04-27 20:29:18 +03:00
gdlbo ac3eba5654 Deleted exit button :) 2022-04-27 20:25:29 +03:00
gdlbo 9576856b0b Added debug feature for clear all sticks cache 2022-04-27 20:15:47 +03:00
gdlbo f17975c92f Fixed pic theme 2022-04-27 20:08:23 +03:00
gdlbo 07a24eab2f Fixed header coloring 2022-04-27 19:37:48 +03:00
gdlbo edc9276fac Max tabs updated 2022-04-26 14:28:37 +03:00
gdlbo c7531eb652 Updated icons 2022-04-25 19:37:14 +03:00
gdlbo 5c1452ff57 Fixed msg strange bug + fixes 2022-04-25 17:24:13 +03:00
gdlbo e467044e41 Improved Dark theme 2022-04-25 16:47:43 +03:00
gdlbo 5c5780f720 Improved player progress color 2022-04-25 16:31:02 +03:00
gdlbo 7119bab9c9 Refactored vkui injector + added headers coloring 2022-04-25 15:51:07 +03:00
gdlbo 2eccc92510 Monet fixes 2022-04-25 14:23:18 +03:00
gdlbo b9e0fcdb04 Update preferences_themes.xml 2022-04-24 22:44:06 +03:00
gdlbo 5c15912b1b Update DockBarManager.java 2022-04-24 22:32:39 +03:00
gdlbo ac6525e49a Improved dark theme 2022-04-24 19:22:35 +03:00
gdlbo 3e67973a27 added more info + reformated xml 2022-04-24 18:42:17 +03:00
gdlbo ed4e295e71 Update ThemesFragment.java 2022-04-24 18:28:12 +03:00
gdlbo 73b57399d5 Improved Theme changing 2022-04-24 18:16:24 +03:00
gdlbo 9e0b67478d fixed comments 2022-04-24 17:57:26 +03:00
gdlbo 341eb37ff4 Fixes + Added comments sorting 2022-04-24 17:43:02 +03:00
gdlbo 6d68a77e42 fixes 2022-04-24 16:58:17 +03:00
gdlbo b50f56a5d4 Oh, fixes?
-Added styles list for dark and light themes
-Updated libs
-Auto refactored resources for easy editing
-Improved amoled theme
2022-04-23 21:36:08 +03:00
gdlbo e226438b09 Improved Amoled Theme 2022-04-23 00:03:37 +03:00
gdlbo a5db0793d6 Revert "Improved navbar coloring"
This reverts commit 07e1f1a1d3.
2022-04-22 23:01:45 +03:00
gdlbo 07e1f1a1d3 Improved navbar coloring 2022-04-22 19:29:18 +03:00
gdlbo de77e3484b Update preferences_themes.xml 2022-04-22 18:59:48 +03:00
gdlbo 24571ea22f Amoled Theme feature 2022-04-22 18:51:42 +03:00
gdlbo 515f90105c Improved Amoled Theme + Added support for SSFS 2022-04-22 18:04:56 +03:00
gdlbo 0d305dbc7e Amoled Theme Styles for VKIM + fixed vk refl 2022-04-22 17:39:37 +03:00
gdlbo 05bf888ba6 Test Amoled Theme Styles + Updated R.java 2022-04-22 17:03:41 +03:00
gdlbo a2a53e8215 Updated Libs 2022-04-22 16:08:23 +03:00
gdlbo e6290b8aba Updated gradle + amoled inject 2022-04-22 14:07:56 +03:00
gdlbo aa5f6e7cbe Improved dark theme 2022-04-16 18:41:11 +03:00
gdlbo 054b447236 Fixed bot keyboard 2022-04-16 17:58:12 +03:00
gdlbo 52db475469 Custom load of msg 2022-04-16 01:56:12 +03:00
gdlbo 6282800fdb Fixed all issues with msgs 2022-04-16 00:23:32 +03:00
gdlbo 20517fdf51 Fixed video downloading 2022-04-16 00:01:21 +03:00
gdlbo 40400817c1 Downgraded msg api 2022-04-15 23:41:18 +03:00
gdlbo 834e454eb2 Zaborona fix 2022-04-15 23:40:06 +03:00
gdlbo 2747c9efc8 Improved dark theme 2022-04-12 17:34:09 +03:00
gdlbo c2cc782ee3 Fixed vk refl 2022-04-12 16:37:52 +03:00
gdlbo d414e79b6b Fixed msg loading null 2022-04-12 15:07:35 +03:00
gdlbo 9e0f95ed94 Fixed strange twitter crash 2022-04-12 13:49:11 +03:00
gdlbo 167da56a0b Fixed strange statusbar coloring 2022-04-12 13:29:32 +03:00
gdlbo af213869c8 Improved white theme 2022-04-12 13:17:45 +03:00
gdlbo 39b9e42f62 Fixed crash 2022-04-11 22:56:11 +03:00
gdlbo 1aa07afabc haha bruh dev->beta
1989 китай ничего не было
2022-04-11 22:38:51 +03:00
gdlbo 84d7d0bef6 Fixed bugs 2022-04-11 22:22:13 +03:00
gdlbo fbb7f2320e Improved dark theme 2022-04-11 21:46:32 +03:00
gdlbo 506f5c7597 deleted confidential logging 2022-04-11 21:12:00 +03:00
gdlbo 38d3a40d7a Update MultiAccountAdapter.java 2022-04-11 21:10:16 +03:00
gdlbo 44cb073de8 fixes + disabled debuggable mode 2022-04-11 21:07:08 +03:00
Vologhat 8a680e5429 update multi account 2022-04-11 20:57:52 +03:00
gdlbo 16dbdc5ec3 Improved dark theme 2022-04-11 16:27:10 +03:00
gdlbo 4cece4566c Improved coloring 2022-04-11 14:24:50 +03:00
gdlbo 2340cbbbb2 Msg fixes 2022-04-11 01:23:12 +03:00
gdlbo e00feded18 Fixes 2022-04-11 01:01:08 +03:00
gdlbo d7c5e88c00 FIxed authactiviry cringe accent color on sdk31+ 2022-04-11 00:54:21 +03:00
gdlbo 7462d739f4 Improved dark theme 2022-04-11 00:29:28 +03:00
gdlbo f1bbdeac45 Improved dark theme 2022-04-11 00:13:21 +03:00
gdlbo 178bdbf988 Deleted new video feature 2022-04-10 23:54:53 +03:00
gdlbo 82a5d40a10 Improved dark theme 2022-04-10 23:47:51 +03:00
gdlbo c888bd3f3c Improved dark theme 2022-04-10 23:10:12 +03:00
gdlbo 53f45f49c3 Improved dark theme 2022-04-10 22:52:05 +03:00
gdlbo 3c108c7520 multiaccount fixes 2022-04-10 22:00:21 +03:00
Vologhat 11bce261ae multi account refactoring 2022-04-10 20:17:47 +03:00
gdlbo 5f8204c48e Improved dark theme 2022-04-10 19:53:51 +03:00
gdlbo f6043ed413 Update Prefs.java 2022-04-10 19:02:23 +03:00
Vologhat 5ab22cd5c4 fix notifications updater 2022-04-10 16:08:08 +03:00
gdlbo ee20e461d2 Update InterfaceFragment.java 2022-04-09 20:40:06 +03:00
gdlbo 9fa6513d4b Improved dark theme 2022-04-09 19:28:53 +03:00
gdlbo e86c7b190a Improved dark theme 2022-04-09 18:26:11 +03:00
gdlbo 0b2c5dc578 Improved dark theme 2022-04-09 17:57:00 +03:00
gdlbo 55b569c057 Improved dark theme 2022-04-09 16:50:33 +03:00
gdlbo 02d6fb3b14 Improved dark theme 2022-04-08 21:58:08 +03:00
gdlbo 8ed21f8fa9 Improved dark theme 2022-04-08 21:29:00 +03:00
gdlbo 6c1a12b345 Improved dark theme 2022-04-08 20:45:47 +03:00
gdlbo 05f4462195 Improved dark theme 2022-04-08 15:03:42 +03:00
gdlbo e4bb903391 Improved dark theme 2022-04-08 13:46:35 +03:00
gdlbo 5028fe9d7f Improved dark theme 2022-04-08 13:31:09 +03:00
gdlbo 9bca7a3598 Improved dark theme 2022-04-08 13:14:44 +03:00
gdlbo dddb414c7d Fixed crash crop 2022-04-08 11:57:33 +03:00
gdlbo ad67bed400 Fixed installing app 2022-04-07 20:43:15 +03:00
gdlbo 5ffa2fac40 Fixed win script 2022-04-07 20:30:26 +03:00
gdlbo cca1bc6607 Fixed win script 2022-04-07 20:28:38 +03:00
gdlbo 55f49d7d3a Updated keystore 2022-04-07 19:47:02 +03:00
gdlbo a24f8bef3d Fixed versioning null 2022-04-07 19:44:20 +03:00
gdlbo c41a0de1af Updated scripts 2022-04-07 19:15:46 +03:00
gdlbo d4c8b795fa Updated README.md 2022-04-07 19:10:11 +03:00
gdlbo 47c219ad8c Fixed podcasts colors 2022-04-07 18:55:01 +03:00
gdlbo 59b34ddf3e Added old icons feature 2022-04-07 18:40:04 +03:00
gdlbo 01f1e3993c Improved external video link parser 2022-04-07 18:23:57 +03:00
gdlbo c21cadad1d Disabled monet coloring for dockbar 2022-04-07 17:38:52 +03:00
gdlbo 307d15ff24 Fixed some color issues 2022-04-07 17:32:52 +03:00
gdlbo 5edebee51e Fixed some color issues 2022-04-07 16:44:55 +03:00
gdlbo 3d936f4abd Fixed miniplayer text color issues 2022-04-07 15:30:39 +03:00
gdlbo e725c05e9c Fixed settings stickers color issues 2022-04-07 15:26:02 +03:00
gdlbo 5a8a33cebc Fixed docs text color issue 2022-04-07 15:01:51 +03:00
gdlbo da28a5feca Fixed a11+ issue 2022-04-07 14:55:34 +03:00
gdlbo a058e84ddb Fixed crash 2022-04-07 13:54:15 +03:00
gdlbo 49ccf080ad Fixed crash on sdk31+ 2022-04-07 13:17:17 +03:00
gdlbo 176a9a89b6 Deleted libverify button 2022-04-04 20:45:48 +03:00
gdlbo 40f907300d Fixed crash 2022-04-04 20:34:38 +03:00
gdlbo 0219b14844 Update LinkProcessor1.smali 2022-04-03 18:30:23 +03:00
Vologhat 08acebd2c6 fix recycler view wrong resizing 2022-04-03 17:09:59 +03:00
gdlbo 9bf0109c0d Update DockBarManager.java 2022-04-03 14:15:12 +03:00
gdlbo 1f31ddd8d0 Update DockBarManager.java 2022-04-03 14:05:08 +03:00
gdlbo 9540fb68dc Update StandartFilter.txt 2022-04-03 13:44:58 +03:00
gdlbo 432975f409 Fixed crash
https://github.com/vtosters/lite/issues/103
2022-04-03 13:17:55 +03:00
Vologhat 8b2acc764a add saving and resetting 2022-04-03 12:26:17 +03:00
Vologhat f79ca38ef4 fix dockbar tabs limit 2022-04-03 12:23:42 +03:00
gdlbo 446cc973d6 Fixes fixes fixes 2022-04-02 23:53:54 +03:00
gdlbo a847d6a3eb Fixes dockbar 2022-04-02 23:41:20 +03:00
gdlbo 67f9d9bbd9 Fixes 2022-04-02 22:30:51 +03:00
gdlbo 2d49885572 Merge branch 'master' of https://github.com/vtosters/lite 2022-04-02 22:05:09 +03:00
gdlbo a940674c6f Some improvements 2022-04-02 22:04:16 +03:00
Vologhat 7bbb073552 add outline icons 2022-04-02 22:00:04 +03:00
Vologhat 105d784b4a add inability to unselect menu tab 2022-04-02 22:00:04 +03:00
Vologhat 23eb0fef69 add possibility to choice alternative fragments for "news" and "discover" 2022-04-02 22:00:04 +03:00
Vologhat b9afb74a01 level down min tabs count 2022-04-02 22:00:04 +03:00
Vologhat edfb68c946 fix color palette and tab items 2022-04-02 22:00:04 +03:00
Vologhat 66897e8e93 fix dockbar 2022-04-02 22:00:04 +03:00
Vologhat 3b754b79e7 add dockbar injector 2022-04-02 22:00:03 +03:00
Vologhat 11fa834af7 migration to android support due to androidx instability 2022-04-02 22:00:03 +03:00
Vologhat d319c97430 докбар 2022-04-02 22:00:03 +03:00
gdlbo 744f9866da Updated README.md 2022-04-02 22:00:02 +03:00
gdlbo 251746a57e Updated README.md https://github.com/vtosters/lite/pull/89 2022-04-02 22:00:02 +03:00
Daniil Isakov b1bbfe7e1b Grammar check, a bit of rephrasing 2022-04-02 22:00:02 +03:00
gdlbo 7a911de8ca updated multiacc 2022-04-02 22:00:02 +03:00
gdlbo e5398cc1be updated adblock filter 2022-04-02 22:00:02 +03:00
gdlbo b87f28f8bf updated resources + R.java again 2022-04-02 22:00:02 +03:00
gdlbo 5f8e16eb5d translation fixes 2022-04-02 22:00:02 +03:00
gdlbo f83e1cc0b7 Updated R.java + some fixes 2022-04-02 22:00:02 +03:00
gdlbo 447bc94100 Added multi account feature 2022-04-02 22:00:02 +03:00
gdlbo 17cdb9c87b Improved adblock 2022-04-02 22:00:02 +03:00
gdlbo 2cb35c17b2 Improvements of multiacc + added migrating from old type of accounts to new type 2022-04-02 22:00:01 +03:00
gdlbo 0e0ca2a504 Improvements of multiacc + deleted old accs xD 2022-04-02 22:00:01 +03:00
gdlbo dca61fcd16 Improvements of multiacc 2022-04-02 22:00:01 +03:00
gdlbo d0a198c6ad Multiaccount impl test 2022-04-02 22:00:01 +03:00
gdlbo c1211123dd fixed picker crash 2022-04-02 22:00:01 +03:00
gdlbo 3a9d4ffa12 Updated README.md 2022-04-01 19:05:57 +03:00
gdlbo 5855dc2abf Updated README.md https://github.com/vtosters/lite/pull/89 2022-04-01 18:56:52 +03:00
gdlbo ed3e6314d1 Merge pull request #84 from oplexz/patch-1 2022-04-01 09:53:41 +03:00
Daniil Isakov b83a36d41a Grammar check, a bit of rephrasing 2022-04-01 09:40:25 +03:00
gdlbo 1beaf3f436 updated multiacc 2022-04-01 08:43:52 +03:00
gdlbo 0bb9145288 updated adblock filter 2022-04-01 08:39:04 +03:00
gdlbo ba76a1f0fd updated resources + R.java again 2022-03-31 21:09:42 +03:00
gdlbo f0732ae3c3 translation fixes 2022-03-31 20:41:10 +03:00
gdlbo 8a761382f0 Updated R.java + some fixes 2022-03-31 20:19:28 +03:00
gdlbo 481e3ba041 Added multi account feature 2022-03-31 19:22:37 +03:00
gdlbo 4615a174f0 Improved adblock 2022-03-30 18:03:52 +03:00
gdlbo 18de5e9289 Improvements of multiacc + added migrating from old type of accounts to new type 2022-03-30 17:16:23 +03:00
gdlbo 122c6d8b80 Improvements of multiacc + deleted old accs xD 2022-03-30 17:01:50 +03:00
gdlbo d00f93ee94 Improvements of multiacc 2022-03-30 14:51:50 +03:00
gdlbo bbc2a8132a Multiaccount impl test 2022-03-30 00:22:49 +03:00
gdlbo f4e61583fa fixed picker crash 2022-03-28 10:13:12 +03:00
gdlbo 9ee72b2c6b Update SettingsListFragment$b.smali 2022-03-27 21:12:45 +03:00
Vologhat dd2c17e4ac fix script for windows 2022-03-27 20:31:31 +03:00
gdlbo e87dde9c6a fixed compilation on windows 2022-03-27 18:04:47 +03:00
gdlbo 83a5723dee fixed compilation on windows 2022-03-27 18:01:02 +03:00
aliveoutside 3e6b968400 fix icons in dropdown menu in newsfeed 2022-03-27 12:19:11 +03:00
aliveoutside c3f9dffd50 fix text color in dropdown menu in newsfeed 2022-03-27 12:19:11 +03:00
gdlbo 972504202e fixed proxy issue 2022-03-27 11:50:14 +03:00
gdlbo d26b0bed38 fixed video catalog issue 2022-03-27 11:40:32 +03:00
gdlbo e5b886ed21 fixed pic edit crash 2022-03-27 11:35:30 +03:00
gdlbo d9e6082f1a Fix doc upload crash 2022-03-26 23:38:53 +03:00
gdlbo 67001e272b Fix graffiti crash 2022-03-26 23:15:47 +03:00
gdlbo 5534aa3fda Updated shit Filter 2022-03-26 22:57:17 +03:00
gdlbo 55e73d3469 Updated ADBlock Filter + new test filter 2022-03-26 22:41:07 +03:00
gdlbo 8a7b03676d Updated ADBlock Filter 2022-03-26 21:37:17 +03:00
gdlbo 0adafcb433 Now some new features are enabled by default 2022-03-26 21:32:24 +03:00
gdlbo 356eb98b94 updated README.md 2022-03-26 21:25:43 +03:00
gdlbo 86b5af9210 fixed some color issues 2022-03-26 21:16:15 +03:00
gdlbo c4a5406330 fixed some crashes and other problems 2022-03-26 21:07:27 +03:00
gdlbo 857e6ff86b fixed some issues 2022-03-26 20:38:38 +03:00
aliveoutside 5bec30d2c7 fix animated stickers 2022-03-26 19:59:29 +03:00
2946 changed files with 88361 additions and 18499 deletions
+46
View File
@@ -0,0 +1,46 @@
name: Build VTosters Lite
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
- uses: actions/checkout@v2
- name: Download tools
run: |
sudo apt update
sudo apt install default-jre
sudo apt install python3
chmod +x scripts/apktool.jar
chmod +x scripts/apksigner.jar
- name: Build VTLite
run: |
git checkout master
bash scripts/buildworkflow.sh
- name: Sign and verify the apk
run: |
java -jar scripts/apksigner.jar sign --ks scripts/debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android smali/VTLite.apk
java -jar scripts/apksigner.jar verify smali/VTLite.apk
- name: Upload apk to artifact
uses: actions/upload-artifact@v2
with:
name: VTLite.apk
path: smali/VTLite.apk
+2 -1
View File
@@ -23,4 +23,5 @@ local.properties
.idea/compiler.xml
smali/assets/version.properties
app/src/main/assets/version.properties
smali/build/resources.zip
smali/build/resources.zip
*.idsig
+82 -13
View File
@@ -1,26 +1,95 @@
# VTosters Lite
О багах сообщать в issues, **просьба не создавать дубликаты и воспользоваться поиском**
### Пул Реквесты
VTosters Lite - это модифицированный клиент (декомпиляция) официального ВКонтакте основанный на версии 5.29
Скрипты и код далеки от **идеала** и поэтому мы всегда готовы к новым предложениям в **Pull Requests**
О найденных багах сообщать в [issues](https://github.com/vtosters/lite/issues), просьба не плодить дубликаты, воспользуйтесь поиском перед созданием нового issue
### Компиляция
Скачивать самые актуальные версии можно с [Actions](https://github.com/vtosters/lite/actions)
Стабильные сборки находятся в [Releases](https://github.com/vtosters/lite/releases)
## Откладка
Для откладки с помощью Android Studio необходимо пройти в `/smali/AndroidManifest.xml`
```
android:debuggable="false" -> android:debuggable="true"
```
Для дополнительной откладки ответов, доп логов и подмены данных для дебаг приложения необходимо включить **Режим разработчика**
```
Настройки -> Для разработчиков -> Режим разработчика
```
Для просмотра трафика необходимо отключить функцию **SSL Pinning**
```
Настройки -> Для разработчиков -> SSL Pinning
```
Для логгирования внутренних запросов к API необходимо включить функции **Логгирование API**
(Работает только при использовании внутреннего логгера!)
```
Настройки -> Для разработчиков -> Логгирование API
```
Для использования внутреннего логгера необходимо включить функции **Запись логов в файл**
```
Настройки -> Для разработчиков -> Запись логов в файл
```
Сразу после нажатия на запись аппа начнет записывать **все действия** в файлы по пути
```
/VK/logs/com.vtosters.lite
```
При следующем открытии аппы она автоматически запакует эти файлы и отправит вам в **Документы** ВК
Позже архив можно будет скачать и работать с файлами логов которые находятся в нем
## Разработка
Для понимания декомпилированного кода требуется использовать **Dex to Java** декомпилятор [jadx](https://github.com/skylot/jadx) или же сторонние варианты как [Fernflower](https://github.com/fesh0r/fernflower)
Рекомендуется установка **Android Debug Bridge** в систему ([Гайд как это сделать](https://technastic.com/system-wide-adb-fastboot-windows-10))
Для индексации декомпилированного кода в Studio используется [dex2jar](https://github.com/pxb1988/dex2jar)
Сгенерированные библиотеки из дексов находятся в `/app/libs`
При чистой перекомпиляции дексов в jar может сломаться некоторая индексация файлов, исправляйте ручками что попадется (К примеру какие-то функции в дексах изменены с **private** на **public**)
Для сборки декомпилированного кода и ресурсов используется [Apktool](https://github.com/iBotPeaches/Apktool)
А при нахождении решения каких-либо проблем ждем вас в [Pull Requests](https://github.com/vtosters/lite/pulls)
### Всё необходимое для сборки и компиляции
`Не меняйте packagename во избе­жа­ние проблем с приложением`
`Некоторые функции связанные с музыкой не будут работать в пересобранном приложении`
Весь декомпилированный код клиента находится в `/smali`
Весь исходный код модификации находится в `/app`
Все необходимые скрипты/жарники для компиляции APK, его подписывании и не только находятся в `/scripts`
### Необходимые зависимости
Требуется установленная **Java** >11 версии
Требуется установленная **Android Studio**
Весь декомпилированный код клиента находится в ```/smali```
Весь исходный код написанный на Java находится в ```/app```
Все необходимые скрипты для компиляции APK, его подписывании и не только находятся в ```/scripts```
### Linux/macOS
```
./build.sh
```
Скрипт для Linux/Mac: ```./build.sh```
![](https://cdn.discordapp.com/attachments/762063967979175946/961657476317581393/unknown.png)
Скрипт для Windows: ```./build.bat```
![](https://media.discordapp.net/attachments/762063967979175946/956927341450391562/unknown.png)
### Windows
```
build.bat
```
### Проверка версии коммита
С версии v0.0.4 доступна прямая проверка версии коммита внутри приложения
![](https://cdn.discordapp.com/attachments/762063967979175946/961682299366309928/unknown.png)
+1
View File
@@ -4,6 +4,7 @@
<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_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<application
@@ -3,11 +3,28 @@
*/
package bruhcollective.itaysonlab.libvkx;
// Works only with original signature of VT
public interface ILibVkxService extends android.os.IInterface {
void play(java.util.List<String> audio_ids, int index, String playbackContext) throws android.os.RemoteException;
int getUserId() throws android.os.RemoteException;
// Starts playback. playbackContext can be "other" if you don't sure what it is
void addTrackToCache(int track_id, int owner_id, String access_key) throws android.os.RemoteException;
// A UserID. CHECK FOR THIS TO BE EQUAL BEFORE SENDING ANYTHING TO SERVICE!
void deleteTrackFromCache(int track_id, int owner_id) throws android.os.RemoteException;
// Cache add/remove
boolean isTrackCached(int track_id, int owner_id) throws android.os.RemoteException;
java.util.List<String> getCache() throws android.os.RemoteException;
/**
* Default implementation for ILibVkxService.
*/
public static class Default implements ILibVkxService {
class Default implements ILibVkxService {
// Starts playback. playbackContext can be "other" if you don't sure what it is
@Override
@@ -46,13 +63,20 @@ public interface ILibVkxService extends android.os.IInterface {
return null;
}
}
// Get a list of cached tracks. The response is close to VK's original response (an audio list)
// Also, the items in the list are JSON ones.
/**
* Local-side IPC implementation stub class.
*/
public static abstract class Stub extends android.os.Binder implements ILibVkxService {
abstract class Stub extends android.os.Binder implements ILibVkxService {
static final int TRANSACTION_play = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_getUserId = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
static final int TRANSACTION_addTrackToCache = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
static final int TRANSACTION_deleteTrackFromCache = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
static final int TRANSACTION_isTrackCached = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
static final int TRANSACTION_getCache = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
private static final String DESCRIPTOR = "bruhcollective.itaysonlab.libvkx.ILibVkxService";
/**
* Construct the stub at attach it to the interface.
*/
@@ -75,6 +99,18 @@ public interface ILibVkxService extends android.os.IInterface {
return new Proxy(obj);
}
public static boolean setDefaultImpl(ILibVkxService impl) {
if (Proxy.sDefaultImpl == null && impl != null) {
Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static ILibVkxService getDefaultImpl() {
return Proxy.sDefaultImpl;
}
@Override
public android.os.IBinder asBinder() {
return this;
@@ -154,7 +190,8 @@ public interface ILibVkxService extends android.os.IInterface {
}
private static class Proxy implements ILibVkxService {
private android.os.IBinder mRemote;
public static ILibVkxService sDefaultImpl;
private final android.os.IBinder mRemote;
Proxy(android.os.IBinder remote) {
mRemote = remote;
@@ -164,11 +201,12 @@ public interface ILibVkxService extends android.os.IInterface {
public android.os.IBinder asBinder() {
return mRemote;
}
// Starts playback. playbackContext can be "other" if you don't sure what it is
public String getInterfaceDescriptor() {
return DESCRIPTOR;
}
// Starts playback. playbackContext can be "other" if you don't sure what it is
// A UserID. CHECK FOR THIS TO BE EQUAL BEFORE SENDING ANYTHING TO SERVICE!
@Override
public void play(java.util.List<String> audio_ids, int index, String playbackContext) throws android.os.RemoteException {
@@ -190,7 +228,7 @@ public interface ILibVkxService extends android.os.IInterface {
_data.recycle();
}
}
// A UserID. CHECK FOR THIS TO BE EQUAL BEFORE SENDING ANYTHING TO SERVICE!
// Cache add/remove
@Override
public int getUserId() throws android.os.RemoteException {
@@ -211,7 +249,6 @@ public interface ILibVkxService extends android.os.IInterface {
}
return _result;
}
// Cache add/remove
@Override
public void addTrackToCache(int track_id, int owner_id, String access_key) throws android.os.RemoteException {
@@ -253,6 +290,8 @@ public interface ILibVkxService extends android.os.IInterface {
_data.recycle();
}
}
// Get a list of cached tracks. The response is close to VK's original response (an audio list)
// Also, the items in the list are JSON ones.
@Override
public boolean isTrackCached(int track_id, int owner_id) throws android.os.RemoteException {
@@ -275,8 +314,6 @@ public interface ILibVkxService extends android.os.IInterface {
}
return _result;
}
// Get a list of cached tracks. The response is close to VK's original response (an audio list)
// Also, the items in the list are JSON ones.
@Override
public java.util.List<String> getCache() throws android.os.RemoteException {
@@ -297,44 +334,6 @@ public interface ILibVkxService extends android.os.IInterface {
}
return _result;
}
public static ILibVkxService sDefaultImpl;
}
static final int TRANSACTION_play = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_getUserId = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
static final int TRANSACTION_addTrackToCache = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
static final int TRANSACTION_deleteTrackFromCache = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
static final int TRANSACTION_isTrackCached = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
static final int TRANSACTION_getCache = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
public static boolean setDefaultImpl(ILibVkxService impl) {
if (Proxy.sDefaultImpl == null && impl != null) {
Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static ILibVkxService getDefaultImpl() {
return Proxy.sDefaultImpl;
}
}
// Starts playback. playbackContext can be "other" if you don't sure what it is
public void play(java.util.List<String> audio_ids, int index, String playbackContext) throws android.os.RemoteException;
// A UserID. CHECK FOR THIS TO BE EQUAL BEFORE SENDING ANYTHING TO SERVICE!
public int getUserId() throws android.os.RemoteException;
// Cache add/remove
public void addTrackToCache(int track_id, int owner_id, String access_key) throws android.os.RemoteException;
public void deleteTrackFromCache(int track_id, int owner_id) throws android.os.RemoteException;
public boolean isTrackCached(int track_id, int owner_id) throws android.os.RemoteException;
// Get a list of cached tracks. The response is close to VK's original response (an audio list)
// Also, the items in the list are JSON ones.
public java.util.List<String> getCache() throws android.os.RemoteException;
}
@@ -1,10 +1,11 @@
package bruhcollective.itaysonlab.libvkx.client;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Preferences.BooleanFalse;
import android.content.Context;
import android.os.RemoteException;
import bruhcollective.itaysonlab.libvkx.ILibVkxService;
import com.vk.core.b.PackageManagerHelper;
import com.vk.dto.music.MusicTrack;
import com.vk.music.PlayerRefer;
@@ -13,12 +14,8 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.Prefs;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.Prefs;
import bruhcollective.itaysonlab.libvkx.ILibVkxService;
/* loaded from: classes6.dex */
public class LibVKXClient {
private static LibVKXClientImpl impl;
@@ -31,7 +28,7 @@ public class LibVKXClient {
public static LibVKXClientImpl getInstance() {
LibVKXClientImpl libVKXClientImpl = impl;
return libVKXClientImpl == null ? getInstance(Helper.GetContext()) : libVKXClientImpl;
return libVKXClientImpl == null ? getInstance(getContext()) : libVKXClientImpl;
}
public static boolean isVkxInstalled() {
@@ -39,7 +36,7 @@ public class LibVKXClient {
}
public static boolean isIntegrationEnabled() {
return Prefs.BooleanFalse("libvkx_integration") && isVkxInstalled();
return BooleanFalse("libvkx_integration") && isVkxInstalled();
}
public static boolean play(MusicTrack musicTrack, List<MusicTrack> list, PlayerRefer playerRefer) {
@@ -52,8 +49,7 @@ public class LibVKXClient {
return getInstance().runOnService(action);
}
/* JADX INFO: Access modifiers changed from: package-private */
public static /* synthetic */ void lambdaplay(List list, MusicTrack musicTrack, PlayerRefer playerRefer, ILibVkxService iLibVkxService) {
public static void lambdaplay(List list, MusicTrack musicTrack, PlayerRefer playerRefer, ILibVkxService iLibVkxService) {
int indexOf = list.indexOf(musicTrack);
ArrayList arrayList = new ArrayList();
Iterator it = list.iterator();
@@ -1,5 +1,7 @@
package bruhcollective.itaysonlab.libvkx.client;
import static ru.vtosters.lite.utils.Globals.getUserId;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -12,7 +14,6 @@ import android.os.RemoteException;
import java.util.List;
import bruhcollective.itaysonlab.libvkx.ILibVkxService;
import ru.vtosters.lite.utils.Helper;
public class LibVKXClientImpl {
private ILibVkxService serviceInstance;
@@ -51,7 +52,7 @@ public class LibVKXClientImpl {
public boolean runOnService(LibVKXAction action) {
if (serviceInstance != null) {
try {
if (serviceInstance.getUserId() != Helper.GetUserId()) return false;
if (serviceInstance.getUserId() != getUserId()) return false;
action.run(serviceInstance);
return true;
} catch (RemoteException e) {
@@ -75,7 +76,7 @@ public class LibVKXClientImpl {
isBindFailed = true;
} else {
try {
if (serviceInstance.getUserId() != Helper.GetUserId()) return;
if (serviceInstance.getUserId() != getUserId()) return;
runAfterBind.run(serviceInstance);
} catch (RemoteException e) {
e.printStackTrace();
@@ -95,8 +96,7 @@ public class LibVKXClientImpl {
private boolean verifyBindActuality() {
if (!checkIfAppExists()) return false; // no need
if (isBindFailed) return false;
return true;
return !isBindFailed;
}
private Intent getIntent() {
@@ -1,8 +1,5 @@
package com.aefyr.tsg.g2;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicLong;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -10,11 +7,13 @@ import android.content.Context;
import android.os.Build;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by Aefyr on 20.05.2018.
@@ -22,17 +21,13 @@ import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
public class NotificationsHelper {
private static final int NOTIFICATION_ID_BASE = 3921337;
private static final String NOTIFICATION_CHANNEL_ID = "tgss_chan_v5";
private HashMap<TelegramStickersPack, Integer> downloadingPacksNotificationsIds;
private Context c;
private NotificationManagerCompat manager;
private int currentNotificationN = 0;
private static final int MAX_UPDATE_NOTIFICATIONS_PER_SECOND = 3;
private static final int MIN_TIME_BETWEEN_UPDATE_NOTIFICATIONS = 1000 / MAX_UPDATE_NOTIFICATIONS_PER_SECOND;
private AtomicLong lastNotificationTime = new AtomicLong(0);
private final HashMap<TelegramStickersPack, Integer> downloadingPacksNotificationsIds;
private final Context c;
private final NotificationManagerCompat manager;
private int currentNotificationN = 0;
private final AtomicLong lastNotificationTime = new AtomicLong(0);
public NotificationsHelper(Context c) {
this.c = c;
@@ -11,7 +11,7 @@ import java.io.File;
class PackDeletionTask extends AsyncTask<Void, Void, Boolean> {
private static final String TAG = "TGSSAnnihilator";
private TelegramStickersPack pack;
private final TelegramStickersPack pack;
PackDeletionTask(TelegramStickersPack pack) {
this.pack = pack;
@@ -1,19 +1,19 @@
package com.aefyr.tsg.g2;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
/**
* Created by Aefyr on 18.05.2018.
*/
@@ -101,7 +101,7 @@ public class TelegramStickersPack extends CustomStickersPack {
@Override
public boolean equals(Object obj) {
return obj instanceof TelegramStickersPack && ((TelegramStickersPack) obj).id.toLowerCase().equals(id.toLowerCase());
return obj instanceof TelegramStickersPack && ((TelegramStickersPack) obj).id.equalsIgnoreCase(id);
}
@Override
@@ -1,5 +1,17 @@
package com.aefyr.tsg.g2;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.aefyr.tsg.g2.sql.TelegramStickersDbHelper;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersPackInfo;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
@@ -7,17 +19,6 @@ import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import com.aefyr.tsg.g2.sql.TelegramStickersDbHelper;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersPackInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.ui.fragments.tgstickers.StickersFragment;
/**
@@ -27,29 +28,25 @@ public class TelegramStickersService {
private static final String TAG = "TGStickersService";
private static TelegramStickersService instance;
private Context c;
private final Context c;
private ArrayList<TelegramStickersPack> packs;
private ArrayList<TelegramStickersPack> activePacks;
private ArrayList<TelegramStickersPack> inactivePacks;
private ArrayList<StickersEventsListener> listeners;
private HashSet<String> currentlyDownloading;
private final ArrayList<TelegramStickersPack> packs;
private final ArrayList<TelegramStickersPack> activePacks;
private final ArrayList<TelegramStickersPack> inactivePacks;
private final ArrayList<StickersEventsListener> listeners;
private final HashSet<String> currentlyDownloading;
private Handler uiThreadHandler;
private final Handler uiThreadHandler;
private TelegramStickersGrabber grabber;
private final TelegramStickersGrabber grabber;
private TelegramStickersDbHelper dbHelper;
private final TelegramStickersDbHelper dbHelper;
private boolean ready = false;
private ArrayList<Runnable> queuedTasks;
private final ArrayList<Runnable> queuedTasks;
private ThreadPoolExecutor executor;
private final ThreadPoolExecutor executor;
private NotificationsHelper notificationsHelper;
public static TelegramStickersService getInstance(Context c) {
return instance == null ? new TelegramStickersService(c) : instance;
}
private final NotificationsHelper notificationsHelper;
private TelegramStickersService(Context context) {
instance = this;
@@ -72,6 +69,10 @@ public class TelegramStickersService {
updatePacks(true);
}
public static TelegramStickersService getInstance(Context c) {
return instance == null ? new TelegramStickersService(c) : instance;
}
private void updatePacks(final boolean notify) {
packs.clear();
dbHelper.getAllPacks(new TelegramStickersDbHelper.PacksLoadingListener() {
@@ -105,20 +106,6 @@ public class TelegramStickersService {
});
}
interface StickersEventsListener {
void onPackAdded(TelegramStickersPack pack, int atIndex);
void onPackRemoved(TelegramStickersPack pack, int atIndex);
void onPackChanged(TelegramStickersPack pack, int atIndex);
void onPackDownloadError(TelegramStickersPack pack, Exception error);
void onActivePacksListChanged();
void onInactivePacksListChanged();
}
public void addStickersEventsListener(StickersEventsListener listener) {
listeners.add(listener);
}
@@ -128,7 +115,7 @@ public class TelegramStickersService {
}
private void notifyPackAdded(TelegramStickersPack pack, int atIndex) {
Helper.GetContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
getContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
if (listeners.isEmpty())
return;
@@ -138,7 +125,7 @@ public class TelegramStickersService {
}
private void notifyPackChanged(TelegramStickersPack pack, int atIndex) {
Helper.GetContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
getContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
if (listeners.isEmpty())
return;
@@ -148,7 +135,7 @@ public class TelegramStickersService {
}
private void notifyPackRemoved(TelegramStickersPack pack, int atIndex) {
Helper.GetContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
getContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
if (listeners.isEmpty())
return;
@@ -158,7 +145,7 @@ public class TelegramStickersService {
}
private void notifyPackDownloadError(TelegramStickersPack pack, Exception error) {
Helper.GetContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
getContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
if (listeners.isEmpty())
return;
@@ -168,7 +155,7 @@ public class TelegramStickersService {
}
private void notifyActivePacksListChanged() {
Helper.GetContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
getContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
if (listeners.isEmpty())
return;
@@ -178,7 +165,7 @@ public class TelegramStickersService {
}
private void notifyInactivePacksListChanged() {
Helper.GetContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
getContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD));
if (listeners.isEmpty())
return;
@@ -398,5 +385,19 @@ public class TelegramStickersService {
getPacksListReference().set(li1, p2);
}
interface StickersEventsListener {
void onPackAdded(TelegramStickersPack pack, int atIndex);
void onPackRemoved(TelegramStickersPack pack, int atIndex);
void onPackChanged(TelegramStickersPack pack, int atIndex);
void onPackDownloadError(TelegramStickersPack pack, Exception error);
void onActivePacksListChanged();
void onInactivePacksListChanged();
}
}
@@ -7,6 +7,10 @@ import android.provider.BaseColumns;
*/
public final class TelegramStickersContract {
public static final String SQL_CREATE_ENTRIES = String.format("CREATE TABLE %s (%s INTEGER PRIMARY KEY, %s INTEGER AUTO_INCREMENT, %s TEXT, %s TEXT, %s TEXT, %s INTEGER, %s INTEGER, %s TEXT, %s TEXT)",
StickersTableEntry.TABLE_NAME, StickersTableEntry._ID, StickersTableEntry.COLUMN_NAME_INDEX, StickersTableEntry.COLUMN_NAME_ID, StickersTableEntry.COLUMN_NAME_NAME,
StickersTableEntry.COLUMN_NAME_FOLDER, StickersTableEntry.COLUMN_NAME_STICKERS_COUNT, StickersTableEntry.COLUMN_NAME_ENABLED, StickersTableEntry.COLUMN_NAME_VERSION, StickersTableEntry.COLUMN_NAME_EMOJIS);
private TelegramStickersContract() {
}
@@ -23,9 +27,5 @@ public final class TelegramStickersContract {
public static final String COLUMN_NAME_EMOJIS = "emojis";
}
public static final String SQL_CREATE_ENTRIES = String.format("CREATE TABLE %s (%s INTEGER PRIMARY KEY, %s INTEGER AUTO_INCREMENT, %s TEXT, %s TEXT, %s TEXT, %s INTEGER, %s INTEGER, %s TEXT, %s TEXT)",
StickersTableEntry.TABLE_NAME, StickersTableEntry._ID, StickersTableEntry.COLUMN_NAME_INDEX, StickersTableEntry.COLUMN_NAME_ID, StickersTableEntry.COLUMN_NAME_NAME,
StickersTableEntry.COLUMN_NAME_FOLDER, StickersTableEntry.COLUMN_NAME_STICKERS_COUNT, StickersTableEntry.COLUMN_NAME_ENABLED, StickersTableEntry.COLUMN_NAME_VERSION, StickersTableEntry.COLUMN_NAME_EMOJIS);
}
@@ -11,12 +11,12 @@ import android.util.Log;
import com.aefyr.tsg.g2.TelegramStickersPack;
import java.io.File;
import java.util.ArrayList;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
/**
* Created by Aefyr on 19.05.2018.
*/
@@ -27,12 +27,6 @@ public class TelegramStickersDbHelper extends SQLiteOpenHelper {
private SQLiteDatabase writableDb;
private SQLiteDatabase readableDb;
public interface PacksLoadingListener {
void onPackLoaded(TelegramStickersPack pack);
void onAllPacksLoaded(ArrayList<TelegramStickersPack> packs);
}
public TelegramStickersDbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@@ -105,6 +99,12 @@ public class TelegramStickersDbHelper extends SQLiteOpenHelper {
new PacksLoadingTask(listener).execute();
}
public interface PacksLoadingListener {
void onPackLoaded(TelegramStickersPack pack);
void onAllPacksLoaded(ArrayList<TelegramStickersPack> packs);
}
private class PacksLoadingTask extends AsyncTask<Void, Void, ArrayList<TelegramStickersPack>> {
PacksLoadingListener listener;
@@ -9,12 +9,6 @@ import android.util.Log;
import com.aefyr.tsg.g2.stickersgrabber.util.Flag;
import com.aefyr.tsg.g2.stickersgrabber.util.GoalCounter;
import ru.f0x1d.net.NetCall;
import ru.f0x1d.net.NetCallback;
import ru.f0x1d.net.NetClient;
import ru.f0x1d.net.NetRequest;
import ru.f0x1d.net.NetResponse;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -33,17 +27,17 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import ru.f0x1d.net.NetCall;
import ru.f0x1d.net.NetCallback;
import ru.f0x1d.net.NetClient;
import ru.f0x1d.net.NetRequest;
import ru.f0x1d.net.NetResponse;
/**
* Created by Aefyr on 11.05.2018.
*/
public class TelegramStickersGrabber {
private static final String TAG = "TSG";
private static String BOT_API_BASE_URL;
private static String GET_STICKER_SET_URL;
private static String GET_FILE_URL;
private static String BOT_API_BASE_FILE_URL;
public static String REAL_TG_IP = null;
public static String PROXY_IP = null;
public static int PROXY_PORT = -1;
@@ -52,11 +46,32 @@ public class TelegramStickersGrabber {
public static boolean PROXY_SOCKS = true;
public static boolean HAS_PASS = false;
public static boolean USE_PROXY = false;
private static String BOT_API_BASE_URL;
private static String GET_STICKER_SET_URL;
private static String GET_FILE_URL;
private static String BOT_API_BASE_FILE_URL;
static {
updateURLs();
}
private final MessageDigest sha256;
private final Handler uiThreadHandler;
private String botApiKey = "";
private NetClient httpClient;
public TelegramStickersGrabber(String botApiKey) {
this.botApiKey = botApiKey;
httpClient = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build();
uiThreadHandler = new Handler(Looper.getMainLooper());
try {
sha256 = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
Log.wtf(TAG, "No support for SHA-256");
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void updateURLs() {
BOT_API_BASE_FILE_URL = "https://api.telegram.org/file/bot%s/%s";
@@ -66,11 +81,6 @@ public class TelegramStickersGrabber {
GET_FILE_URL = BOT_API_BASE_URL + "getFile?file_id=%s";
}
private String botApiKey = "";
private NetClient httpClient;
private final MessageDigest sha256;
private final Handler uiThreadHandler;
public static boolean isTelegramBlocked() {
NetClient client = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build();
try {
@@ -101,43 +111,6 @@ public class TelegramStickersGrabber {
return false;
}
public interface PackDownloadListener {
void onPackDownloaded(TelegramStickersPackInfo pack, boolean newVersionFound);
void onPackDownloadError(Exception e);
void onGotPackInfo(TelegramStickersPackInfo packInfo);
void onStickerDownloaded(String pack, File sticker, String boundEmoji, int stickerIndex, int downloadedStickersCount, int totalStickerCount);
}
public interface KeyCheckListener {
void onKeyChecked(boolean ok);
void onNetError();
}
public class TSGException extends Exception {
private static final long serialVersionUID = 7866915509988422944L;
private TSGException(String message) {
super(message);
}
}
public TelegramStickersGrabber(String botApiKey) {
this.botApiKey = botApiKey;
httpClient = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build();
uiThreadHandler = new Handler(Looper.getMainLooper());
try {
sha256 = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
Log.wtf(TAG, "No support for SHA-256");
e.printStackTrace();
throw new RuntimeException(e);
}
}
public void resetProxy() {
httpClient = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build();
}
@@ -201,40 +174,6 @@ public class TelegramStickersGrabber {
});
}
private class StickerSet {
String id;
String name;
String version;
ArrayList<Sticker> stickers;
StickerSet(String id, String name, String version, ArrayList<Sticker> stickers) {
this.name = name;
this.stickers = stickers;
this.id = id;
this.version = version;
}
}
private class Sticker {
String emoji;
String fileId;
Sticker(String fileId, String emoji) {
this.fileId = fileId;
this.emoji = emoji;
}
@Override
public boolean equals(Object obj) {
return obj instanceof Sticker && ((Sticker) obj).fileId.equals(fileId);
}
@Override
public int hashCode() {
return (17 * emoji.hashCode()) << 32 + fileId.hashCode();
}
}
private void getPackInfo(final String packName, final File packFolder, final String installedVersion, final PackDownloadListener listener) {
NetRequest packInfoRequest = new NetRequest.Builder().get().url(String.format(GET_STICKER_SET_URL, botApiKey, packName)).build();
httpClient.newCall(packInfoRequest).enqueue(new NetCallback() {
@@ -478,4 +417,62 @@ public class TelegramStickersGrabber {
private void runOnUiThread(Runnable r) {
uiThreadHandler.post(r);
}
public interface PackDownloadListener {
void onPackDownloaded(TelegramStickersPackInfo pack, boolean newVersionFound);
void onPackDownloadError(Exception e);
void onGotPackInfo(TelegramStickersPackInfo packInfo);
void onStickerDownloaded(String pack, File sticker, String boundEmoji, int stickerIndex, int downloadedStickersCount, int totalStickerCount);
}
public interface KeyCheckListener {
void onKeyChecked(boolean ok);
void onNetError();
}
public class TSGException extends Exception {
private static final long serialVersionUID = 7866915509988422944L;
private TSGException(String message) {
super(message);
}
}
private class StickerSet {
String id;
String name;
String version;
ArrayList<Sticker> stickers;
StickerSet(String id, String name, String version, ArrayList<Sticker> stickers) {
this.name = name;
this.stickers = stickers;
this.id = id;
this.version = version;
}
}
private class Sticker {
String emoji;
String fileId;
Sticker(String fileId, String emoji) {
this.fileId = fileId;
this.emoji = emoji;
}
@Override
public boolean equals(Object obj) {
return obj instanceof Sticker && ((Sticker) obj).fileId.equals(fileId);
}
@Override
public int hashCode() {
return (17 * emoji.hashCode()) << 32 + fileId.hashCode();
}
}
}
@@ -7,14 +7,9 @@ import android.util.Log;
*/
public class GoalCounter {
public interface OnGoalReachListener {
void onGoalReached();
}
private int goal;
private final int goal;
private int i = 0;
private OnGoalReachListener listener;
private final OnGoalReachListener listener;
public GoalCounter(int goal, OnGoalReachListener listener) {
this.goal = goal;
@@ -36,4 +31,8 @@ public class GoalCounter {
public synchronized int value() {
return i;
}
public interface OnGoalReachListener {
void onGoalReached();
}
}
File diff suppressed because it is too large Load Diff
+2 -6
View File
@@ -7,20 +7,17 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import okhttp3.Headers;
import okhttp3.internal.Util;
import okhttp3.internal.b.HttpMethod;
import okhttp3.Request;
public final class Request {
/* renamed from: a reason: collision with root package name */
final HttpUrl a;
final String b;
final Headers c;
final Map<Class<?>, Object> e;
private volatile CacheControl f;
@Nullable
final RequestBody requestBody;
private volatile CacheControl f;
Request(Builder builder) {
this.a = builder.a;
@@ -58,7 +55,7 @@ public final class Request {
@Nullable
public <T> T a(Class<? extends T> cls) {
return (T) cls.cast(this.e.get(cls));
return cls.cast(this.e.get(cls));
}
public Builder e() {
@@ -85,7 +82,6 @@ public final class Request {
public static class Builder {
/* renamed from: a reason: collision with root package name */
HttpUrl a;
String b;
Headers.a c;
@@ -1,5 +1,7 @@
package ru.f0x1d.net;
import static ru.vtosters.lite.utils.Globals.getUserToken;
import android.os.AsyncTask;
import com.vk.core.network.Network;
@@ -9,14 +11,8 @@ import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import ru.vtosters.lite.utils.Helper;
public class F0x1dRequest {
public interface F0x1dRequestCallback {
void onResponse(String str);
}
public static void makeRequest(byte[] bArr, F0x1dRequestCallback f0x1dRequestCallback) {
new MakeRequestTask(bArr, f0x1dRequestCallback).execute();
}
@@ -29,11 +25,15 @@ public class F0x1dRequest {
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 F0x1dRequestCallback callback;
private final F0x1dRequestCallback callback;
private boolean mIsPut;
private boolean mIsVkToasterRequest;
private byte[] url;
private final byte[] url;
public MakeRequestTask(byte[] bArr, F0x1dRequestCallback f0x1dRequestCallback) {
this.mIsVkToasterRequest = false;
@@ -51,13 +51,12 @@ public class F0x1dRequest {
this.mIsPut = z2;
}
/* JADX INFO: Access modifiers changed from: protected */
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", Helper.GetUserToken());
httpURLConnection.setRequestProperty("Token", getUserToken());
}
if (!this.mIsVkToasterRequest) {
httpURLConnection.setRequestProperty("User-Agent", Network.a.a().a());
+14 -14
View File
@@ -1,5 +1,7 @@
package ru.f0x1d.net;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -13,17 +15,25 @@ import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.TreeMap;
import android.util.Base64;
public final class NetCall {
private NetRequest req;
private NetClient cl;
private final NetRequest req;
private final NetClient cl;
protected NetCall(NetClient cl, NetRequest req) {
this.req = req;
this.cl = cl;
}
private static String constructArgs(Map<String, String> args) throws UnsupportedEncodingException {
args = new TreeMap<>(args);
String str = "";
for (Map.Entry<String, String> en : args.entrySet()) {
if (!str.isEmpty()) str += "&";
str += URLEncoder.encode(en.getKey(), "UTF-8") + "=" + URLEncoder.encode(en.getValue(), "UTF-8");
}
return str;
}
public NetRequest request() {
return req;
}
@@ -65,16 +75,6 @@ public final class NetCall {
return r;
}
private static String constructArgs(Map<String, String> args) throws UnsupportedEncodingException {
args = new TreeMap<>(args);
String str = "";
for (Map.Entry<String, String> en : args.entrySet()) {
if (!str.isEmpty()) str += "&";
str += URLEncoder.encode(en.getKey(), "UTF-8") + "=" + URLEncoder.encode(en.getValue(), "UTF-8");
}
return str;
}
public void enqueue(NetCallback cb) {
new Thread() {
@Override
+33 -33
View File
@@ -5,9 +5,39 @@ import java.net.Proxy;
import java.util.concurrent.TimeUnit;
public class NetClient {
private long timeout;
private Proxy proxy;
private PasswordAuthentication authenticator;
private final long timeout;
private final Proxy proxy;
private final PasswordAuthentication authenticator;
protected NetClient(Builder b) {
timeout = b.timeout;
proxy = b.proxy;
authenticator = b.auth;
}
public Builder newBuilder() {
Builder b = new Builder();
b.timeout = timeout;
b.proxy = proxy;
b.auth = authenticator;
return b;
}
public NetCall newCall(NetRequest req) {
return new NetCall(this, req);
}
public PasswordAuthentication getAuthenticator() {
return authenticator;
}
public Proxy getProxy() {
return proxy;
}
public long getTimeout() {
return timeout;
}
public static final class Builder {
private long timeout;
@@ -54,34 +84,4 @@ public class NetClient {
return new NetClient(this);
}
}
public Builder newBuilder() {
Builder b = new Builder();
b.timeout = timeout;
b.proxy = proxy;
b.auth = authenticator;
return b;
}
protected NetClient(Builder b) {
timeout = b.timeout;
proxy = b.proxy;
authenticator = b.auth;
}
public NetCall newCall(NetRequest req) {
return new NetCall(this, req);
}
public PasswordAuthentication getAuthenticator() {
return authenticator;
}
public Proxy getProxy() {
return proxy;
}
public long getTimeout() {
return timeout;
}
}
+21 -21
View File
@@ -4,9 +4,27 @@ import java.util.Map;
import java.util.TreeMap;
public class NetRequest {
private String url;
private String requestMethod;
private Map<String, String> params;
private final String url;
private final String requestMethod;
private final Map<String, String> params;
protected NetRequest(Builder b) {
url = b.url;
requestMethod = b.req;
params = b.params;
}
public Map<String, String> getRequestParams() {
return params;
}
public String url() {
return url;
}
public String getRequestMethod() {
return requestMethod;
}
public static final class Builder {
private String url;
@@ -43,22 +61,4 @@ public class NetRequest {
return this;
}
}
protected NetRequest(Builder b) {
url = b.url;
requestMethod = b.req;
params = b.params;
}
public Map<String, String> getRequestParams() {
return params;
}
public String url() {
return url;
}
public String getRequestMethod() {
return requestMethod;
}
}
@@ -5,7 +5,7 @@ import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public final class NetResponse {
private byte[] data;
private final byte[] data;
private int code;
protected NetResponse(byte[] data) {
@@ -26,16 +26,11 @@ import java.util.concurrent.atomic.AtomicBoolean;
import javax.net.ssl.HttpsURLConnection;
public class GCMFix {
private static String agent = String.format("Android-GCM/1.5 (%s %s)", Build.MODEL, Build.MODEL);
public static ArrayList<String> langs = new ArrayList<>();
private static final String agent = String.format("Android-GCM/1.5 (%s %s)", Build.MODEL, Build.MODEL);
private static KeyPair pair;
private static int rid = 0;
/* access modifiers changed from: private */
public interface Callback {
void doCallback(String str);
}
static {
genNewKey();
}
@@ -95,12 +90,12 @@ public class GCMFix {
}
}
static /* synthetic */ void lambdaRequestToken(StringBuilder sb, AtomicBoolean wait, String s) {
static void lambdaRequestToken(StringBuilder sb, AtomicBoolean wait, String s) {
sb.append(s.substring(20));
wait.set(true);
}
static /* synthetic */ void lambda$requestToken$1(String str) {
static void lambda$requestToken$1(String str) {
}
private static void fillParams(List<String> params, String sig, String pub2, String xappid, long androidId, boolean del) {
@@ -196,4 +191,8 @@ public class GCMFix {
return null;
}
}
public interface Callback {
void doCallback(String str);
}
}
@@ -164,7 +164,7 @@ public class DeviceInfoCollector {
declaredField.setAccessible(true);
Object obj = declaredField.get(defaultAdapter);
if (obj != null) {
return (String) obj.getClass().getMethod("getAddress", new Class[0]).invoke(obj, new Object[0]);
return (String) obj.getClass().getMethod("getAddress").invoke(obj, new Object[0]);
}
return null;
} catch (Exception e) {
@@ -1,6 +1,10 @@
package ru.vtosters.lite.dnr;
import android.util.Log;
import static ru.vtosters.lite.dnr.DNRModule.hookDNR;
import static ru.vtosters.lite.dnr.DNRModule.hookDNT;
import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor;
import static ru.vtosters.lite.utils.Globals.getIdentifier;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.ui.components.common.DialogAction;
@@ -8,19 +12,17 @@ import com.vk.im.ui.components.common.DialogAction;
import java.util.LinkedHashMap;
import java.util.List;
import ru.vtosters.lite.utils.Helper;
public class DNRInjector {
public static void inject(Dialog dialog, List<DialogAction> list) {
int peerId = dialog.a();
if (DNRModule.isDnrEnabledFor(peerId)) {
if (isDnrEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNR_OFF"));
} else {
list.add(DialogAction.valueOf("DNR_ON"));
}
if (DNRModule.isDntEnabledFor(peerId)) {
if (isDntEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNT_OFF"));
} else {
list.add(DialogAction.valueOf("DNT_ON"));
@@ -28,10 +30,10 @@ public class DNRInjector {
}
public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) {
hashMap.put(DialogAction.valueOf("DNR_ON"), Helper.getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.valueOf("DNR_OFF"), Helper.getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.valueOf("DNT_ON"), Helper.getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.valueOf("DNT_OFF"), Helper.getIdentifier("DNT_OFF", "string"));
hashMap.put(DialogAction.valueOf("DNR_ON"), getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.valueOf("DNR_OFF"), getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.valueOf("DNT_ON"), getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.valueOf("DNT_OFF"), getIdentifier("DNT_OFF", "string"));
return hashMap;
}
@@ -58,11 +60,11 @@ public class DNRInjector {
}
public static void setDnr(Dialog dialog, boolean value) {
DNRModule.hookDNR(dialog.a());
hookDNR(dialog.a());
}
public static void setDnt(Dialog dialog, boolean value) {
DNRModule.hookDNT(dialog.a());
hookDNT(dialog.a());
}
}
@@ -1,6 +1,8 @@
package ru.vtosters.lite.dnr;
import android.util.Log;
import static ru.f0x1d.net.F0x1dRequest.makeRequest;
import static ru.vtosters.lite.utils.Globals.getUserToken;
import static ru.vtosters.lite.utils.Proxy.getApiCom;
import com.vk.core.util.ToastUtils;
import com.vk.im.engine.commands.messages.SetUserActivityCmd;
@@ -8,15 +10,13 @@ import com.vk.im.engine.models.dialogs.Dialog;
import java.util.List;
import ru.f0x1d.net.F0x1dRequest;
import ru.vtosters.lite.dnr.helpers.DoNotReadDBHelper;
import ru.vtosters.lite.dnr.helpers.DoNotTypeDBHelper;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.Proxy;
public class DNRModule {
public static DoNotReadDBHelper mDoNotReadDBHelper = new DoNotReadDBHelper();
public static DoNotTypeDBHelper mDoNotTypeDBHelper = new DoNotTypeDBHelper();
public static Dialog mDialog;
public static boolean isDnrEnabledFor(int id) {
var isEnabled = mDoNotReadDBHelper.isEnabledForPeerId(id);
@@ -51,13 +51,11 @@ public class DNRModule {
}
public static void hookRead(Dialog dialog) {
F0x1dRequest.makeRequest("https://" + Proxy.getApiCom() + "/method/messages.markAsRead?start_message_id=" + dialog.lastMsgVkId + "&peer_id=" + dialog.a() + "&v=5.91&access_token=" + Helper.GetUserToken(), response -> {
makeRequest("https://" + getApiCom() + "/method/messages.markAsRead?start_message_id=" + dialog.lastMsgVkId + "&peer_id=" + dialog.a() + "&v=5.91&access_token=" + getUserToken(), response -> {
ToastUtils.a("Чат помечен как прочитанный!");
});
}
public static Dialog mDialog;
public static void hookDNR(int peerId) {
mDoNotReadDBHelper.setEnabledForPeerId(peerId, !mDoNotReadDBHelper.isEnabledForPeerId(peerId));
}
@@ -1,10 +1,10 @@
package ru.vtosters.lite.dnr;
import ru.vtosters.lite.utils.Prefs;
import static ru.vtosters.lite.utils.Preferences.BooleanFalse;
public class DNRPrefs {
public static boolean getStoriesRead() {
return Prefs.BooleanFalse("read_s");
return BooleanFalse("read_s");
}
public static boolean getMarkAsReadWithoutExceptions(int peerId) {
@@ -28,27 +28,27 @@ public class DNRPrefs {
}
public static boolean readPM(int peer) {
return (peer > 0 && peer < 2000000000) && Prefs.BooleanFalse("read_pm");
return (peer > 0 && peer < 2000000000) && BooleanFalse("read_pm");
}
public static boolean readConversations(int peer) {
return (peer > 2000000000) && Prefs.BooleanFalse("read_conversations");
return (peer > 2000000000) && BooleanFalse("read_conversations");
}
public static boolean readBots(int peer) {
return (peer < 0) && Prefs.BooleanFalse("read_bot");
return (peer < 0) && BooleanFalse("read_bot");
}
public static boolean writePM(int peer) {
return (peer > 0 && peer < 2000000000) && Prefs.BooleanFalse("write_pm");
return (peer > 0 && peer < 2000000000) && BooleanFalse("write_pm");
}
public static boolean writeConversations(int peer) {
return (peer > 2000000000) && Prefs.BooleanFalse("write_conversations");
return (peer > 2000000000) && BooleanFalse("write_conversations");
}
public static boolean writeBots(int peer) {
return (peer < 0) && Prefs.BooleanFalse("write_bot");
return (peer < 0) && BooleanFalse("write_bot");
}
public static boolean getActivityWithoutExceptions(int peerId) {
@@ -1,5 +1,7 @@
package ru.vtosters.lite.dnr.helpers;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
@@ -9,11 +11,10 @@ import java.util.ArrayList;
import java.util.List;
import ru.vtosters.lite.dnr.DNRPrefs;
import ru.vtosters.lite.utils.Helper;
public class DoNotReadDBHelper extends SQLiteOpenHelper {
public DoNotReadDBHelper() {
super(Helper.GetContext(), "dnr", null, 1);
super(getContext(), "dnr", null, 1);
}
@Override
@@ -1,5 +1,7 @@
package ru.vtosters.lite.dnr.helpers;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
@@ -9,11 +11,10 @@ import java.util.ArrayList;
import java.util.List;
import ru.vtosters.lite.dnr.DNRPrefs;
import ru.vtosters.lite.utils.Helper;
public class DoNotTypeDBHelper extends SQLiteOpenHelper {
public DoNotTypeDBHelper() {
super(Helper.GetContext(), "dnt", null, 1);
super(getContext(), "dnt", null, 1);
}
@Override
@@ -13,8 +13,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.R;
public class VideoDownloader {
public static void downloadVideo(VideoFile videoFile, Context context) {
final List<String> list = new ArrayList<>();
@@ -66,7 +64,7 @@ public class VideoDownloader {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(videoFile.toString());
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, videoFile.s + ".mp4");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, videoFile + ".mp4");
((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
}));
builder.show();
@@ -1,5 +1,9 @@
package ru.vtosters.lite.f0x1d;
import static ru.vtosters.lite.utils.About.*;
import static ru.vtosters.lite.utils.Globals.*;
import static ru.vtosters.lite.utils.Preferences.*;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -16,9 +20,7 @@ import com.vtosters.lite.R;
import java.io.PrintWriter;
import java.io.StringWriter;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.badmanners.DeviceInfoCollector;
import ru.vtosters.lite.utils.Prefs;
public class Crashreporter {
protected static String logString;
@@ -35,12 +37,12 @@ public class Crashreporter {
}
static void start(Thread.UncaughtExceptionHandler uncaughtExceptionHandler, Thread thread, Throwable th, Activity activity) {
logString = getStackTrace(th) + "\n\n" + new DeviceInfoCollector().collect(Helper.GetContext()).toDeviceName() + "\n VTL Version: " + Prefs.VERSIONNAME + ", build: " + Prefs.getBuildNumber();
logString = getStackTrace(th) + "\n\n" + new DeviceInfoCollector().collect(getContext()).toDeviceName() + "\n VTL Version: " + VERSIONNAME + ", build: " + getBuildNumber();
if (Build.VERSION.SDK_INT >= 26) {
var notificationChannel = new NotificationChannel("crashes", "crash", NotificationManager.IMPORTANCE_DEFAULT);
notificationChannel.enableVibration(true);
notificationChannel.enableLights(true);
((NotificationManager) Helper.GetContext().getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChannel);
((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChannel);
}
var foxbinIntent = new Intent("com.f0x1d.dogbin.ACTION_UPLOAD_TO_FOXBIN");
@@ -52,19 +54,19 @@ public class Crashreporter {
foxbinIntent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
}
var saveLogIntent = new Intent(Helper.GetContext(), LogWriterService.class);
var saveLogIntent = new Intent(getContext(), LogWriterService.class);
saveLogIntent.putExtra("log", logString);
saveLogIntent.putExtra("notificationId", 1);
var psaveLogIntent = PendingIntent.getService(Helper.GetContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT);
var psaveLogIntent = PendingIntent.getService(getContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT);
var builder = new Notification.Builder(Helper.GetContext());
var builder = new Notification.Builder(getContext());
builder.setSmallIcon(R.drawable.ic_bug_24);
builder.setContentTitle("VTL Крашнулся!");
builder.setContentText(logString);
builder.setStyle(new Notification.BigTextStyle().bigText(logString));
builder.setAutoCancel(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
builder.addAction(new Notification.Action(0, "Загрузить логи", PendingIntent.getActivity(Helper.GetContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT)));
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, "Сохранить в файл", psaveLogIntent));
} else {
builder.setContentIntent(PendingIntent.getActivity(activity, 0, foxbinIntent, PendingIntent.FLAG_ONE_SHOT));
@@ -75,13 +77,13 @@ public class Crashreporter {
}
((NotificationManager) Helper.GetContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify(-2147483548, builder.build());
((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify(-2147483548, builder.build());
Log.e("VTosters Lite", "crashed: " + th.getLocalizedMessage());
uncaughtExceptionHandler.uncaughtException(thread, th);
}
private static boolean isFoxbinInstalled() {
var pm = Helper.GetContext().getPackageManager();
var pm = getContext().getPackageManager();
try {
pm.getPackageInfo("com.f0x1d.dogbin", 0);
return true;
@@ -1,5 +1,9 @@
package ru.vtosters.lite.f0x1d;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
@@ -7,7 +11,6 @@ import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.Nullable;
@@ -16,8 +19,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import ru.vtosters.lite.utils.Helper;
public class LogWriterService extends Service {
public LogWriterService() {
}
@@ -38,12 +39,12 @@ public class LogWriterService extends Service {
writeLog(intent, file);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(Helper.GetContext(), "Не удалось сохранить лог-файл", Toast.LENGTH_SHORT).show();
makeText(getContext(), "Не удалось сохранить лог-файл", LENGTH_SHORT).show();
}
var notificationId = intent.getIntExtra("notificationId", 1);
var manager = (NotificationManager) Helper.GetContext().getSystemService(Context.NOTIFICATION_SERVICE);
var manager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notificationId);
Toast.makeText(Helper.GetContext(), "Лог-файл был сохранен", Toast.LENGTH_SHORT).show();
makeText(getContext(), "Лог-файл был сохранен", LENGTH_SHORT).show();
stopSelf();
return START_NOT_STICKY;
@@ -1,5 +1,7 @@
package ru.vtosters.lite.f0x1d;
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
@@ -9,14 +11,14 @@ import android.widget.Toast;
import com.vk.dto.common.VerifyInfo;
import com.vk.navigation.NavigatorKeys;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
@@ -24,21 +26,19 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import ru.vtosters.lite.utils.Prefs;
public class VTVerifications {
public static final HashMap<Integer, Boolean> sServiceAccountsMap = new HashMap<>();
private static final String TAG = "VTVerifications";
private static final String DEVELOPERS_KEY = "VTNRS3";
private static final String PROMETHEUS_KEY = "VTNRS1";
private static final String SERVICE_ACCOUNTS_KEY = "VTNRS4";
private static final String VERIFICATIONS_KEY = "VTNRS0";
private static SharedPreferences mVerificationsCache;
private static final HashMap<Integer, Boolean> sDevelopersMap = new HashMap<>();
private static final HashMap<Integer, Boolean> sPrometheusMap = new HashMap<>();
public static final HashMap<Integer, Boolean> sServiceAccountsMap = new HashMap<>();
private static final HashMap<Integer, Boolean> sVerificationsMap = new HashMap<>();
private static OkHttpClient client = new OkHttpClient();
private static SharedPreferences mVerificationsCache;
private static final OkHttpClient client = new OkHttpClient();
public static void load(Context context) {
mVerificationsCache = context.getSharedPreferences("vt_another_data", 0);
@@ -136,30 +136,24 @@ public class VTVerifications {
if (jSONObject.optInt("verified", 0) == 1) {
return true;
}
if (!Prefs.BooleanTrue("VT_Verification")) {
if (!BooleanTrue("VT_Verification")) {
return false;
}
if (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 true;
}
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));
}
public static boolean hasPrometheus(JSONObject jSONObject) {
if (jSONObject.optInt("trending", 0) == 1) {
return true;
}
if (!Prefs.BooleanTrue("VT_Fire")) {
if (!BooleanTrue("VT_Fire")) {
return false;
}
if (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 true;
}
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));
}
public static boolean hasDeveloper(JSONObject jSONObject) {
if (!Prefs.BooleanTrue("VT_Dev")) {
if (!BooleanTrue("VT_Dev")) {
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));
@@ -1,16 +1,19 @@
package ru.vtosters.lite.foaf;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.utils.Globals.getString;
import static ru.vtosters.lite.utils.Proxy.getApiCom;
import static ru.vtosters.lite.utils.Proxy.proxy;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
import androidx.exifinterface.media.ExifInterface;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import java.io.IOException;
import java.text.ParseException;
@@ -24,17 +27,13 @@ import java.util.regex.Pattern;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.f0x1d.net.F0x1dRequest;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.Prefs;
import ru.vtosters.lite.utils.Preferences;
public class FoafBase {
private static final Pattern FOAF_REGEX = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
private static final Pattern FOAF_REGEX_LAST_SEEN = Pattern.compile("<ya:lastLoggedIn dc:date=\"(.*)(((\\+|-)\\d\\d):(\\d\\d))\"\\/>");
private static final Pattern FOAF_REGEX_LOGIN = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
private static OkHttpClient client = new OkHttpClient();
private static final OkHttpClient client = new OkHttpClient();
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());
@@ -51,7 +50,7 @@ public class FoafBase {
private static String getLink(int i) {
String str;
StringBuilder sb;
if (Prefs.proxy()) {
if (proxy()) {
sb = new StringBuilder();
str = "https://" + getApiCom() + "/_/vk.com/foaf.php?id=";
} else {
@@ -73,7 +72,7 @@ public class FoafBase {
F0x1dRequest.makeRequest(getLink(i), callback);
}
static /* synthetic */ void lambdaLoadAndShow(ProgressDialog progressDialog, Context context, int i, String str) {
static void lambdaLoadAndShow(ProgressDialog progressDialog, Context context, int i, String str) {
try {
progressDialog.cancel();
Matcher matcher = FOAF_REGEX.matcher(str);
@@ -83,10 +82,10 @@ public class FoafBase {
String normalHumanDate = getNormalHumanDate(matcher.group(1));
getNormalHumanDate(matcher2.group(1));
AlertDialog.a a2 = new VkAlertDialog.a(context).a(R.string.addinf);
a2.b(Helper.getString("foafid") + " " + i + Helper.getString("foafregdate") + " " + normalHumanDate + Helper.getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).b(17039370, (DialogInterface.OnClickListener) null).b().show();
a2.b(getString("foafid") + " " + i + getString("foafregdate") + " " + normalHumanDate + getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).b(17039370, null).b().show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, Helper.getString("foaferr"), Toast.LENGTH_SHORT).show();
makeText(context, getString("foaferr"), LENGTH_SHORT).show();
}
}
@@ -2,6 +2,5 @@ package ru.vtosters.lite.provider;
import android.support.v4.content.FileProvider;
/* compiled from: VKFileProvider.kt */
public final class VKFileProvider extends FileProvider {
}
@@ -1,21 +1,20 @@
package ru.vtosters.lite.tgs;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import ru.vtosters.lite.utils.Helper;
public class TGPref {
private static SharedPreferences Prefs = PreferenceManager.getDefaultSharedPreferences(Helper.GetContext());
private static final SharedPreferences Prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
private static String
CNCT_METHOD = "VTGS:CM",
TG_BOTKEY = "VTGS:BKey",
TG_PROXYIP = "VTGS:PIP",
TG_PROXYPORT = "VTGS:PPT",
TG_PROXYPASS = "VTGS:PPS",
TG_PROXYUSER = "VTGS:PUS",
TG_PROXYUSEPASS = "VTGS:PUsePassword";
private static final String CNCT_METHOD = "VTGS:CM";
private static final String TG_BOTKEY = "VTGS:BKey";
private static final String TG_PROXYIP = "VTGS:PIP";
private static final String TG_PROXYPORT = "VTGS:PPT";
private static final String TG_PROXYPASS = "VTGS:PPS";
private static final String TG_PROXYUSER = "VTGS:PUS";
private static final String TG_PROXYUSEPASS = "VTGS:PUsePassword";
public static int getTGConnectMethod() {
return Integer.parseInt(Prefs.getString(CNCT_METHOD, "0"));
@@ -37,6 +36,10 @@ public class TGPref {
return Prefs.getString(TG_PROXYIP, null);
}
public static void setTGProxyIP(String ip) {
Prefs.edit().putString(TG_PROXYIP, ip).apply();
}
public static int getTGProxyPort() {
return Prefs.getInt(TG_PROXYPORT, 0);
}
@@ -53,13 +56,8 @@ public class TGPref {
return Prefs.getString(TG_PROXYUSER, "");
}
public static void setTGProxyIP(String ip) {
Prefs.edit().putString(TG_PROXYIP, ip).apply();
}
public static void setTGProxyUserPass(String user, String pass) {
Prefs.edit().putString(TG_PROXYUSER, user).putString(TG_PROXYPASS, pass)
.apply();
Prefs.edit().putString(TG_PROXYUSER, user).putString(TG_PROXYPASS, pass).apply();
}
public static boolean isTGProxyPassEnabled() {
@@ -1,8 +1,10 @@
package ru.vtosters.lite.tgs;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.getString;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import com.aefyr.tsg.g2.TelegramStickersPack;
import com.aefyr.tsg.g2.TelegramStickersService;
@@ -21,24 +23,20 @@ import org.json.JSONObject;
import java.util.List;
import java.util.Stack;
import ru.vtosters.lite.utils.Helper;
public class TGRoot {
private final static Stack<Integer> pendingStickers = new Stack<>();
public static final int N = 76820000;
public static final int X = 976820000;
private static String TAG = "TGRoot";
private final static Stack<Integer> pendingStickers = new Stack<>();
private static final String TAG = "TGRoot";
public static String getSummary() {
switch (TGPref.getTGConnectMethod()) {
case 0:
return Helper.getString("ctypedirect");
return getString("ctypedirect");
case 2:
return Helper.getString("ctypesocks");
return getString("ctypesocks");
default:
return Helper.getString("ctypedisabled");
return getString("ctypedisabled");
}
}
@@ -50,7 +48,7 @@ public class TGRoot {
int stickerId = (id - N) % 120;
TelegramStickersPack pack = null;
for (TelegramStickersPack p : TelegramStickersService.getInstance(Helper.GetContext()).getActivePacksListReference()) {
for (TelegramStickersPack p : TelegramStickersService.getInstance(getContext()).getActivePacksListReference()) {
if (p.index == index) {
pack = p;
break;
@@ -71,7 +69,7 @@ public class TGRoot {
public static void injectStickers(List<StickerStockItem> list) {
try {
List<TelegramStickersPack> packs = TelegramStickersService.getInstance(Helper.GetContext()).getActivePacksListReference();
List<TelegramStickersPack> packs = TelegramStickersService.getInstance(getContext()).getActivePacksListReference();
for (int i = packs.size() - 1; i >= 0; i--)
list.add(0, toStickerPack(packs.get(i)));
} catch (Exception e) {
@@ -84,7 +82,7 @@ public class TGRoot {
int index = (stickerId - N) / 120;
TelegramStickersPack p = null;
for (TelegramStickersPack p_ : TelegramStickersService.getInstance(Helper.GetContext())
for (TelegramStickersPack p_ : TelegramStickersService.getInstance(getContext())
.getActivePacksListReference()) {
if (p_.index == index) {
p = p_;
@@ -1,5 +1,8 @@
package ru.vtosters.lite.ui;
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.app.AlertDialog;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -22,22 +25,17 @@ import androidx.core.view.ViewCompat;
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
import com.vtosters.lite.ui.MaterialSwitchPreference;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.Themes;
public class PreferencesUtil {
public interface EditTextPrefChangeListener {
boolean onChanged(Preference preference, Object obj);
}
public static Drawable setTint(Context ctx, Drawable d) {
d.setColorFilter(Themes.getAccentColor(), PorterDuff.Mode.SRC_ATOP);
return d;
}
public static void addListPreference(MaterialPreferenceToolbarFragment fragment, String key, String def, CharSequence title, CharSequence[] entries, CharSequence[] entriesValue) {
ListPreference preference = new ListPreference(Helper.GetContext());
ListPreference preference = new ListPreference(getContext());
preference.a(entries);
preference.b(entriesValue);
preference.c(title); // setTitle
@@ -48,7 +46,7 @@ public class PreferencesUtil {
}
public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment materialPreferenceToolbarFragment, String key, CharSequence title, CharSequence summary, boolean defValue) {
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(Helper.GetContext());
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getContext());
materialSwitchPreference.c(title); // setTitle
materialSwitchPreference.b(summary); // setSummary
materialSwitchPreference.d(key); // setKey
@@ -58,7 +56,7 @@ public class PreferencesUtil {
}
public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, int icon, boolean defValue, Preference.b listener) {
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(Helper.GetContext());
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getContext());
materialSwitchPreference.c(title); // setTitle
materialSwitchPreference.b(summary); // setSummary
materialSwitchPreference.d(key); // setKey
@@ -66,13 +64,13 @@ public class PreferencesUtil {
materialSwitchPreference.a(listener); // setOnPreferenceClickListener
if (icon != 1)
materialSwitchPreference.a(setTint(Helper.GetContext(), ContextCompat.getDrawable(Helper.GetContext(), icon))); // preference.setIcon
materialSwitchPreference.a(setTint(getContext(), ContextCompat.getDrawable(getContext(), icon))); // preference.setIcon
fragment.ay().d(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference)
}
public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, String icon, boolean defValue, Preference.b listener) {
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(Helper.GetContext());
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getContext());
materialSwitchPreference.c(title); // setTitle
materialSwitchPreference.b(summary); // setSummary
materialSwitchPreference.d(key); // setKey
@@ -80,14 +78,14 @@ public class PreferencesUtil {
fragment.ay().d(materialSwitchPreference); // materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(preference)
if (icon != null)
materialSwitchPreference.a(setTint(Helper.GetContext(), getDrawable(Helper.GetContext(), icon))); // preference.setIcon
materialSwitchPreference.a(setTint(getContext(), getDrawable(getContext(), icon))); // preference.setIcon
materialSwitchPreference.a(listener); // setOnPreferenceClickListener(listener)
fragment.ay().d(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference)
}
public static void addPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary) {
Preference preference = new Preference(Helper.GetContext());
Preference preference = new Preference(getContext());
preference.b(summary); // setSummary
preference.c(title); // setTitle
preference.d(key); // setKey
@@ -96,64 +94,64 @@ public class PreferencesUtil {
}
public static void addPreference(MaterialPreferenceToolbarFragment fragment, CharSequence title, CharSequence summary, @Nullable String icon, Preference.c listener) {
Preference preference = new Preference(Helper.GetContext());
Preference preference = new Preference(getContext());
preference.b(summary); // setSummary
preference.c(title); // setTitle
if (icon != null)
preference.a(setTint(Helper.GetContext(), getDrawable(Helper.GetContext(), icon))); // preference.setIcon
preference.a(setTint(getContext(), getDrawable(getContext(), icon))); // preference.setIcon
preference.a(listener); // preference.setOnPreferenceClickListener(listener)
fragment.ay().d(preference); // fragment.getPreferenceScreen().addPreference(preference)
}
public static void addPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, @Nullable String icon, Preference.c listener) {
Preference preference = new Preference(Helper.GetContext());
Preference preference = new Preference(getContext());
preference.b(summary); // setSummary
preference.c(title); // setTitle
preference.d(key); // setKey
if (icon != null)
preference.a(setTint(Helper.GetContext(), getDrawable(Helper.GetContext(), icon))); // preference.setIcon
preference.a(setTint(getContext(), getDrawable(getContext(), icon))); // preference.setIcon
preference.a(listener); // preference.setOnPreferenceClickListener(listener)
fragment.ay().d(preference); // fragment.getPreferenceScreen().addPreference(preference)
}
public static void addPreferenceCategory(MaterialPreferenceToolbarFragment fragment, CharSequence title) {
PreferenceCategory preference = new PreferenceCategory(Helper.GetContext(), null);
PreferenceCategory preference = new PreferenceCategory(getContext(), null);
preference.c(title); // setTitle
fragment.ay().d(preference); // fragment.getPreferenceScreen().addPreference(preference)
}
public static void addPreferenceCategory(MaterialPreferenceToolbarFragment fragment, CharSequence title, int collapsedSize) {
PreferenceCategory preference = new PreferenceCategory(Helper.GetContext(), null);
PreferenceCategory preference = new PreferenceCategory(getContext(), null);
preference.c(title); // setTitle
fragment.ay().d(preference); // fragment.getPreferenceScreen().addPreference(preference)
}
public static void addEditTextPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, EditTextPrefChangeListener editTextPrefChangeListener) {
Preference preference = new Preference(Helper.GetContext());
Preference preference = new Preference(getContext());
preference.c(title); // setTitle
preference.d(key); // setKey
preference.a(preference1 -> {
LinearLayout linearLayout = new LinearLayout(Helper.GetContext());
LinearLayout linearLayout = new LinearLayout(getContext());
final EditText editText = new EditText(Helper.GetContext());
editText.setText(PreferenceManager.getDefaultSharedPreferences(Helper.GetContext()).getString(key, ""));
final EditText editText = new EditText(getContext());
editText.setText(PreferenceManager.getDefaultSharedPreferences(getContext()).getString(key, ""));
editText.setHint(title);
editText.setHintTextColor(PreferencesUtil.getSTextColor(Helper.GetContext()));
editText.setHintTextColor(PreferencesUtil.getSTextColor(getContext()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setBackgroundTintList(ColorStateList.valueOf(PreferencesUtil.getTextColor(Helper.GetContext())));
editText.setBackgroundTintList(ColorStateList.valueOf(PreferencesUtil.getTextColor(getContext())));
} else {
ViewCompat.setBackgroundTintList(editText, ColorStateList.valueOf(PreferencesUtil.getTextColor(Helper.GetContext())));
ViewCompat.setBackgroundTintList(editText, ColorStateList.valueOf(PreferencesUtil.getTextColor(getContext())));
}
linearLayout.addView(editText);
editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams());
margin.setMargins(Helper.convertDpToPixel(24f), 0, Helper.convertDpToPixel(24f), 0);
margin.setMargins(convertDpToPixel(24f), 0, convertDpToPixel(24f), 0);
editText.setLayoutParams(margin);
AlertDialog.Builder builder = new AlertDialog.Builder(fragment.p());
@@ -164,7 +162,7 @@ public class PreferencesUtil {
if (!change)
return;
PreferenceManager.getDefaultSharedPreferences(Helper.GetContext())
PreferenceManager.getDefaultSharedPreferences(getContext())
.edit()
.putString(key, editText.getText().toString())
.apply();
@@ -192,4 +190,8 @@ public class PreferencesUtil {
var id = ctx.getResources().getIdentifier(name, "drawable", ctx.getPackageName());
return ContextCompat.getDrawable(ctx, id);
}
public interface EditTextPrefChangeListener {
boolean onChanged(Preference preference, Object obj);
}
}
@@ -1,5 +1,9 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.Globals.edit;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
@@ -9,14 +13,12 @@ import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.OEMDetector;
import ru.vtosters.lite.utils.Prefs;
public class DisableBattery {
public static void alert(Activity activity) {
if (OEMDetector.isOEM() && Build.VERSION.SDK_INT >= 23 && Prefs.BooleanTrue("showDoze")) {
final Context context = Helper.GetContext();
if (OEMDetector.isOEM() && Build.VERSION.SDK_INT >= 23 && BooleanTrue("showDoze")) {
final Context context = getContext();
if (!((PowerManager) context.getSystemService(Context.POWER_SERVICE)).isIgnoringBatteryOptimizations(context.getPackageName())) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Выключите оптимизацию батареи!");
@@ -36,7 +38,7 @@ public class DisableBattery {
builder.setNeutralButton("Игнорировать", new DialogInterface.OnClickListener() {
@Override // android.content.DialogInterface.OnClickListener
public void onClick(DialogInterface dialogInterface, int i) {
Helper.edit().putBoolean("showDoze", false).apply();
edit().putBoolean("showDoze", false).apply();
}
});
builder.show();
@@ -1,5 +1,10 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.Globals.edit;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.isGmsInstalled;
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
@@ -8,13 +13,11 @@ import android.content.Intent;
import com.vk.navigation.Navigator;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.Prefs;
import ru.vtosters.lite.ui.fragments.InstallGMSFragment;
public class InstallGMS {
public static void alert(final Activity activity) {
if (!Helper.IsGmsInstalled()) {
if (!isGmsInstalled()) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Внимание!");
builder.setMessage(Text());
@@ -23,20 +26,20 @@ public class InstallGMS {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Helper.edit().putBoolean("showAlertGms", false).apply();
edit().putBoolean("showAlertGms", false).apply();
}
});
builder.setNeutralButton("Установить GMS", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Helper.edit().putBoolean("showAlertGms", false).apply();
Context context = Helper.GetContext();
edit().putBoolean("showAlertGms", false).apply();
Context context = getContext();
Intent a2 = new Navigator(InstallGMSFragment.class).a(context);
context.startActivity(a2);
}
});
if (Prefs.BooleanTrue("showAlertGms")) {
if (BooleanTrue("showAlertGms")) {
builder.show();
}
}
@@ -1,5 +1,8 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.Globals.edit;
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
@@ -7,9 +10,7 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.OEMDetector;
import ru.vtosters.lite.utils.Prefs;
public class Start {
public static void alert(final Activity activity) {
@@ -21,23 +22,21 @@ public class Start {
builder.setMessage(getWelcome());
builder.setCancelable(false);
builder.setPositiveButton("Продолжить", new DialogInterface.OnClickListener() {
/* class ru.vtosters.lite.utils.lite.dialog.Start.AnonymousClass1 */
@Override // android.content.DialogInterface.OnClickListener
public void onClick(DialogInterface dialogInterface, int i) {
Helper.edit().putBoolean("showAlert", false).apply();
edit().putBoolean("showAlert", false).apply();
}
});
builder.setNeutralButton("Новости", new DialogInterface.OnClickListener() {
/* class ru.vtosters.lite.utils.lite.dialog.Start.AnonymousClass2 */
@Override // android.content.DialogInterface.OnClickListener
public void onClick(DialogInterface dialogInterface, int i) {
Helper.edit().putBoolean("showAlert", false).apply();
edit().putBoolean("showAlert", false).apply();
activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/vtosters")));
}
});
if (Prefs.BooleanTrue("showAlert")) {
if (BooleanTrue("showAlert")) {
builder.show();
}
}
@@ -2,13 +2,11 @@ package ru.vtosters.lite.ui.fragments;
import android.os.Bundle;
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
import com.vtosters.lite.R;
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
public class ActivityFragment extends MaterialPreferenceToolbarFragment {
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_activity);
@@ -7,7 +7,6 @@ import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
public class FeedFragment extends MaterialPreferenceToolbarFragment {
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_feed);
@@ -7,7 +7,6 @@ import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
public class InstallGMSFragment extends MaterialPreferenceToolbarFragment {
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_gms);
@@ -1,5 +1,7 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.Globals.getString;
import android.os.Bundle;
import android.support.v7.preference.Preference;
@@ -7,34 +9,30 @@ import com.vk.core.util.ToastUtils;
import com.vtosters.lite.R;
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
/* renamed from: ru.vtosters.lite.utils.lite.ui.activities.interface reason: invalid class name */
public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_interface);
prefs();
}
/* access modifiers changed from: package-private */
/* renamed from: ru.vtosters.lite.utils.lite.ui.activities.interface$a */
private void prefs() {
a("newfeed").a(new a());
}
public boolean restart(Preference preference, Object obj) {
ToastUtils.a(getString("restartapp"));
return true;
}
public class a implements Preference.b {
a() {
}
@Override // android.support.v7.preference.Preference.b
public boolean a(Preference preference, Object obj) {
return InterfaceFragment.this.restart(preference, obj);
}
a() {
}
}
private void prefs() {
a("newfeed").a((Preference.b) new a());
}
public /* synthetic */ boolean restart(Preference preference, Object obj) {
ToastUtils.a("Пожалуйста перезапустите приложение");
return true;
}
}
@@ -7,7 +7,6 @@ import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
public class MessagesFragment extends MaterialPreferenceToolbarFragment {
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_messages);
@@ -1,11 +1,21 @@
package ru.vtosters.lite.ui.fragments;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.getString;
import static ru.vtosters.lite.utils.Globals.getUserToken;
import static ru.vtosters.lite.utils.Globals.restartApplication;
import static ru.vtosters.lite.utils.SettBackup.backupSettings;
import static ru.vtosters.lite.utils.SettBackup.deletePrefs;
import static ru.vtosters.lite.utils.SettBackup.restoreBackup;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.widget.Toast;
import com.vk.audio.AudioMessageUtils;
import com.vk.auth.api.VKAccount;
@@ -19,53 +29,60 @@ import com.vtosters.lite.auth.VKAccountManager;
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
import com.vtosters.lite.im.ImEngineProvider;
import ru.vtosters.lite.utils.Helper;
public class OtherFragment extends MaterialPreferenceToolbarFragment {
/* access modifiers changed from: package-private */
static class c implements Preference.c {
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
copy(Helper.GetContext(), Helper.GetUserToken());
return true;
}
public static void copy(Context context, String str) {
((ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", str));
Toast.makeText(context, Helper.getString("copybtn"), Toast.LENGTH_SHORT).show();
ToastUtils.a(Helper.getString("tokenwarning"));
}
c() {
}
}
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_other);
prefs();
}
/* access modifiers changed from: package-private */
private void prefs() {
a("firebasefix").a(new a());
a("applicationstop").a(new b());
a("tokencopy").a(new c());
a("applicationrestart").a(new d());
a("clearcache").a(new e());
a("stickfix").a(new f());
a("deleteprefs").a(new deleteprefs());
// a("saveprefs").a((Preference.c) new saveprefs());
// a("restoreprefs").a((Preference.c) new restoreprefs());
}
static class c implements Preference.c {
c() {
}
public static void copy(Context context, String str) {
((ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", str));
makeText(context, getString("copybtn"), LENGTH_SHORT).show();
ToastUtils.a(getString("tokenwarning"));
}
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
copy(getContext(), getUserToken());
return true;
}
}
public class e implements Preference.c {
e() {
}
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
VKImageLoader.b();
ImEngineProvider.a().h();
AudioMessageUtils.j();
FileUtils.l();
ToastUtils.a(Helper.getString("cachecleaned"));
ToastUtils.a(getString("cachecleaned"));
return true;
}
e() {
}
}
/* access modifiers changed from: package-private */
public class b implements Preference.c {
b() {
}
@@ -77,19 +94,17 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
}
}
/* access modifiers changed from: package-private */
public class d implements Preference.c {
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
Helper.restarting();
return true;
d() {
}
d() {
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
restartApplication();
return true;
}
}
/* access modifiers changed from: package-private */
public class a implements Preference.c {
a() {
}
@@ -98,22 +113,61 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
public boolean a(Preference preference) {
VKAccount b = VKAccountManager.b();
PushSubscriber.a.a(b.b(), b.c());
ToastUtils.a(Helper.getString("fcmtokenrem"));
ToastUtils.a(getString("fcmtokenrem"));
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
OtherFragment.this.aB().postDelayed(() -> {
PushSubscriber.a.a(true);
ToastUtils.a(Helper.getString("fcmtokenget"));
ToastUtils.a(Helper.getString("fcmtokenfixed"));
ToastUtils.a(getString("fcmtokenget"));
ToastUtils.a(getString("fcmtokenfixed"));
}, 1000);
return true;
}
}
private void prefs() {
a("firebasefix").a((Preference.c) new a());
a("applicationstop").a((Preference.c) new b());
a("tokencopy").a((Preference.c) new c());
a("applicationrestart").a((Preference.c) new d());
a("clearcache").a((Preference.c) new e());
public class f implements Preference.c {
f() {
}
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
SharedPreferences prefs = getContext().getSharedPreferences("stickers", Context.MODE_PRIVATE);
prefs.edit().clear().commit();
restartApplication();
return true;
}
}
public class deleteprefs implements Preference.c {
deleteprefs() {
}
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
deletePrefs();
restartApplication();
return true;
}
}
public class saveprefs implements Preference.c {
saveprefs() {
}
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
backupSettings();
return true;
}
}
public class restoreprefs implements Preference.c {
restoreprefs() {
}
@Override // android.support.v7.preference.Preference.c
public boolean a(Preference preference) {
restoreBackup();
return true;
}
}
}
@@ -7,7 +7,6 @@ import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment {
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_proxy);
@@ -1,5 +1,9 @@
package ru.vtosters.lite.ui.fragments;
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.support.v7.preference.Preference;
@@ -7,41 +11,43 @@ import com.vk.core.util.ToastUtils;
import com.vtosters.lite.R;
import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.utils.IconHelper;
public class ThemesFragment extends MaterialPreferenceToolbarFragment {
/* access modifiers changed from: package-private */
public class a implements Preference.b {
public /* synthetic */ a() {
}
@Override // android.support.v7.preference.Preference.b
public boolean a(Preference preference, Object obj) {
return ThemesFragment.this.apply(preference, obj);
}
}
@Override
// com.vtosters.lite.fragments.MaterialPreferenceFragment, android.support.v4.app.DialogFragment, android.support.v4.app.Fragment
public void b(Bundle bundle) {
super.b(bundle);
a(R.xml.preferences_themes);
prefs();
}
public /* synthetic */ boolean apply(Preference preference, Object obj) {
public boolean apply(Preference preference, Object obj) {
if (((Boolean) obj).booleanValue()) {
IconHelper.switchToVK();
switchToVK();
} else {
IconHelper.switchToDefault();
switchToDefault();
}
ToastUtils.a(Helper.getString("iconapplying"));
ToastUtils.a(getString("iconapplying"));
return true;
}
private void prefs() {
a("iconvk").a((Preference.b) new a());
a("iconvk").a(new a());
a("darktheme").a(new b());
a("lighttheme").a(new b());
}
public static class b implements Preference.b {
@Override // android.support.v7.preference.Preference.b
public boolean a(Preference preference, Object obj) {
ToastUtils.a(getString("restartapp"));
return true;
}
}
public class a implements Preference.b {
@Override // android.support.v7.preference.Preference.b
public boolean a(Preference preference, Object obj) {
return ThemesFragment.this.apply(preference, obj);
}
}
}
@@ -0,0 +1,190 @@
package ru.vtosters.lite.ui.fragments.dockbar;
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
import ru.vtosters.lite.utils.Themes;
public class DockBarAdapter extends RecyclerView.a
implements IItemTouchHelper {
public static final int SELECTED_TAB_TYPE = 1;
public static final int DISABLED_TAB_TYPE = 2;
public static final int GROUP_TITLE_TYPE = 3;
private final DockBarManager mDockBarManager = DockBarManager.getInstance();
@Override
public RecyclerView.x b(ViewGroup parent, int viewType) {
if (viewType == GROUP_TITLE_TYPE) {
return new GroupViewHolder(createGroupTitle());
} else {
return new DockBarEditViewHolder(createTabItem());
}
}
@Override
public int b(int i) {
return getItemType(i);
}
private View createTabItem() {
LinearLayout container = new LinearLayout(getContext());
container.setTag("tab_item_container");
container.setGravity(Gravity.CENTER_VERTICAL);
container.setOrientation(LinearLayout.HORIZONTAL);
container.setPadding(
convertDpToPixel(12),
convertDpToPixel(12),
convertDpToPixel(12),
convertDpToPixel(12)
);
container.setLayoutParams(new LinearLayout.LayoutParams(-1, convertDpToPixel(48)));
ImageView icon = new ImageView(getContext());
icon.setTag("icon");
icon.setImageTintList(ColorStateList.valueOf(Themes.getAccentColor()));
icon.setLayoutParams(new LinearLayout.LayoutParams(
convertDpToPixel(24),
convertDpToPixel(24)));
container.addView(icon);
TextView title = new TextView(getContext());
title.setTag("title");
title.setTextSize(16.0f);
title.setTypeface(Typeface.DEFAULT_BOLD);
title.setTextColor(Themes.getTextAttr());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -2);
params.weight = 1;
params.leftMargin = convertDpToPixel(16);
container.addView(title, params);
return container;
}
private View createGroupTitle() {
LinearLayout layout = new LinearLayout(getContext());
layout.setLayoutParams(new LinearLayout.LayoutParams(-1, -2));
TextView title = new TextView(getContext());
title.setTag("group_title");
title.setTextSize(13.0f);
title.setPadding(
convertDpToPixel(16),
convertDpToPixel(13),
convertDpToPixel(16),
convertDpToPixel(13)
);
title.setAllCaps(true);
title.setTextColor(Themes.getTextAttr());
layout.addView(title, new LinearLayout.LayoutParams(-2, -2));
return layout;
}
@Override
public void a(RecyclerView.x holder, int position) {
if (holder instanceof GroupViewHolder) {
((GroupViewHolder) holder).bind(mDockBarManager.getGroupTitle(position));
} else {
int viewType = getItemType(position);
if (viewType == SELECTED_TAB_TYPE) {
((DockBarEditViewHolder) holder).bind(mDockBarManager.getSelectedTab(position));
} else if (viewType == DISABLED_TAB_TYPE) {
((DockBarEditViewHolder) holder).bind(mDockBarManager.getDisabledTab(position));
}
}
}
@Override
public int au_() {
return mDockBarManager.getItemCount();
}
@Override
public void onItemDismiss(int index) {
mDockBarManager.move(this, index);
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
int fromViewType = getItemType(fromPosition);
int toViewType = getItemType(toPosition);
if (fromPosition < toPosition) {
if (fromViewType != toViewType) {
mDockBarManager.swapAndMigrate(this, fromPosition, toPosition);
} else {
List<DockBarTab> list = fromViewType == SELECTED_TAB_TYPE ? mDockBarManager.getSelectedTabs() : mDockBarManager.getDisabledTabs();
mDockBarManager.swap(this, list, fromViewType, fromPosition, toPosition);
}
} else if (toPosition != 0) {
if (fromViewType != toViewType) {
mDockBarManager.swapAndMigrate(this, fromPosition, toPosition);
} else {
List<DockBarTab> list = fromViewType == SELECTED_TAB_TYPE ? mDockBarManager.getSelectedTabs() : mDockBarManager.getDisabledTabs();
mDockBarManager.swap(this, list, fromViewType, fromPosition, toPosition);
}
}
return true;
}
public int getIndexByViewType(int position, int viewType) {
return mDockBarManager.getIndexByViewType(position, viewType);
}
public int getItemType(int position) {
return mDockBarManager.getItemType(position);
}
static class DockBarEditViewHolder extends RecyclerView.x {
private final ImageView mIcon;
private final TextView mTitle;
public DockBarEditViewHolder(View itemView) {
super(itemView);
mIcon = itemView.findViewWithTag("icon");
mTitle = itemView.findViewWithTag("title");
}
public void bind(DockBarTab tab) {
mIcon.setImageResource(tab.iconID);
mTitle.setText(tab.titleID);
}
}
static class GroupViewHolder extends RecyclerView.x {
private final TextView mGroupTitle;
public GroupViewHolder(View view) {
super(view);
mGroupTitle = view.findViewWithTag("group_title");
}
public void bind(String groupTitle) {
mGroupTitle.setText(groupTitle);
}
}
}
@@ -0,0 +1,14 @@
package ru.vtosters.lite.ui.fragments.dockbar;
public class DockBarDragItem {
public boolean active;
public int index;
public DockBarTab dockBarTab;
public DockBarDragItem(boolean active, int index, DockBarTab dockBarTab) {
this.active = active;
this.index = index;
this.dockBarTab = dockBarTab;
}
}
@@ -0,0 +1,88 @@
package ru.vtosters.lite.ui.fragments.dockbar;
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
import static ru.vtosters.lite.utils.Globals.restartApplication;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.a.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import me.grishka.appkit.fragments.ToolbarFragment;
public class DockBarFragment extends ToolbarFragment {
private RecyclerView mRecyclerView;
private DockBarAdapter mAdapter;
private ItemTouchHelper mItemTouchHelper;
@Override
public View d(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
super.b(bundle);
LinearLayout container = new LinearLayout(n());
container.setLayoutParams(new FrameLayout.LayoutParams(-1, -1));
container.setOrientation(LinearLayout.VERTICAL);
LinearLayout buttonsContainer = new LinearLayout(n());
buttonsContainer.setPadding(
convertDpToPixel(13),
convertDpToPixel(10),
convertDpToPixel(13),
convertDpToPixel(10)
);
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
Button save = new Button(n());
save.setText("Сохранить");
save.setOnClickListener(v -> {
DockBarManager.getInstance().save();
restartApplication();
});
LinearLayout.LayoutParams saveParams = new LinearLayout.LayoutParams(0, -2);
saveParams.weight = 1.0f;
buttonsContainer.addView(save, saveParams);
View divider = new View(n());
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(convertDpToPixel(10), 0));
Button reset = new Button(n());
reset.setText("Сбросить");
reset.setOnClickListener(v -> {
DockBarManager.getInstance().delete();
restartApplication();
});
LinearLayout.LayoutParams resetParams = new LinearLayout.LayoutParams(0, -2);
resetParams.weight = 1.0f;
buttonsContainer.addView(reset, resetParams);
mRecyclerView = new RecyclerView(n());
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(n()));
mAdapter = new DockBarAdapter();
mRecyclerView.setAdapter(mAdapter);
container.addView(mRecyclerView, new LinearLayout.LayoutParams(-1, -1));
mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(mAdapter));
mItemTouchHelper.a(mRecyclerView);
return container;
}
@Override
public void a(View arg0, Bundle arg1) {
o_(true);
super.a(arg0, arg1);
a("Редактор докбара");
}
}
@@ -0,0 +1,202 @@
package ru.vtosters.lite.ui.fragments.dockbar;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.view.MenuItem;
import com.vk.apps.AppsFragment;
import com.vk.core.d.RecoloredDrawable;
import com.vk.core.fragments.FragmentImpl;
import com.vtosters.lite.ui.bottomnavigation.BottomNavigationMenuView;
import com.vtosters.lite.ui.bottomnavigation.BottomNavigationView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class DockBarInjector {
private static final DockBarManager sManager = DockBarManager.getInstance();
public static Map<Class<? extends FragmentImpl>, Integer> injectMap() {
LinkedHashMap<Class<? extends FragmentImpl>, Integer> map = new LinkedHashMap<>();
for (DockBarTab tab : sManager.getSelectedTabs()) {
map.put(tab.fragmentClass, tab.id);
}
return map;
}
public static void inject(BottomNavigationView navigationView) {
Menu menu = navigationView.getMenu();
menu.clear();
try {
Field field = BottomNavigationMenuView.class.getDeclaredField("h");
field.setAccessible(true);
Object synchronizedPool = field.get(null);
Class<?> synchronisedPoolCls = Class.forName("android.support.v4.f.Pools$a");
Method acquire = synchronisedPoolCls.getDeclaredMethod("a");
if (synchronizedPool != null) {
do {
} while (acquire.invoke(synchronizedPool) != null);
}
} catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
for (DockBarTab tab : sManager.getSelectedTabs()) {
MenuItem add = menu.add(0, tab.id, 0, tab.titleID);
Drawable drawable = getContext().getResources().getDrawable(tab.iconID);
ColorStateList colorStateList = getContext().getResources().getColorStateList(com.vtosters.lite.R.color.bottom_navigation_item);
// if (isAndroidMonet()) {
// colorStateList = ColorStateList.valueOf(Themes.getAccentColor());
// }
add.setIcon(new RecoloredDrawable(drawable, colorStateList));
add.setShowAsAction(1);
add.setCheckable(true);
}
}
public static int injectId(String tag) {
for (DockBarTab tab : sManager.getSelectedTabs()) {
if (tag.equals(tab.tag))
return tab.id;
}
return 0;
}
public static void injectMenuFragment(Menu menu) {
List<MenuItem> menuItems = new ArrayList<>();
for (int i = 0; i < menu.size(); i++) {
menuItems.add(menu.getItem(i));
}
menu.clear();
for (DockBarTab tab : sManager.getSelectedTabs()) {
if (tab.id != com.vtosters.lite.R.id.tab_menu) {
int itemId = tab.id;
if (tab.id == com.vtosters.lite.R.id.tab_news) {
itemId = com.vtosters.lite.R.id.menu_newsfeed;
} else if (tab.id == com.vtosters.lite.R.id.tab_discover) {
itemId = com.vtosters.lite.R.id.menu_search;
} else if (tab.id == com.vtosters.lite.R.id.tab_feedback) {
itemId = com.vtosters.lite.R.id.menu_feedback;
} else if (tab.id == com.vtosters.lite.R.id.tab_messages) {
itemId = com.vtosters.lite.R.id.menu_messages;
}
MenuItem add = menu.add(0, itemId, 0, tab.titleID);
add.setIcon(tab.iconID);
add.setVisible(true);
}
}
for (MenuItem menuItem : menuItems) {
MenuItem item = menu.add(menuItem.getGroupId(), menuItem.getItemId(), menuItem.getOrder(), menuItem.getTitle());
item.setIcon(menuItem.getIcon());
}
menuItems.clear();
for (int i = 0; i < menu.size(); i++) {
MenuItem menuItem = menu.getItem(i);
for (DockBarTab tab : sManager.getSelectedTabs()) {
int itemId = menuItem.getItemId();
if (itemId == com.vtosters.lite.R.id.menu_newsfeed) {
itemId = com.vtosters.lite.R.id.tab_news;
} else if (itemId == com.vtosters.lite.R.id.menu_search) {
itemId = com.vtosters.lite.R.id.tab_discover;
} else if (itemId == com.vtosters.lite.R.id.menu_feedback) {
itemId = com.vtosters.lite.R.id.tab_feedback;
} else if (itemId == com.vtosters.lite.R.id.menu_messages) {
itemId = com.vtosters.lite.R.id.tab_messages;
}
if (itemId == tab.id && tab.id != com.vtosters.lite.R.id.menu_vk_pay) {
menuItems.add(menuItem);
break;
}
}
}
for (MenuItem menuItem : menuItems) {
menu.removeItem(menuItem.getItemId());
}
}
public static JSONArray injectMenuJSON(JSONArray arr) {
List<String> arrayList = new ArrayList(Arrays.asList(
"news",
"messages",
"feedback",
"discover"
));
for (DockBarTab tab : sManager.getSelectedTabs()) {
if (tab.id == com.vtosters.lite.R.id.tab_discover) {
arrayList.remove("discover");
} else if (tab.id == com.vtosters.lite.R.id.tab_feedback) {
arrayList.remove("feedback");
} else if (tab.id == com.vtosters.lite.R.id.tab_messages) {
arrayList.remove("messages");
} else if (tab.id == com.vtosters.lite.R.id.tab_news) {
arrayList.remove("news");
}
}
try {
JSONArray jSONArray = new JSONArray();
for (int i = 0; i < arrayList.size(); i++) {
jSONArray.put(new JSONObject().put("name", arrayList.get(i)));
}
for (int i2 = 0; i2 < arr.length(); i2++) {
jSONArray.put(arr.getJSONObject(i2));
}
return jSONArray;
} catch (JSONException e) {
e.printStackTrace();
return arr;
}
}
public static int getItemCount() {
return sManager.getSelectedTabs().size();
}
public static boolean isDockOpenAllowed(FragmentImpl fragment) {
return isDockOpenAllowed(fragment.getClass());
}
public static boolean isDockOpenAllowed(Class<?> cls) {
for (DockBarTab tab : sManager.getSelectedTabs())
if (tab.fragmentClass == cls)
return true;
for (DockBarTab tab : sManager.getDisabledTabs())
if (tab.fragmentClass == cls)
return true;
return false;
}
public static Class<?> interceptClick(int id) {
for (DockBarTab tab : sManager.getSelectedTabs()) {
if (id == tab.id)
return tab.fragmentClass;
}
for (DockBarTab tab : sManager.getDisabledTabs()) {
if (id == tab.id)
return tab.fragmentClass;
}
return AppsFragment.class;
}
}
@@ -0,0 +1,314 @@
package ru.vtosters.lite.ui.fragments.dockbar;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Preferences.newfeed;
import static ru.vtosters.lite.utils.Preferences.olddock;
import com.vk.apps.AppsFragment;
import com.vk.discover.DiscoverFragment;
import com.vk.discover.GatewaysFragment;
import com.vk.fave.fragments.FaveTabFragment;
import com.vk.feedlikes.fragments.FeedLikesFragment;
import com.vk.menu.MenuFragment;
import com.vk.music.fragment.MusicFragment;
import com.vk.newsfeed.HomeFragment;
import com.vk.newsfeed.NewsfeedFragment;
import com.vk.notifications.NotificationsContainerFragment;
import com.vtosters.lite.R;
import com.vtosters.lite.fragments.GamesFragment;
import com.vtosters.lite.fragments.PhotosFragment;
import com.vtosters.lite.fragments.ProfileFragment;
import com.vtosters.lite.fragments.SettingsListFragment;
import com.vtosters.lite.fragments.d.DocumentsViewFragment;
import com.vtosters.lite.fragments.f.FriendsFragment;
import com.vtosters.lite.fragments.g.BirthdaysFragment;
import com.vtosters.lite.fragments.h.GroupsFragment;
import com.vtosters.lite.fragments.lives.LivesPostListFragment;
import com.vtosters.lite.fragments.m.VideosFragment;
import com.vtosters.lite.fragments.messages.dialogs.DialogsFragment;
import com.vtosters.lite.fragments.money.MoneyTransfersFragment;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class DockBarManager {
public static final int MIN_SELECTED_TABS_LIMIT = 3;
public static final int MAX_SELECTED_TABS_LIMIT = 9;
private static DockBarManager sInstance = new DockBarManager();
private final List<DockBarTab> mSelectedTabs = new ArrayList<>();
private final List<DockBarTab> mDisabledTabs = new ArrayList<>();
private final List<String> mGroups = Arrays.asList(
"Выбранные элементы докбара",
"Невыбранные элементы"
);
public DockBarManager() {
load();
}
public static DockBarManager getInstance() {
if (sInstance == null)
sInstance = new DockBarManager();
return sInstance;
}
private static String readFully(InputStream is) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];
int len;
while ((len = is.read(buffer)) > 0) {
bos.write(buffer, 0, len);
}
return bos.toString();
}
private void load() {
File dockbar = new File(getContext().getFilesDir(), "dockbar.json");
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_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_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_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_menu", olddock() ? 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_groups", R.drawable.ic_users_24, R.string.groups, R.id.menu_groups, GroupsFragment.class));
mDisabledTabs.add(new DockBarTab("tab_photos", R.drawable.ic_camera_24, R.string.photos, R.id.menu_photos, PhotosFragment.class));
mDisabledTabs.add(new DockBarTab("tab_audios", R.drawable.ic_music_24, R.string.music, R.id.menu_audios, MusicFragment.class));
mDisabledTabs.add(new DockBarTab("tab_videos", R.drawable.ic_video_24, R.string.videos, R.id.menu_videos, VideosFragment.class));
mDisabledTabs.add(new DockBarTab("tab_lives", R.drawable.ic_live_filter_24dp, R.string.sett_live, R.id.menu_lives, LivesPostListFragment.class));
mDisabledTabs.add(new DockBarTab("tab_games", R.drawable.ic_games_24, R.string.games, R.id.menu_games, GamesFragment.class));
mDisabledTabs.add(new DockBarTab("tab_liked", R.drawable.ic_menu_like_24, R.string.sett_likes, R.id.menu_feed_likes, FeedLikesFragment.class));
mDisabledTabs.add(new DockBarTab("tab_fave", R.drawable.ic_favorite_24, R.string.exo_track_selection_title_video_res_0x7f11031e, R.id.menu_fave, FaveTabFragment.class));
mDisabledTabs.add(new DockBarTab("tab_documents", R.drawable.ic_document_24, R.string.docs, R.id.menu_documents, DocumentsViewFragment.class));
mDisabledTabs.add(new DockBarTab("tab_payments", R.drawable.ic_money_transfer_24, R.string.money_transfer_money_transfers, R.id.menu_payments, MoneyTransfersFragment.class));
mDisabledTabs.add(new DockBarTab("tab_vk_apps", R.drawable.ic_services_24, R.string.menu_apps, R.id.menu_vk_apps, AppsFragment.class));
mDisabledTabs.add(new DockBarTab("tab_profile", R.drawable.libverify_ic_account_circle_white, R.string.profile, R.id.profile, ProfileFragment.class));
mDisabledTabs.add(new DockBarTab("tab_settings", R.drawable.ic_settings_24, R.string.menu_settings, R.id.menu_settings, SettingsListFragment.class));
mDisabledTabs.add(new DockBarTab("tab_brtd", R.drawable.ic_menu_birthdays, R.string.birthdays_title, R.id.menu_birthdays, BirthdaysFragment.class));
} else {
try {
JSONObject json = new JSONObject(readFully(new FileInputStream(dockbar)));
JSONArray selected = json.getJSONArray("selected");
for (int i = 0; i < selected.length(); i++) {
JSONObject item = selected.getJSONObject(i);
DockBarTab tab = new DockBarTab(
item.getString("tag"),
item.getInt("iconID"),
item.getInt("titleID"),
item.getInt("id"),
Class.forName(item.getString("fragmentClass"))
);
if (newfeed()) {
if (tab.fragmentClass == NewsfeedFragment.class) {
tab.fragmentClass = HomeFragment.class;
} else if (tab.fragmentClass == DiscoverFragment.class) {
tab.fragmentClass = DiscoverFragment.class;
}
} else {
if (tab.fragmentClass == HomeFragment.class) {
tab.fragmentClass = NewsfeedFragment.class;
} else if (tab.fragmentClass == GatewaysFragment.class) {
tab.fragmentClass = GatewaysFragment.class;
}
}
mSelectedTabs.add(tab);
}
JSONArray disabled = json.getJSONArray("disabled");
for (int i = 0; i < disabled.length(); i++) {
JSONObject item = disabled.getJSONObject(i);
DockBarTab tab = new DockBarTab(
item.getString("tag"),
item.getInt("iconID"),
item.getInt("titleID"),
item.getInt("id"),
Class.forName(item.getString("fragmentClass"))
);
if (newfeed()) {
if (tab.fragmentClass == NewsfeedFragment.class) {
tab.fragmentClass = HomeFragment.class;
} else if (tab.fragmentClass == DiscoverFragment.class) {
tab.fragmentClass = GatewaysFragment.class;
}
} else {
if (tab.fragmentClass == HomeFragment.class) {
tab.fragmentClass = NewsfeedFragment.class;
} else if (tab.fragmentClass == GatewaysFragment.class) {
tab.fragmentClass = DiscoverFragment.class;
}
}
mDisabledTabs.add(tab);
}
} catch (JSONException | IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public void delete() {
File dockbar = new File(getContext().getFilesDir(), "dockbar.json");
if (dockbar.exists()) dockbar.delete();
}
public void save() {
try {
File dockbar = new File(getContext().getFilesDir(), "dockbar.json");
JSONArray selected = new JSONArray();
for (DockBarTab tab : mSelectedTabs) {
JSONObject item = new JSONObject()
.put("tag", tab.tag)
.put("iconID", tab.iconID)
.put("titleID", tab.titleID)
.put("id", tab.id)
.put("fragmentClass", tab.fragmentClass.getName());
selected.put(item);
}
JSONArray disabled = new JSONArray();
for (DockBarTab tab : mDisabledTabs) {
JSONObject item = new JSONObject()
.put("tag", tab.tag)
.put("iconID", tab.iconID)
.put("titleID", tab.titleID)
.put("id", tab.id)
.put("fragmentClass", tab.fragmentClass.getName());
disabled.put(item);
}
JSONObject json = new JSONObject();
json.put("selected", selected).put("disabled", disabled);
FileOutputStream fos = new FileOutputStream(dockbar);
fos.write(json.toString().getBytes(StandardCharsets.UTF_8));
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
public void swap(DockBarAdapter adapter, List<DockBarTab> list, int itemType, int fromPosition, int toPosition) {
int curr = adapter.getIndexByViewType(fromPosition, itemType);
int target = adapter.getIndexByViewType(toPosition, itemType);
if (fromPosition < toPosition) {
for (int i = curr; i < target; i++) {
Collections.swap(list, i, i + 1);
}
} else {
for (int i = curr; i > target; i--) {
Collections.swap(list, i, i - 1);
}
}
adapter.b(fromPosition, toPosition);// notifyItemMoved
}
public void swapAndMigrate(DockBarAdapter adapter, int fromPosition, int toPosition) {
int curr = adapter.getIndexByViewType(fromPosition, adapter.getItemType(fromPosition));
int target = adapter.getIndexByViewType(toPosition, adapter.getItemType(toPosition));
if (fromPosition < toPosition) {
if (mSelectedTabs.size() <= MIN_SELECTED_TABS_LIMIT || mSelectedTabs.get(curr).tag.equals("tab_menu"))
return;
DockBarTab tab = mSelectedTabs.get(curr);
mSelectedTabs.remove(tab);
mDisabledTabs.add(tab);
for (int i = mDisabledTabs.size() - 1; i > target; i--) {
Collections.swap(mDisabledTabs, i, i - 1);
}
for (int i = 0; i < target; i++) {
Collections.swap(mDisabledTabs, i, i + 1);
}
} else {
if (mSelectedTabs.size() >= MAX_SELECTED_TABS_LIMIT) return;
DockBarTab tab = mDisabledTabs.get(curr);
mDisabledTabs.remove(tab);
mSelectedTabs.add(tab);
}
adapter.b(fromPosition, toPosition);// notifyItemMoved
}
public void move(DockBarAdapter adapter, int index) {
if (getItemType(index) == 1) {
DockBarTab item = mSelectedTabs.get(getIndexByViewType(index, 1));
mSelectedTabs.remove(item);
mDisabledTabs.add(item);
for (int i = mDisabledTabs.size() - 1; i > 0; i--) {
Collections.swap(mDisabledTabs, i, i - 1);
}
adapter.e_(index); // notifyItemRemoved
adapter.d_(getItemCount() - mDisabledTabs.size()); // notifyItemInserted
}
}
public int getItemCount() {
return mSelectedTabs.size() + mDisabledTabs.size() + mGroups.size();
}
public int getIndexByViewType(int position, int viewType) {
if (viewType == DockBarAdapter.SELECTED_TAB_TYPE) {
return position - 1;
} else if (viewType == DockBarAdapter.DISABLED_TAB_TYPE) {
return position - mSelectedTabs.size() - mGroups.size();
} else {
return position != 0 ? 1 : 0;
}
}
public int getItemType(int position) {
if (position == 0 || position == mSelectedTabs.size() + 1) {
return DockBarAdapter.GROUP_TITLE_TYPE;
} else if (position - 1 < mSelectedTabs.size()) {
return DockBarAdapter.SELECTED_TAB_TYPE;
} else if (position - 1 >= mSelectedTabs.size()) {
return DockBarAdapter.DISABLED_TAB_TYPE;
}
return -1;
}
public DockBarTab getSelectedTab(int pos) {
return mSelectedTabs.get(getIndexByViewType(pos, 1));
}
public DockBarTab getDisabledTab(int pos) {
return mDisabledTabs.get(getIndexByViewType(pos, 2));
}
public String getGroupTitle(int pos) {
return mGroups.get(getIndexByViewType(pos, -1));
}
public List<DockBarTab> getSelectedTabs() {
return mSelectedTabs;
}
public List<DockBarTab> getDisabledTabs() {
return mDisabledTabs;
}
}
@@ -0,0 +1,20 @@
package ru.vtosters.lite.ui.fragments.dockbar;
import com.vk.core.fragments.FragmentImpl;
public class DockBarTab {
public String tag;
public int iconID;
public int titleID;
public int id;
public Class<? extends FragmentImpl> fragmentClass;
public DockBarTab(String tag, int iconID, int titleID, int resID, Class<?> fragmentClass) {
this.tag = tag;
this.iconID = iconID;
this.titleID = titleID;
this.id = resID;
this.fragmentClass = (Class<? extends FragmentImpl>) fragmentClass;
}
}
@@ -0,0 +1,8 @@
package ru.vtosters.lite.ui.fragments.dockbar;
public interface IItemTouchHelper {
void onItemDismiss(int index);
boolean onItemMove(int fromPosition, int toPosition);
}
@@ -0,0 +1,45 @@
package ru.vtosters.lite.ui.fragments.dockbar;
import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.a.ItemTouchHelper;
public class ItemTouchHelperCallback extends ItemTouchHelper.a {
private final DockBarAdapter mAdapter;
public ItemTouchHelperCallback(DockBarAdapter mAdapter) {
this.mAdapter = mAdapter;
}
@Override // isLongPressDragEnabled
public boolean a() {
return true;
}
@Override // isItemViewSwipeEnabled
public boolean b() {
return false;
}
@Override
public int a(RecyclerView recyclerView, RecyclerView.x viewHolder) {
int pos = mAdapter.getItemType(viewHolder.d());
int dragFlags = pos != DockBarAdapter.GROUP_TITLE_TYPE ? androidx.recyclerview.widget.ItemTouchHelper.UP | androidx.recyclerview.widget.ItemTouchHelper.DOWN : 0;
int swipeFlags = pos == 1 ? androidx.recyclerview.widget.ItemTouchHelper.START | androidx.recyclerview.widget.ItemTouchHelper.END : 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public void a(RecyclerView.x viewHolder, int direction) {
mAdapter.onItemDismiss(viewHolder.d());
}
@Override
public boolean b(RecyclerView recyclerView, RecyclerView.x viewHolder, RecyclerView.x target) {
if (mAdapter.getItemType(viewHolder.d()) == DockBarAdapter.GROUP_TITLE_TYPE)
return false;
return mAdapter.onItemMove(viewHolder.d(), target.d());
}
}
@@ -0,0 +1,13 @@
package ru.vtosters.lite.ui.fragments.multiaccount;
class MultiAccountItem {
public String nickname;
public String imageUrl;
public int index;
public MultiAccountItem(String name, String imageUrl, int index) {
this.nickname = name;
this.imageUrl = imageUrl;
this.index = index;
}
}
@@ -0,0 +1,172 @@
package ru.vtosters.lite.ui.fragments.multiaccount;
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
import static ru.vtosters.lite.utils.Globals.getResources;
import static ru.vtosters.lite.utils.Globals.isNetworkConnected;
import static ru.vtosters.lite.utils.Globals.restartApplication;
import static ru.vtosters.lite.utils.Themes.getTextAttr;
import static ru.vtosters.lite.utils.Themes.recolorDrawable;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.vk.audio.AudioMessageUtils;
import com.vk.auth.api.VKAccount;
import com.vk.core.f.FileUtils;
import com.vk.core.util.AppContextHolder;
import com.vk.imageloader.VKImageLoader;
import com.vk.imageloader.view.VKCircleImageView;
import com.vk.pushes.PushSubscriber;
import com.vtosters.lite.R;
import com.vtosters.lite.auth.VKAccountManager;
import com.vtosters.lite.im.ImEngineProvider;
import java.util.List;
public class MultiAccountAdapter extends RecyclerView.a<MultiAccountAdapter.MultiAccountViewHolder> {
private final List<MultiAccountItem> mAccounts = MultiAccountManager.buildList();
@Override
public MultiAccountViewHolder b(ViewGroup parent, int viewType) {
RelativeLayout layout = new RelativeLayout(parent.getContext());
layout.setPadding(
convertDpToPixel(12),
convertDpToPixel(6),
convertDpToPixel(6),
convertDpToPixel(6)
);
VKCircleImageView avatar = new VKCircleImageView(parent.getContext());
avatar.setId(1);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
convertDpToPixel(48),
convertDpToPixel(48)
);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
layout.addView(avatar, params);
TextView nickname = new TextView(parent.getContext());
nickname.setId(2);
nickname.setPaddingRelative(
convertDpToPixel(12),
0,
0,
0
);
nickname.setEllipsize(TextUtils.TruncateAt.END);
nickname.setSingleLine(true);
nickname.setTextSize(15.0f);
nickname.setTextColor(getTextAttr());
nickname.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(-2, -2);
params1.addRule(RelativeLayout.CENTER_VERTICAL);
params1.addRule(RelativeLayout.RIGHT_OF, 1);
layout.addView(nickname, params1);
ImageButton action = new ImageButton(parent.getContext());
action.setId(3);
action.setBackgroundResource(com.vtosters.lite.R.drawable.rounded_list_selector);
Drawable drawable = recolorDrawable(getResources().getDrawable(R.drawable.ic_list_remove));
action.setImageDrawable(drawable);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(
convertDpToPixel(48),
convertDpToPixel(48)
);
params2.addRule(RelativeLayout.CENTER_VERTICAL);
params2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
layout.addView(action, params2);
return new MultiAccountViewHolder(layout);
}
@Override
public void a(MultiAccountViewHolder holder, int pos) {
holder.bind(pos == 0 ? null : mAccounts.get(pos - 1), pos);
}
@Override
public int au_() {
return mAccounts.size() + 1;
}
static class MultiAccountViewHolder extends RecyclerView.x {
private final RelativeLayout mContainer;
private final VKCircleImageView mAvatar;
private final TextView mNickname;
private final ImageButton mAction;
public MultiAccountViewHolder(View view) {
super(view);
mContainer = (RelativeLayout) view;
mAvatar = view.findViewById(1);
mNickname = view.findViewById(2);
mAction = view.findViewById(3);
}
public void bind(MultiAccountItem item, int pos) {
if (pos == 0) {
mNickname.setText("Добавить новый аккаунт");
mContainer.setOnClickListener(v -> {
MultiAccountManager.addAccount();
VKImageLoader.b();
ImEngineProvider.a().h();
AudioMessageUtils.j();
FileUtils.l();
VKAccount b = VKAccountManager.b();
PushSubscriber.a.a(b.b(), b.c());
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
restartApplication();
});
Drawable drawable = recolorDrawable(getResources().getDrawable(R.drawable.ic_list_add));
mAction.setImageDrawable(drawable);
mAction.setClickable(false);
} else {
mContainer.setOnClickListener(v -> {
MultiAccountManager.switchAccount(item.index);
VKImageLoader.b();
ImEngineProvider.a().h();
AudioMessageUtils.j();
FileUtils.l();
VKAccount b = VKAccountManager.b();
PushSubscriber.a.a(b.b(), b.c());
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
restartApplication();
});
if (isNetworkConnected())
mAvatar.a(item.imageUrl);
else
mAvatar.a(R.drawable.vkim_ic_placeholder_user_square_64dp);
mNickname.setText(item.nickname);
mAction.setOnClickListener(v -> {
MultiAccountManager.deleteAccount(item.index);
VKImageLoader.b();
ImEngineProvider.a().h();
AudioMessageUtils.j();
FileUtils.l();
VKAccount b = VKAccountManager.b();
PushSubscriber.a.a(b.b(), b.c());
AppContextHolder.a.getSharedPreferences("gcm", 0).edit().clear().apply();
restartApplication();
});
}
}
}
}
@@ -0,0 +1,42 @@
package ru.vtosters.lite.ui.fragments.multiaccount;
import static ru.vtosters.lite.utils.Globals.getString;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import me.grishka.appkit.fragments.ToolbarFragment;
public class MultiAccountFragment extends ToolbarFragment {
private RecyclerView mRecyclerView;
private MultiAccountAdapter mAdapter;
@Override
public View d(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
LinearLayout layout = new LinearLayout(n());
mRecyclerView = new RecyclerView(n());
mRecyclerView.setLayoutManager(new LinearLayoutManager(n()));
mAdapter = new MultiAccountAdapter();
mRecyclerView.setAdapter(mAdapter);
layout.addView(mRecyclerView, new LinearLayout.LayoutParams(-1, -1));
return layout;
}
@Override
public void a(View arg0, Bundle arg1) {
o_(true);
super.a(arg0, arg1);
a(getString("accounts"));
}
}
@@ -0,0 +1,86 @@
package ru.vtosters.lite.ui.fragments.multiaccount;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.getPreferences;
import android.content.Context;
import android.content.SharedPreferences;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MultiAccountManager {
public static void migrate() {
SharedPreferences OldPrefs = getContext().getSharedPreferences("pref_account_manager", Context.MODE_PRIVATE);
String OldPrefsValue = OldPrefs.getString("key_vk_account", "");
SharedPreferences NewPrefs = getContext().getSharedPreferences("pref_account_manager0", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = NewPrefs.edit();
editor.putString("key_vk_account", OldPrefsValue);
editor.apply();
}
public static SharedPreferences getCurrentAccount() {
int account = getPreferences().getInt("account", 0);
return getContext().getSharedPreferences("pref_account_manager" + (account != 0 ? account : ""), Context.MODE_PRIVATE);
}
private static int getAccountPrefsCount() {
File[] prefs = new File(getContext().getFilesDir().getParent(), "shared_prefs")
.listFiles((dir, name) -> {
return name.matches("pref_account_manager\\d+\\.xml");
});
return prefs != null ? prefs.length : 0;
}
private static String withRegex(String base, String regex, String def) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(base);
if (matcher.find()) {
return matcher.group(1);
}
return def;
}
public static List<MultiAccountItem> buildList() {
List<MultiAccountItem> list = new ArrayList<>();
for (int i = 0; i <= getAccountPrefsCount(); i++) {
SharedPreferences prefs = getContext().getSharedPreferences("pref_account_manager" + i, Context.MODE_PRIVATE);
String keyVKAccount = prefs.getString("key_vk_account", "");
if (!keyVKAccount.isEmpty()) {
String name = withRegex(keyVKAccount, ".*\"name\":\\{.*?:\"(.*?)\"\\}.*", "");
String avatarUrl = withRegex(keyVKAccount, ".*\"photo\":\\{.*?:\"(.*?)\"\\}.*", "https://vk.com/images/camera_200.png")
.replace("\\/", "/");
list.add(new MultiAccountItem(
name, avatarUrl, i
));
}
}
return list;
}
public static boolean switchAccount(int i) {
int account = getPreferences().getInt("account", 0);
if (account == i) return false;
getPreferences().edit().putInt("account", i).commit();
return true;
}
public static void addAccount() {
getPreferences().edit().putInt("account", getAccountPrefsCount()).commit();
}
public static void deleteAccount(int i) {
int account = getPreferences().getInt("account", 0);
SharedPreferences prefs = getContext().getSharedPreferences("pref_account_manager" + i, Context.MODE_PRIVATE);
prefs.edit().clear().commit();
File file = new File(new File(getContext().getFilesDir().getParent(), "shared_prefs"), "pref_account_manager" + i);
if (file.exists()) file.delete();
if (account == i && getAccountPrefsCount() > 0)
switchAccount(buildList().get(0).index);
}
}
@@ -1,5 +1,18 @@
package ru.vtosters.lite.ui.fragments.tgstickers;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.getIdentifier;
import static ru.vtosters.lite.utils.Globals.getResources;
import static ru.vtosters.lite.utils.Globals.getString;
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.getTextAttr;
import static ru.vtosters.lite.utils.Themes.recolorDrawable;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
@@ -24,7 +37,6 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -42,33 +54,22 @@ import java.io.File;
import me.grishka.appkit.fragments.ToolbarFragment;
import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.ui.PreferencesUtil;
import ru.vtosters.lite.utils.Prefs;
import ru.vtosters.lite.utils.Themes;
public class StickersFragment extends ToolbarFragment {
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 static final String TAG = "StickersFragment";
public int from;
public int to;
private TelegramStickersGrabber grabber;
private TelegramStickersService stickersService;
private FloatingActionButton fab;
private static final String TAG = "StickersFragment";
@SuppressWarnings("rawtypes")
private RecyclerView.Adapter adapter;
private boolean movePending = false;
public int from;
public int to;
private int editPadding;
private RecyclerView recycler;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -90,6 +91,8 @@ public class StickersFragment extends ToolbarFragment {
}
}
};
private int editPadding;
private RecyclerView recycler;
private void initGrabber() {
int method = TGPref.getTGConnectMethod();
@@ -118,7 +121,7 @@ public class StickersFragment extends ToolbarFragment {
private void openMenu(String toast) {
if (toast != null) {
Toast.makeText(super.n(), toast, Toast.LENGTH_SHORT).show();
makeText(super.n(), toast, LENGTH_SHORT).show();
}
var intent = new Navigator(StickersPreferencesFragment.class, new Bundle()).a(super.n());
super.n().startActivity(intent);
@@ -130,7 +133,7 @@ public class StickersFragment extends ToolbarFragment {
super.a(menu, menuInflater);
MenuItem add = menu.add(0, 0, 0, "");
add.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
add.setIcon(Helper.getResources().getDrawable(com.vtosters.lite.R.drawable.ic_settings_24));
add.setIcon(getResources().getDrawable(com.vtosters.lite.R.drawable.ic_settings_24));
}
@Override
@@ -155,21 +158,21 @@ public class StickersFragment extends ToolbarFragment {
linearLayout.addView(editText);
editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams());
margin.setMargins(Helper.convertDpToPixel(24f), 0, Helper.convertDpToPixel(24f), 0);
margin.setMargins(convertDpToPixel(24f), 0, convertDpToPixel(24f), 0);
editText.setLayoutParams(margin);
new AlertDialog.Builder(super.n())
.setTitle(Helper.getString("stickersapi5"))
.setMessage(Helper.getString("stickersapi6"))
.setTitle(getString("stickersapi5"))
.setMessage(getString("stickersapi6"))
.setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
TGPref.setTGBotKey(editText.getText().toString());
if (r != null) r.run();
}).setNegativeButton(android.R.string.cancel, null).setNeutralButton(Helper.getString("stickersapi7"), (dialog, which) -> new AlertDialog.Builder(super.n())
.setTitle(Helper.getString("stickersapi8"))
.setMessage(Helper.getString("stickersapi9") +
Helper.getString("stickersapi10")).setPositiveButton(android.R.string.ok, null)
.create().show()).create().show();
}).setNegativeButton(android.R.string.cancel, null).setNeutralButton(getString("stickersapi7"), (dialog, which) -> new AlertDialog.Builder(super.n())
.setTitle(getString("stickersapi8"))
.setMessage(getString("stickersapi9") +
getString("stickersapi10")).setPositiveButton(android.R.string.ok, null)
.create().show()).create().show();
}
private void checkApiKey(final Runnable r) {
@@ -179,7 +182,7 @@ public class StickersFragment extends ToolbarFragment {
final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage(Helper.getString("stickersapi1"));
progressDialog.setMessage(getString("stickersapi1"));
progressDialog.show();
grabber.checkKey(new TelegramStickersGrabber.KeyCheckListener() {
@@ -187,7 +190,7 @@ public class StickersFragment extends ToolbarFragment {
public void onKeyChecked(boolean ok) {
progressDialog.dismiss();
if (!ok) {
Toast.makeText(context, Helper.getString("stickersapi2"), Toast.LENGTH_SHORT).show();
makeText(context, getString("stickersapi2"), LENGTH_SHORT).show();
return;
}
stickersService.setBotKey(TGPref.getTGBotKey());
@@ -199,9 +202,9 @@ public class StickersFragment extends ToolbarFragment {
public void onNetError() {
progressDialog.dismiss();
new AlertDialog.Builder(context)
.setMessage(Helper.getString("stickersapi3"))
.setMessage(getString("stickersapi3"))
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(Helper.getString("stickersapi4"), (arg0, arg1) -> checkApiKey(r)).create().show();
.setPositiveButton(getString("stickersapi4"), (arg0, arg1) -> checkApiKey(r)).create().show();
}
});
}
@@ -211,9 +214,9 @@ public class StickersFragment extends ToolbarFragment {
@Override
public View d(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
grabber = new TelegramStickersGrabber(TGPref.getTGBotKey());
stickersService = TelegramStickersService.getInstance(Helper.GetContext());
stickersService = TelegramStickersService.getInstance(getContext());
editPadding = Helper.convertDpToPixel(24f);
editPadding = convertDpToPixel(24f);
FrameLayout v = new FrameLayout(container.getContext());
@@ -222,11 +225,11 @@ public class StickersFragment extends ToolbarFragment {
fab = new FloatingActionButton(container.getContext());
fab.setImageResource(R.drawable.ic_add_24);
fab.setBackgroundTintList(ColorStateList.valueOf(Themes.getAccentColor()));
fab.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
fab.setOnClickListener(v2 -> fabClick());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
params.setMargins(0, 0, 0, Helper.convertDpToPixel(12f));
params.setMargins(0, 0, 0, convertDpToPixel(12f));
fab.setLayoutParams(params);
v.addView(recycler);
@@ -245,7 +248,7 @@ public class StickersFragment extends ToolbarFragment {
switch (method) {
case TYPE_SOCKS:
if (TGPref.getTGProxyIP() == null) {
openMenu(Helper.getString("stickersproxy1"));
openMenu(getString("stickersproxy1"));
return;
}
case TYPE_TOASTER_SERVER:
@@ -254,27 +257,27 @@ public class StickersFragment extends ToolbarFragment {
LinearLayout linearLayout = new LinearLayout(super.n());
final EditText editText = new EditText(super.n());
editText.setHintTextColor(PreferencesUtil.getSTextColor(Helper.GetContext()));
editText.setHintTextColor(PreferencesUtil.getSTextColor(getContext()));
// Костыль для китката
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setBackgroundTintList(ColorStateList.valueOf(PreferencesUtil.getTextColor(Helper.GetContext())));
editText.setBackgroundTintList(ColorStateList.valueOf(PreferencesUtil.getTextColor(getContext())));
} else {
ViewCompat.setBackgroundTintList(editText, ColorStateList.valueOf(PreferencesUtil.getTextColor(Helper.GetContext())));
ViewCompat.setBackgroundTintList(editText, ColorStateList.valueOf(PreferencesUtil.getTextColor(getContext())));
}
linearLayout.addView(editText);
editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams());
margin.setMargins(Helper.convertDpToPixel(24f), 0, Helper.convertDpToPixel(24f), 0);
margin.setMargins(convertDpToPixel(24f), 0, convertDpToPixel(24f), 0);
editText.setLayoutParams(margin);
new AlertDialog.Builder(super.n()).setTitle(Helper.getString("stickershelp1"))
.setMessage(Helper.getString("stickershelp2"))
new AlertDialog.Builder(super.n()).setTitle(getString("stickershelp1"))
.setMessage(getString("stickershelp2"))
.setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
String pack = editText.getText().toString();
pack = parsePack(pack);
stickersService.requestPackDownload(pack, new File(Helper.GetContext().getFilesDir(), new File("VT-Stickers", pack).getAbsolutePath()));
stickersService.requestPackDownload(pack, new File(getContext().getFilesDir(), new File("VT-Stickers", pack).getAbsolutePath()));
}).setNeutralButton(android.R.string.cancel, null).create().show();
};
if (TGPref.getTGBotKey() == null) enterBotKey(() -> checkApiKey(work));
@@ -284,7 +287,7 @@ public class StickersFragment extends ToolbarFragment {
};
if (method == -1) {
openMenu(Helper.getString("stickersconnection"));
openMenu(getString("stickersconnection"));
} else {
r.run();
}
@@ -293,7 +296,7 @@ public class StickersFragment extends ToolbarFragment {
@Override
public void b(@Nullable Bundle savedInstanceState) {
super.b(savedInstanceState);
Helper.GetContext().registerReceiver(receiver, new IntentFilter(ACTION_RELOAD));
getContext().registerReceiver(receiver, new IntentFilter(ACTION_RELOAD));
}
@Override
@@ -302,13 +305,13 @@ public class StickersFragment extends ToolbarFragment {
super.a(arg0, arg1);
a(Helper.getString("vtltgs"));
a(getString("vtltgs"));
}
@Override
public void A_() {
super.A_();
Helper.GetContext().unregisterReceiver(receiver);
getContext().unregisterReceiver(receiver);
}
private String parsePack(String pack) {
@@ -321,31 +324,12 @@ public class StickersFragment extends ToolbarFragment {
}
public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.StickerPackViewHolder> {
private String TAG = "StickerPackAdapter";
public class StickerPackViewHolder extends RecyclerView.ViewHolder {
private SwitchCompat switchCompat;
private ImageView stickerImage, updateButton, deleteButton;
private TextView name, count;
private LinearLayout layout;
StickerPackViewHolder(@NonNull View view) {
super(view);
switchCompat = (SwitchCompat) view.findViewById(R.id.choose_btn);
stickerImage = (ImageView) view.findViewById(R.id.photo);
updateButton = (ImageView) view.findViewById(R.id.button_update);
deleteButton = (ImageView) view.findViewById(R.id.action_delete);
name = (TextView) view.findViewById(R.id.vkim_cancel);
count = (TextView) view.findViewById(R.id.vkim_cancel_label_text);
layout = (LinearLayout) view.findViewById(R.id.linearLayout5);
}
}
private final String TAG = "StickerPackAdapter";
@NonNull
@Override
public StickerPackViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
var view = LayoutInflater.from(parent.getContext()).inflate(Helper.getIdentifier("tgs_entry", "layout"), parent, false);
var view = LayoutInflater.from(parent.getContext()).inflate(getIdentifier("tgs_entry", "layout"), parent, false);
return new StickerPackViewHolder(view);
}
@@ -365,19 +349,19 @@ public class StickersFragment extends ToolbarFragment {
if (f.exists()) {
holder.stickerImage.setImageURI(Uri.parse("file://" + f.getAbsolutePath()));
} else {
holder.stickerImage.setImageDrawable(Helper.getResources().getDrawable(R.drawable.icon_vk_104));
holder.stickerImage.setImageDrawable(getResources().getDrawable(R.drawable.icon_vk_104));
}
} catch (Exception e) {
e.printStackTrace();
}
holder.updateButton.setImageDrawable(Themes.recolorDrawable(Helper.getResources().getDrawable(R.drawable.ic_camera_switch_48)));
holder.updateButton.setImageDrawable(recolorDrawable(getResources().getDrawable(R.drawable.ic_camera_switch_48)));
holder.updateButton.setOnClickListener(listener -> {
stickersService.setBotKey(TGPref.getTGBotKey());
stickersService.requestPackDownload(pack.id, new File(Helper.GetContext().getFilesDir(), new File("VT-Stickers", pack.id).getAbsolutePath()));
stickersService.requestPackDownload(pack.id, new File(getContext().getFilesDir(), new File("VT-Stickers", pack.id).getAbsolutePath()));
});
holder.deleteButton.setImageDrawable(Themes.recolorDrawable(Helper.getResources().getDrawable(R.drawable.vkim_ic_msg_delete)));
holder.deleteButton.setImageDrawable(recolorDrawable(getResources().getDrawable(R.drawable.vkim_ic_msg_delete)));
holder.deleteButton.setOnClickListener(listener -> {
stickersService.deletePack(pack);
notifyItemRemoved(position);
@@ -386,13 +370,13 @@ public class StickersFragment extends ToolbarFragment {
holder.name.setText(pack.title);
holder.switchCompat.setChecked(pack.enabled);
holder.switchCompat.setOnCheckedChangeListener((buttonView, isChecked) -> stickersService.setPackEnabled(pack, isChecked, false));
holder.count.setText(pack.stickersCount + " " + Helper.getString("stickerscount"));
holder.count.setText(pack.stickersCount + " " + getString("stickerscount"));
holder.layout.setBackgroundColor(Prefs.getNavbarColor());
holder.layout.setBackgroundColor(getNavbarColor());
// Color костыль
int color = Themes.getTextAttr();
int secondary = Themes.getSTextAttr();
int color = getTextAttr();
int secondary = getSTextAttr();
holder.name.setTextColor(color);
holder.count.setTextColor(secondary);
@@ -402,6 +386,28 @@ public class StickersFragment extends ToolbarFragment {
public int getItemCount() {
return stickersService.getPacksListReference().size();
}
public class StickerPackViewHolder extends RecyclerView.ViewHolder {
private final SwitchCompat switchCompat;
private final ImageView stickerImage;
private final ImageView updateButton;
private final ImageView deleteButton;
private final TextView name;
private final TextView count;
private final LinearLayout layout;
StickerPackViewHolder(@NonNull View view) {
super(view);
switchCompat = view.findViewById(R.id.choose_btn);
stickerImage = view.findViewById(R.id.photo);
updateButton = view.findViewById(R.id.button_update);
deleteButton = view.findViewById(R.id.action_delete);
name = view.findViewById(R.id.vkim_cancel);
count = view.findViewById(R.id.vkim_cancel_label_text);
layout = view.findViewById(R.id.linearLayout5);
}
}
}
}
@@ -1,5 +1,8 @@
package ru.vtosters.lite.ui.fragments.tgstickers;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.getString;
import android.os.Bundle;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
@@ -8,7 +11,6 @@ import com.vtosters.lite.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.tgs.TGRoot;
import ru.vtosters.lite.utils.Helper;
import ru.vtosters.lite.ui.PreferencesUtil;
public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragment {
@@ -17,19 +19,19 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
public void b(Bundle bundle) {
super.b(bundle);
int vtosterXml = Helper.GetContext().getResources().getIdentifier("empty", "xml", Helper.GetContext().getPackageName());
int vtosterXml = getContext().getResources().getIdentifier("empty", "xml", getContext().getPackageName());
this.a(vtosterXml);
PreferencesUtil.addPreferenceCategory(this, Helper.getString("sprefsstickers"));
PreferencesUtil.addPreference(this, "", Helper.getString("sprefsdelkey"), "", null, preference -> {
PreferencesUtil.addPreferenceCategory(this, getString("sprefsstickers"));
PreferencesUtil.addPreference(this, "", getString("sprefsdelkey"), "", null, preference -> {
TGPref.setTGBotKey(null);
ToastUtils.a(Helper.getString("sprefsdelkey2"));
ToastUtils.a(getString("sprefsdelkey2"));
return false;
});
PreferencesUtil.addPreferenceCategory(this, Helper.getString("sprefsnetwork"));
PreferencesUtil.addListPreference(this, "VTGS:CM", "0", Helper.getString("sprefsctype"), new CharSequence[]{
Helper.getString("ctypedirect"), Helper.getString("ctypesocks")
PreferencesUtil.addPreferenceCategory(this, getString("sprefsnetwork"));
PreferencesUtil.addListPreference(this, "VTGS:CM", "0", getString("sprefsctype"), new CharSequence[]{
getString("ctypedirect"), getString("ctypesocks")
}, new String[]{
"0", "2"
});
@@ -44,22 +46,22 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
return true;
});
PreferencesUtil.addPreferenceCategory(this, Helper.getString("ssocks"));
PreferencesUtil.addPreferenceCategory(this, getString("ssocks"));
PreferencesUtil.addEditTextPreference(this, "tg_proxy_host", Helper.getString("ssockshost"), (preference, o) -> {
PreferencesUtil.addEditTextPreference(this, "tg_proxy_host", getString("ssockshost"), (preference, o) -> {
TGPref.setTGProxyIP((String) o);
return true;
});
PreferencesUtil.addEditTextPreference(this, "tg_proxy_port", Helper.getString("ssocksport"), (preference, o) -> {
PreferencesUtil.addEditTextPreference(this, "tg_proxy_port", getString("ssocksport"), (preference, o) -> {
try {
TGPref.setTGProxyPort(Integer.parseInt((String) o));
return true;
} catch (Exception e) {
ToastUtils.a(Helper.getString("ssockswport"));
ToastUtils.a(getString("ssockswport"));
return false;
}
});
PreferencesUtil.addMaterialSwitchPreference(this, "tg_proxy_auth", Helper.getString("ssocksauth"), "", null, false, (preference, o) -> {
PreferencesUtil.addMaterialSwitchPreference(this, "tg_proxy_auth", getString("ssocksauth"), "", null, false, (preference, o) -> {
boolean value = (boolean) o;
a("tg_proxy_login").a(value); // findPreference("tg_proxy_login").setEnabled(value);
@@ -68,11 +70,11 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
TGPref.setTGProxyPassEnabled(value);
return true;
});
PreferencesUtil.addEditTextPreference(this, "tg_proxy_login", Helper.getString("ssockslogin"), (preference, o) -> {
PreferencesUtil.addEditTextPreference(this, "tg_proxy_login", getString("ssockslogin"), (preference, o) -> {
TGPref.setTGProxyUserPass((String) o, TGPref.getTGProxyPass());
return true;
});
PreferencesUtil.addEditTextPreference(this, "tg_proxy_pass", Helper.getString("ssockspass"), (preference, o) -> {
PreferencesUtil.addEditTextPreference(this, "tg_proxy_pass", getString("ssockspass"), (preference, o) -> {
TGPref.setTGProxyUserPass(TGPref.getTGProxyUser(), (String) o);
return true;
});
@@ -83,7 +85,7 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
@Override
public int aq() {
return Helper.GetContext().getResources().getIdentifier("vtltgs", "string", Helper.GetContext().getPackageName());
return getContext().getResources().getIdentifier("vtltgs", "string", getContext().getPackageName());
}
}
@@ -1,15 +1,10 @@
package ru.vtosters.lite.ui.vkui;
import android.app.Activity;
import android.content.DialogInterface;
import android.view.View;
import com.vk.core.dialogs.bottomsheet.ModalBottomSheet;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.Helper;
public class ModalBottomSheetProxy {
public final ModalBottomSheet.a builder;
@@ -0,0 +1,66 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Globals.*;
import static ru.vtosters.lite.utils.Preferences.*;
import android.content.Context;
import com.vk.about.Items;
import com.vk.about.Items1;
import com.vk.about.Items2;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
public class About {
public static void injectAbout(List<Items2> list) {
list.clear();
list.add(new Items1());
if (!oldabout()) {
list.add(new Items(21, com.vtosters.lite.R.string.opencommit));
list.add(new Items(8, com.vtosters.lite.R.string.tgchannel));
list.add(new Items(9, com.vtosters.lite.R.string.tgchat));
list.add(new Items(16, com.vtosters.lite.R.string.vtfaq));
list.add(new Items(19, com.vtosters.lite.R.string.vtsite));
list.add(new Items(20, com.vtosters.lite.R.string.donate));
list.add(new Items(17, com.vtosters.lite.R.string.vkgroup));
list.add(new Items(18, com.vtosters.lite.R.string.sett_debug));
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(2, com.vtosters.lite.R.string.about_app_privacy));
list.add(new Items(5, com.vtosters.lite.R.string.about_app_cookie));
list.add(new Items(3, com.vtosters.lite.R.string.about_app_terms_to_use));
list.add(new Items(4, com.vtosters.lite.R.string.about_app_license));
list.add(new Items(6, com.vtosters.lite.R.string.about_app_data_protect));
list.add(new Items(8, com.vtosters.lite.R.string.sett_debug));
}
public static String getBuildNumber() {
return getBuild(getContext(), "version.properties");
}
public static String getCommitLink() {
return "https://github.com/vtosters/lite/commit/" + getBuild(getContext(), "version.properties");
}
public static String getBuild(Context context, String name) {
try {
Scanner scanner = new Scanner(context.getAssets().open(name));
while (scanner.hasNextLine()) {
String line = scanner.findInLine("VERSION_BUILD=.+");
if (line != null)
return line.replace("VERSION_BUILD=", "");
return "0000000";
}
} catch (IOException e) {
e.printStackTrace();
}
return "0000000";
}
public static String getAppVersion() throws IOException {
return getApplicationName() + " " + VERSIONNAME + " | " + getBuildNumber();
}
}
@@ -1,12 +1,15 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.isEmpty;
import static ru.vtosters.lite.utils.Preferences.*;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import com.vk.dto.common.VideoFile;
@@ -27,51 +30,41 @@ public class ExternalLinkHandler {
private static final Map<String, String> qualities = new HashMap<>();
public static boolean parseVideoFile(VideoFile file, Context context) {
if (!Prefs.isEnableExternalOpening()) return false;
if (checkYoutubeLink(file)) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(file.n));
context.startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else if (checkVkVideo(file)) {
if (qualities.size() == 1) {
startExternalVideo((String) qualities.values().toArray()[0]);
} else {
String[] titles = qualities.keySet().toArray(new String[0]);
new AlertDialog.Builder(context)
.setItems(titles, ((dialog, which) -> {
startExternalVideo(qualities.get(titles[which]));
}))
.show();
}
}
if (!isEnableExternalOpening()) return false;
if (checkVkVideo(file)) {
if (qualities.size() == 1) {
startExternalVideo((String) qualities.values().toArray()[0]);
} else {
String[] titles = qualities.keySet().toArray(new String[0]);
new AlertDialog.Builder(context)
.setItems(titles, ((dialog, which) -> {
startExternalVideo(qualities.get(titles[which]));
}))
.show();
}
}
return true;
}
private static boolean checkYoutubeLink(VideoFile file) {
if (!Helper.isEmpty(file.n)) {
if (!isEmpty(file.n)) {
for (String filter : filters) {
if (file.n.contains(filter))
return true;
}
}
return false;
}
@@ -85,25 +78,25 @@ public class ExternalLinkHandler {
* this.k = var3.optString("mp4_2160");
*/
public static boolean checkVkVideo(VideoFile videoFile) {
if (!Helper.isEmpty(videoFile.e)) {
if (!isEmpty(videoFile.e)) {
qualities.put("240", videoFile.e);
}
if (!Helper.isEmpty(videoFile.f)) {
if (!isEmpty(videoFile.f)) {
qualities.put("360", videoFile.f);
}
if (!Helper.isEmpty(videoFile.g)) {
if (!isEmpty(videoFile.g)) {
qualities.put("480", videoFile.g);
}
if (!Helper.isEmpty(videoFile.h)) {
if (!isEmpty(videoFile.h)) {
qualities.put("720", videoFile.h);
}
if (!Helper.isEmpty(videoFile.i)) {
if (!isEmpty(videoFile.i)) {
qualities.put("1080", videoFile.i);
}
if (!Helper.isEmpty(videoFile.j)) {
if (!isEmpty(videoFile.j)) {
qualities.put("1440", videoFile.j);
}
if (!Helper.isEmpty(videoFile.k)) {
if (!isEmpty(videoFile.k)) {
qualities.put("2160", videoFile.k);
}
@@ -118,34 +111,27 @@ public class ExternalLinkHandler {
Intent intent = new Intent();
String packageName = getMXPlayerPackageName();
if (!Helper.isEmpty(packageName)) {
if (!isEmpty(packageName)) {
intent.setPackage(packageName);
intent.setDataAndType(uri, "application/mp4");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
} else {
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/mp4");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
Helper.GetContext().startActivity(intent);
getContext().startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
private static String getMXPlayerPackageName() {
for (ApplicationInfo info : Helper.GetContext().getPackageManager().getInstalledApplications(0)) {
for (ApplicationInfo info : getContext().getPackageManager().getInstalledApplications(0)) {
String packName = info.packageName;
if (packName.equals("com.mxtech.videoplayer.ad") || packName.equals("com.mxtech.videoplayer.pro"))
return packName;
@@ -0,0 +1,230 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Preferences.getLocale;
import android.app.Activity;
import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import androidx.annotation.NonNull;
import com.vk.core.util.ToastUtils;
import com.vtosters.lite.UserProfile;
import com.vtosters.lite.VKActivity;
import com.vtosters.lite.api.ExtendedUserProfile;
import com.vtosters.lite.auth.VKAccountManager;
import com.vtosters.lite.im.ImEngineProvider;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class Globals {
private static final List<Activity> activities = new ArrayList<>();
// Current UserId
public static int getUserId() {
return VKAccountManager.b().a();
}
public static String getUserSecret() {
return VKAccountManager.b().c();
}
public static String getUserToken() {
return VKAccountManager.b().b();
}
public static SharedPreferences.Editor edit() {
return PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
}
// Delete and reload msg cache
public static void reloadMSG() {
ImEngineProvider.a().h();
}
// UserId Profile via userProfile
public static int getUserID(UserProfile userProfile) {
return userProfile.n;
}
public static String getUserFirstName(UserProfile userProfile) {
return userProfile.p;
}
public static String getUserLastName(UserProfile userProfile) {
return userProfile.o;
}
// UserId Profile via extendedUserProfile
public static int getUserID(ExtendedUserProfile extendedUserProfile) {
return getUserID(fromEup(extendedUserProfile));
}
public static UserProfile fromEup(ExtendedUserProfile extendedUserProfile) {
return extendedUserProfile.a;
}
// Application restart (works on sdk 29+ too)
public static void restartApplication() {
Context ctx = getContext();
PackageManager pm = ctx.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(ctx.getPackageName());
Intent mainIntent = Intent.makeRestartActivityTask(intent.getComponent());
ctx.startActivity(mainIntent);
Runtime.getRuntime().exit(0);
}
// Global Context
@NonNull
public static Context getContext() {
try {
Class<?> appGlobalsClazz = Class.forName("android.app.AppGlobals");
Method getInitialApplication = appGlobalsClazz.getDeclaredMethod("getInitialApplication");
getInitialApplication.setAccessible(true);
return (Context) getInitialApplication.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// Google Market Services check
public static boolean isGmsInstalled() {
try {
getContext().getPackageManager().getPackageInfo("com.google.android.gms", 0);
return true;
} catch (Exception unused) {
return false;
}
}
public static Resources getResources() {
return getContext().getResources();
}
public static int getIdentifier(String str, String str2) {
return getResources().getIdentifier(str, str2, getContext().getPackageName());
}
public static String getString(String str) {
return getContext().getString(Integer.parseInt(String.valueOf(getContext().getResources().getIdentifier(str, "string", getContext().getPackageName()))));
}
public static String getPackageName() {
return getContext().getPackageName();
}
public static int convertDpToPixel(float f) {
return (int) (f * ((float) getContext().getResources().getDisplayMetrics().densityDpi / 160.0f));
}
public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(getContext());
}
public static void sendToast(String text) {
ToastUtils.a(text);
}
public static boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
public static boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
// Music channels fix
public static void fixGapps() {
try {
if (Build.VERSION.SDK_INT >= 26) {
NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
boolean z = false;
try {
if (notificationManager.getNotificationChannel("audio_playback_channel") != null) {
z = true;
}
} catch (Exception ignored) {
}
if (!z) {
notificationManager.createNotificationChannel(new NotificationChannel("audio_playback_channel", getResources().getString(com.vtosters.lite.R.string.audio_message_play_error), NotificationManager.IMPORTANCE_LOW));
}
}
} catch (Exception ignored) {
}
}
public static void registerActivities(Application application) {
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityPaused(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityResumed(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityStarted(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityStopped(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityCreated(Activity activity, Bundle bundle) {
if (activity instanceof VKActivity) {
activities.add(activity);
}
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityDestroyed(Activity activity) {
activities.remove(activity);
}
});
}
public static String getApplicationName() {
return getContext().getApplicationInfo().loadLabel(getContext().getPackageManager()).toString();
}
// Language changer and BaseContext inject
public static Context BaseContextLocale(Context context) {
Locale locale = new Locale(getLocale());
Locale.setDefault(locale);
var resources = context.getResources();
var configuration = resources.getConfiguration();
if (Build.VERSION.SDK_INT >= 24) {
configuration.setLocale(locale);
configuration.setLayoutDirection(locale);
return context.createConfigurationContext(configuration);
}
configuration.locale = locale;
configuration.setLayoutDirection(locale);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
}
@@ -1,140 +0,0 @@
package ru.vtosters.lite.utils;
import static android.content.Context.ACTIVITY_SERVICE;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.preference.PreferenceManager;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import com.vk.core.util.ToastUtils;
import com.vtosters.lite.UserProfile;
import com.vtosters.lite.api.ExtendedUserProfile;
import com.vtosters.lite.auth.VKAccountManager;
import com.vtosters.lite.im.ImEngineProvider;
import java.lang.reflect.Method;
import java.util.List;
public class Helper {
public static int GetUserId() {
return VKAccountManager.b().a();
}
public static String GetUserSecret() {
return VKAccountManager.b().c();
}
public static String GetUserToken() {
return VKAccountManager.b().b();
}
public static SharedPreferences.Editor edit() {
return PreferenceManager.getDefaultSharedPreferences(GetContext()).edit();
}
public static String getConnectorDomain(String str) {
return Proxy.GetConnector(str);
}
public static void reloadMSG() {
ImEngineProvider.a().h();
}
public static int getUserID(UserProfile userProfile) {
return userProfile.n;
}
public static String getUserFirstName(UserProfile userProfile) {
return userProfile.p;
}
public static String getUserLastName(UserProfile userProfile) {
return userProfile.o;
}
public static int getUserID(ExtendedUserProfile extendedUserProfile) {
return getUserID(fromEup(extendedUserProfile));
}
public static UserProfile fromEup(ExtendedUserProfile extendedUserProfile) {
return extendedUserProfile.a;
}
public static void restarting() {
GetContext().startActivity(Intent.makeRestartActivityTask(GetContext().getPackageManager().getLaunchIntentForPackage(GetContext().getPackageName()).getComponent()));
Runtime.getRuntime().exit(0);
}
@NonNull
public static Context GetContext() {
try {
Class<?> appGlobalsClazz = Class.forName("android.app.AppGlobals");
Method getInitialApplication = appGlobalsClazz.getDeclaredMethod("getInitialApplication");
getInitialApplication.setAccessible(true);
return (Context) getInitialApplication.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static boolean IsGmsInstalled() {
try {
GetContext().getPackageManager().getPackageInfo("com.google.android.gms", 0);
return true;
} catch (Exception unused) {
return false;
}
}
public static Resources getResources() {
return GetContext().getResources();
}
public static int getIdentifier(String str, String str2) {
return getResources().getIdentifier(str, str2, GetContext().getPackageName());
}
public static String getString(String str) {
return Helper.GetContext().getString(Integer.parseInt(String.valueOf(Helper.GetContext().getResources().getIdentifier(str, "string", Helper.GetContext().getPackageName()))));
}
public static String getPackageName() {
return GetContext().getPackageName();
}
public static int convertDpToPixel(float f) {
return (int) (f * (((float) GetContext().getResources().getDisplayMetrics().densityDpi) / 160.0f));
}
public static String GetString(@StringRes int res, Object... args) {
return GetContext().getString(res, args);
}
public static SharedPreferences GetPrefs() {
return PreferenceManager.getDefaultSharedPreferences(GetContext());
}
public static SharedPreferences GetPreferences() {
return PreferenceManager.getDefaultSharedPreferences(GetContext());
}
public static void SendToast(String text) {
ToastUtils.a(text);
}
public static boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
}
@@ -1,20 +1,23 @@
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 = Helper.GetContext().getPackageManager();
var packageName = Helper.getPackageName();
packageManager.setComponentEnabledSetting(new ComponentName(packageName, Helper.getPackageName() + ".VTIconDefault"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(packageName, Helper.getPackageName() + ".VTIconVK"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
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 = Helper.GetContext().getPackageManager();
var packageName = Helper.getPackageName();
packageManager.setComponentEnabledSetting(new ComponentName(packageName, Helper.getPackageName() + ".VTIconDefault"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(packageName, Helper.getPackageName() + ".VTIconVK"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
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,265 @@
package ru.vtosters.lite.utils;
import static java.lang.Long.MAX_VALUE;
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.getPreferences;
import static ru.vtosters.lite.utils.Preferences.BooleanTrue;
import static ru.vtosters.lite.utils.Preferences.adsgroup;
import static ru.vtosters.lite.utils.Preferences.adsstories;
import static ru.vtosters.lite.utils.Preferences.authorsrecomm;
import static ru.vtosters.lite.utils.Preferences.copyright_post;
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
import static ru.vtosters.lite.utils.Preferences.newfeed;
import static ru.vtosters.lite.utils.Preferences.postsrecomm;
import com.vk.apps.AppsFragment;
import com.vk.core.preference.Preference;
import com.vk.discover.DiscoverFragment;
import com.vk.discover.GatewaysFragment;
import com.vk.fave.fragments.FaveTabFragment;
import com.vk.menu.MenuFragment;
import com.vk.music.fragment.MusicFragment;
import com.vk.navigation.NavigatorKeys;
import com.vk.newsfeed.HomeFragment;
import com.vk.newsfeed.NewsfeedFragment;
import com.vk.notifications.NotificationsContainerFragment;
import com.vtosters.lite.fragments.GamesFragment;
import com.vtosters.lite.fragments.PhotosFragment;
import com.vtosters.lite.fragments.ProfileFragment;
import com.vtosters.lite.fragments.SettingsListFragment;
import com.vtosters.lite.fragments.d.DocumentsViewFragment;
import com.vtosters.lite.fragments.f.FriendsFragment;
import com.vtosters.lite.fragments.g.BirthdaysFragment;
import com.vtosters.lite.fragments.h.GroupsFragment;
import com.vtosters.lite.fragments.lives.LivesTabsFragment;
import com.vtosters.lite.fragments.m.VideosFragment;
import com.vtosters.lite.fragments.messages.dialogs.DialogsFragment;
import com.vtosters.lite.fragments.money.MoneyTransfersFragment;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Newsfeed {
public static List<String> mFilters;
public static boolean isBlockedByFilter(String str) {
for (String str2 : mFilters) {
if (str.toLowerCase().contains(str2.toLowerCase())) {
return true;
}
}
return false;
}
public static void setupFilters() {
mFilters = new ArrayList();
getFilter("refsfilter", "Referals.txt");
getFilter("shortlinkfilter", "LinkShorter.txt");
getFilter("default_ad_list", "StandartFilter.txt");
getFilter("shitposting", "IDontWantToReadIt.txt");
String string = getPreferences().getString("spamfilters", "");
if (!string.isEmpty()) {
mFilters.addAll(Arrays.asList(string.split(", ")));
}
}
public static void getFilter(String boolname, String filename) {
if (BooleanTrue(boolname)) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getContext().getAssets().open(filename)));
while (true) {
String readLine = bufferedReader.readLine();
if (readLine != null) {
mFilters.add(readLine);
} else {
bufferedReader.close();
return;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static boolean injectFilters(JSONObject jSONObject) {
String optString = jSONObject.optString(NavigatorKeys.j, "");
if (!ads(optString) && !authors_rec(optString) && !recomm(optString) && !friendrecomm(optString)) {
String optString2 = jSONObject.optString("post_type", "");
if (!ads(optString2) && !authors_rec(optString2) && !recomm(optString2) && !friendrecomm(optString2)) {
String optString3 = jSONObject.optString("filters", "");
if (ads(optString3) || authors_rec(optString3) || recomm(optString3) || friendrecomm(optString3) || isBlockedByFilter(jSONObject.optString(NavigatorKeys.x, "")) || checkCopyright(jSONObject) || captions(jSONObject)) {
return false;
}
return !AD(jSONObject);
}
}
return false;
}
public static boolean authors_rec(String str) {
return str.equals("authors_rec") && !authorsrecomm();
}
public static boolean captions(JSONObject jSONObject) {
try {
JSONObject jSONObject2 = jSONObject.getJSONObject("caption");
if (!Preferences.captions()) {
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))));
} catch (JSONException unused) {
return false;
}
}
public static boolean ads(String str) {
if ((str.equals("ads_easy_promote") || str.equals("promo_button") || str.equals("app_widget") || str.equals("ads")) && Preferences.ads()) {
return true;
}
return false;
}
public static boolean recomm(String str) {
return (str.equals("user_rec") || str.equals("live_recommended") || str.equals("inline_user_rec")) && !postsrecomm();
}
public static boolean friendrecomm(String str) {
return str.equals("friends_recommendations") && !friendsrecomm();
}
public static boolean AD(JSONObject jSONObject) {
return jSONObject.optInt("marked_as_ads", 0) == 1 && adsgroup();
}
public static boolean checkCopyright(JSONObject jSONObject) {
return jSONObject.optInt("copyright", 0) == 1 && copyright_post();
}
public static String friendsads() {
return postsrecomm() ? "user_rec" : "null";
}
public static String getFriendRecomm() {
return friendsrecomm() ? "friends_recommendations" : "null";
}
public static String authorsads() {
return authorsrecomm() ? "authors_rec" : "null";
}
public static String widgetads() {
return Preferences.ads() ? "null" : "app_widget";
}
public static String promoads() {
return Preferences.ads() ? "null" : "promo_button";
}
public static String storyads() {
return adsstories() ? "null" : "ads";
}
public static String getCommentsSort(String def) {
String string = getPreferences().getString("commentssort", "");
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) {
String string = getPreferences().getString("newsupdate", "");
if (string.isEmpty()) {
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() {
String string = getPreferences().getString("start_values", "");
if (string.equals("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;
}
}
@@ -0,0 +1,319 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountManager.migrate;
import static ru.vtosters.lite.utils.Globals.*;
import static ru.vtosters.lite.utils.Newsfeed.*;
import static ru.vtosters.lite.utils.Proxy.*;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import com.vk.core.util.Screen;
import com.vtosters.lite.data.Users;
import java.util.Locale;
public class Preferences {
public static String VERSIONNAME = "Beta";
public static void init(Application application) {
setupFilters();
fixGapps();
setProxy();
migrate();
registerActivities(application);
}
public static boolean BooleanFalse(String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
return prefs.getBoolean(key, false);
}
public static boolean BooleanTrue(String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
return prefs.getBoolean(key, true);
}
public static boolean authorsrecomm() {
return BooleanTrue("authorsrecomm");
}
public static boolean captions() {
return BooleanTrue("captions");
}
public static boolean copyright_post() {
return BooleanFalse("copyright_post");
}
public static boolean default_ad_list() {
return BooleanFalse("default_ad_list");
}
public static boolean shitposting() {
return BooleanFalse("shitposting");
}
public static boolean friendsrecomm() {
return BooleanTrue("friendsrecomm");
}
public static boolean isBGStickersEnabled() {
return BooleanTrue("isBGStickersEnabled");
}
public static boolean ads() {
return BooleanFalse("__dbg_no_ads");
}
public static boolean adsgroup() {
return BooleanFalse("adsgroup");
}
public static boolean olddock() {
return BooleanFalse("olddock");
}
public static boolean adsslider() {
return BooleanFalse("__dbg_no_slider_ads");
}
public static boolean adsstories() {
return BooleanFalse("adsstories");
}
public static boolean alteremoji(Context context) {
return alteremojipref() ? alteremojipref() : Screen.a(context);
}
public static boolean alteremojipref() {
return BooleanFalse("alteremoji");
}
public static boolean awayphp() {
return BooleanTrue("awayphp");
}
public static boolean VKUI_INJ() {
return BooleanTrue("VKUI_INJ");
}
public static boolean benchmark() {
return BooleanFalse("benchmark");
}
public static boolean calls() {
return BooleanTrue("calls");
}
public static boolean convUsersOnline() {
return BooleanFalse("convUsersOnline");
}
public static boolean darkmode() {
return BooleanTrue("darkmode");
}
public static boolean dev() {
return BooleanFalse("dev");
}
public static boolean devmenu() {
return BooleanFalse("devmenu");
}
public static boolean dnr() {
return BooleanTrue("dnr");
}
public static boolean dns() {
return BooleanTrue("dns");
}
public static boolean libverify() {
return BooleanFalse("libverify");
}
public static boolean dnt() {
return BooleanTrue("dnt");
}
public static boolean dockcounter() {
return BooleanTrue("dockcounter");
}
public static boolean feedcache() {
return BooleanTrue("feedcache");
}
public static void forceOffline() {
if (setoffline()) {
Users.b();
}
setupFilters();
}
public static boolean fulltime() {
return BooleanTrue("fulltime");
}
public static boolean gcmfix() {
return BooleanTrue("gcmfix");
}
public static boolean hasMusicSubscription() {
return BooleanTrue("hasMusicSubscription");
}
public static boolean isEnableExternalOpening() {
return BooleanFalse("isEnableExternalOpening");
}
public static boolean iconvk() {
return BooleanFalse("iconvk");
}
public static boolean iconvkru() {
return BooleanFalse("iconvkru");
}
public static boolean isMusicRestricted() {
return BooleanTrue("isMusicRestricted");
}
public static boolean msgflat() {
return BooleanFalse("msgflat");
}
public static boolean msgtails() {
return BooleanTrue("msgtails");
}
public static boolean navbar() {
return BooleanTrue("navbar");
}
public static boolean newfeed() {
return BooleanTrue("newfeed");
}
public static boolean offline() {
return BooleanTrue("offline");
}
public static boolean oldabout() {
return BooleanFalse("oldabout");
}
public static boolean postsrecomm() {
return BooleanTrue("postsrecomm");
}
public static String readstatus() {
return dnr() ? "messages.markAsRead" : "null";
}
public static boolean refsfilter() {
return BooleanFalse("refsfilter");
}
public static boolean setoffline() {
return BooleanFalse("setoffline");
}
public static boolean shortinfo() {
return BooleanTrue("shortinfo");
}
public static boolean shortlinkfilter() {
return BooleanFalse("shortlinkfilter");
}
public static boolean shortpost() {
return BooleanTrue("shortpost");
}
public static boolean showmenu() {
return BooleanFalse("showmenu");
}
public static boolean ssl() {
return BooleanTrue("ssl");
}
public static boolean stories() {
return BooleanTrue("stories");
}
public static boolean swipe() {
return BooleanTrue("swipe");
}
public static boolean systememoji() {
return BooleanFalse("systememoji");
}
public static boolean unlockstats() {
return BooleanFalse("unlockstats");
}
public static boolean usevkui() {
return BooleanTrue("usevkui");
}
public static boolean vksans() {
return BooleanFalse("vksans");
}
public static boolean voice() {
return BooleanTrue("voice");
}
public static boolean newvideo() {
return false;
}
public static int getMsgCount() {
String customvalue = getPreferences().getString("msgcount", "");
return customvalue.isEmpty() ? 30 : Integer.parseInt(customvalue);
}
public static String MediacontentFix() {
return Build.VERSION.SDK_INT >= 29 ? "date_modified DESC" : "datetaken DESC";
}
public static String MediacontentFix2() {
return Build.VERSION.SDK_INT >= 29 ? "date_modified" : "datetaken";
}
public static String MediacontentFix3() {
return Build.VERSION.SDK_INT >= 29 ? ", date_modified=" : ", dateTaken=";
}
public static boolean color_grishka() {
return BooleanTrue("color_grishka");
}
public static boolean vkme_msg() {
return BooleanFalse("vkme_msg");
}
public static String VKVersion() {
String string = getPreferences().getString("vkversion", "");
if (!string.isEmpty()) {
return string;
}
return "5.29";
}
public static String getLocale() {
String string = getPreferences().getString("lang_value", "");
if (string.equals("system")) {
return Locale.getDefault().getLanguage();
}
return string.isEmpty() ? Locale.getDefault().getLanguage() : string;
}
}
@@ -1,847 +0,0 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Proxy.setProxy;
import android.app.Activity;
import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.Window;
import com.vk.about.Items;
import com.vk.about.Items1;
import com.vk.about.Items2;
import com.vk.apps.AppsFragment;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.Screen;
import com.vk.discover.DiscoverFragment;
import com.vk.fave.fragments.FaveTabFragment;
import com.vk.menu.MenuFragment;
import com.vk.music.fragment.MusicFragment;
import com.vk.navigation.NavigatorKeys;
import com.vk.newsfeed.Feed2049;
import com.vk.notifications.NotificationsContainerFragment;
import com.vtosters.lite.R;
import com.vtosters.lite.VKActivity;
import com.vtosters.lite.data.Users;
import com.vtosters.lite.fragments.GamesFragment;
import com.vtosters.lite.fragments.PhotosFragment;
import com.vtosters.lite.fragments.ProfileFragment;
import com.vtosters.lite.fragments.SettingsListFragment;
import com.vtosters.lite.fragments.d.DocumentsViewFragment;
import com.vtosters.lite.fragments.f.FriendsFragment;
import com.vtosters.lite.fragments.g.BirthdaysFragment;
import com.vtosters.lite.fragments.h.GroupsFragment;
import com.vtosters.lite.fragments.lives.LivesTabsFragment;
import com.vtosters.lite.fragments.m.VideosFragment;
import com.vtosters.lite.fragments.messages.dialogs.DialogsFragment;
import com.vtosters.lite.fragments.money.MoneyTransfersFragment;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;
import kotlin.jvm.internal.Intrinsics;
public class Prefs {
public static String VERSIONNAME = "2.0 DEV";
private static List<String> mFilters;
private static List<Activity> activities = new ArrayList<>();
public static boolean BooleanFalse(String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Helper.GetContext());
return prefs.getBoolean(key, false);
}
public static boolean BooleanTrue(String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Helper.GetContext());
return prefs.getBoolean(key, true);
}
public static void ClearCache() {
}
public static String GetBackgroundStickers() {
if (isBGStickersEnabled()) {
return "images_with_background";
}
return "images";
}
public static boolean isBGStickersEnabled() {
return BooleanTrue("isBGStickersEnabled");
}
public static String GetCopyright() {
return copyright_post() ? "null" : "copyright";
}
public static String GetFriendRecomm() {
return friendsrecomm() ? "friends_recommendations" : "null";
}
public static String GetStories() {
return stories() ? "stories" : "null";
}
public static boolean ads() {
return BooleanFalse("__dbg_no_ads");
}
public static boolean adsgroup() {
return BooleanFalse("adsgroup");
}
public static boolean adsslider() {
return BooleanFalse("__dbg_no_slider_ads");
}
public static boolean adsstories() {
return BooleanFalse("adsstories");
}
public static boolean alteremoji(Context context) {
return alteremojipref() ? alteremojipref() : Screen.a(context);
}
public static boolean alteremojipref() {
return BooleanFalse("alteremoji");
}
public static String authorsads() {
return authorsrecomm() ? "authors_rec" : "null";
}
public static boolean authorsrecomm() {
return BooleanTrue("authorsrecomm");
}
public static boolean awayphp() {
return BooleanTrue("awayphp");
}
public static boolean VKUI_INJ() {
return BooleanTrue("VKUI_INJ");
}
public static boolean benchmark() {
return BooleanFalse("benchmark");
}
public static boolean calls() {
return BooleanTrue("calls");
}
public static boolean captions() {
return BooleanTrue("captions");
}
public static boolean convUsersOnline() {
return BooleanFalse("convUsersOnline");
}
public static boolean copyright_post() {
return BooleanTrue("copyright_post");
}
public static boolean darkmode() {
return BooleanTrue("darkmode");
}
public static boolean default_ad_list() {
return BooleanFalse("default_ad_list");
}
public static boolean dev() {
return BooleanFalse("dev");
}
public static boolean devmenu() {
return BooleanFalse("devmenu");
}
public static boolean dnr() {
return BooleanTrue("dnr");
}
public static boolean dns() {
return BooleanTrue("dns");
}
public static boolean libverify() {
return BooleanFalse("libverify");
}
public static boolean dnt() {
return BooleanTrue("dnt");
}
public static boolean dockcounter() {
return BooleanTrue("dockcounter");
}
public static boolean feedautoupdate() {
return BooleanTrue("feedautoupdate");
}
public static boolean feedcache() {
return BooleanTrue("feedcache");
}
public static void forceOffline() {
if (setoffline()) {
Users.b();
}
setupFilters();
}
public static boolean forcenogms() {
return BooleanTrue("forcenogms");
}
public static String friendsads() {
return postsrecomm() ? "user_rec" : "null";
}
public static boolean friendsrecomm() {
return BooleanTrue("friendsrecomm");
}
public static boolean fulltime() {
return BooleanTrue("fulltime");
}
public static boolean gcmfix() {
return BooleanTrue("gcmfix");
}
public static String getAppVersion() throws IOException {
return "VTLite | " + VERSIONNAME + " | " + getBuildNumber();
}
public static String getBuildNumber() {
return Prefs.getBuild(Helper.GetContext(), "version.properties");
}
public static String getCommitLink() {
return "https://github.com/vtosters/lite/commit/" + Prefs.getBuild(Helper.GetContext(), "version.properties");
}
public static String getBuild(Context context, String name) {
try {
Scanner scanner = new Scanner(context.getAssets().open(name));
while (scanner.hasNextLine()) {
String line = scanner.findInLine("VERSION_BUILD=.+");
if (line != null)
return line.replace("VERSION_BUILD=", "");
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String getBranch() {
return Helper.GetPreferences().getString("ota_branches", "Stable");
}
public static String getDarkVKUI() {
return !VKThemeHelper.d() ? "1" : "0";
}
public static String getMeToken() {
return Helper.GetPreferences().getString("me_token", "");
}
public static int getNavbarColor() {
return VKThemeHelper.a((int) R.attr.tabbar_background);
}
public static String getSSFSLink() {
return SSFSDomain() + "?token=" + ru.vtosters.lite.utils.Helper.GetUserToken() + "&vt_dark=" + getDarkVKUI() + "&secret=" + ru.vtosters.lite.utils.Helper.GetUserSecret() + "&proxy=" + getUserProxy() + "&lang=" + getLocale() + "&vt=1&vtl=1&vksans=" + isVKSansEnabled() + "&vt_version=" + getBuildNumber() + "&vt_debug=" + isDEVModEnabled();
}
public static String getString(String key, String defValue) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Helper.GetContext());
return prefs.getString(key, defValue);
}
public static String getUserProxy() {
return proxy() ? "1" : "0";
}
public static boolean hasMusicSubscription() {
return BooleanTrue("hasMusicSubscription");
}
public static boolean isEnableExternalOpening() {
return BooleanFalse("isEnableExternalOpening");
}
public static boolean iconvk() {
return BooleanFalse("iconvk");
}
public static boolean iconvkru() {
return BooleanFalse("iconvkru");
}
public static String isDEVModEnabled() {
return dev() ? "1" : "0";
}
public static boolean isOtaEnabled() {
return BooleanTrue("ota_enabled");
}
public static boolean isMusicRestricted() {
return BooleanTrue("isMusicRestricted");
}
public static String isVKSansEnabled() {
return vksans() ? "1" : "0";
}
public static boolean msgflat() {
return BooleanFalse("msgflat");
}
public static boolean msgtails() {
return BooleanTrue("msgtails");
}
public static boolean navbar() {
return BooleanTrue("navbar");
}
public static boolean newfeed() {
return BooleanFalse("newfeed");
}
public static boolean offline() {
return BooleanTrue("offline");
}
public static boolean oldabout() {
return BooleanFalse("oldabout");
}
public static boolean postsrecomm() {
return BooleanTrue("postsrecomm");
}
public static String promoads() {
return ads() ? "null" : "promo_button";
}
public static String proxyHostHTTP() {
String string = Helper.GetPreferences().getString("proxyHostHTTP", "");
return string.isEmpty() ? "192.168.0.1" : string;
}
public static String proxyHostHTTPS() {
String string = Helper.GetPreferences().getString("proxyHostHTTPS", "");
return string.isEmpty() ? "192.168.0.1" : string;
}
public static String proxyHostSocks() {
String string = Helper.GetPreferences().getString("proxyHostSocks", "");
return string.isEmpty() ? "192.168.0.1" : string;
}
public static String proxyPortHTTP() {
String string = Helper.GetPreferences().getString("proxyPortHTTP", "");
return string.isEmpty() ? "8888" : string;
}
public static String proxyPortHTTPS() {
String string = ru.vtosters.lite.utils.Helper.GetPreferences().getString("proxyPortHTTPS", "");
return string.isEmpty() ? "8888" : string;
}
public static String proxyPortSocks() {
String string = Helper.GetPreferences().getString("proxyPortSocks", "");
return string.isEmpty() ? "8888" : string;
}
public static boolean proxyvk() {
return BooleanFalse("proxyvk");
}
public static String readstatus() {
return dnr() ? "messages.markAsRead" : "null";
}
public static boolean refsfilter() {
return BooleanFalse("refsfilter");
}
public static boolean rightLikes() {
return BooleanFalse("rightLikes");
}
public static void setMeToken(String str) {
ru.vtosters.lite.utils.Helper.GetPreferences().edit().putString("me_token", str).apply();
}
public static boolean setoffline() {
return BooleanFalse("setoffline");
}
public static boolean shortinfo() {
return BooleanTrue("shortinfo");
}
public static boolean shortlinkfilter() {
return BooleanFalse("shortlinkfilter");
}
public static boolean shortpost() {
return BooleanTrue("shortpost");
}
public static boolean showmenu() {
return BooleanFalse("showmenu");
}
public static boolean ssl() {
return BooleanTrue("ssl");
}
public static boolean stories() {
return BooleanTrue("stories");
}
public static String storyads() {
return adsstories() ? "null" : "ads";
}
public static boolean swipe() {
return BooleanTrue("swipe");
}
public static boolean systememoji() {
return BooleanFalse("systememoji");
}
public static boolean unlockstats() {
return BooleanFalse("unlockstats");
}
public static boolean usevkui() {
return BooleanTrue("usevkui");
}
public static boolean vksans() {
return BooleanFalse("vksans");
}
public static boolean voice() {
return BooleanTrue("voice");
}
public static boolean newvideo() {
return BooleanFalse("newvideo");
}
public static String widgetads() {
return ads() ? "null" : "app_widget";
}
public static void setNavbarColor(Window window, int i) {
if (navbar()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setNavigationBarColor(getNavbarColor());
}
}
if (Build.VERSION.SDK_INT >= 31 && VKThemeHelper.d()) {
View decorView = window.getDecorView();
Intrinsics.a((Object) decorView, "view");
decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() | 8192);
}
}
public static String MediacontentFix() {
return Build.VERSION.SDK_INT >= 29 ? "date_modified DESC" : "datetaken DESC";
}
public static String MediacontentFix2() {
return Build.VERSION.SDK_INT >= 29 ? "date_modified" : "datetaken";
}
public static String MediacontentFix3() {
return Build.VERSION.SDK_INT >= 29 ? ", date_modified=" : ", dateTaken=";
}
public static boolean inject(JSONObject jSONObject) {
String optString = jSONObject.optString(NavigatorKeys.j, "");
if (!ads(optString) && !authors_rec(optString) && !recomm(optString) && !friendrecomm(optString)) {
String optString2 = jSONObject.optString("post_type", "");
if (!ads(optString2) && !authors_rec(optString2) && !recomm(optString2) && !friendrecomm(optString2)) {
String optString3 = jSONObject.optString("filters", "");
if (ads(optString3) || authors_rec(optString3) || recomm(optString3) || friendrecomm(optString3) || isBlockedByFilter(jSONObject.optString(NavigatorKeys.x, "")) || checkCopyright(jSONObject) || captions(jSONObject)) {
return false;
}
return !AD(jSONObject);
}
}
return false;
}
public static void setupFilters() {
mFilters = new ArrayList();
ReferalsPut();
StandardFilterPut();
ShortLinkPut();
String string = Helper.GetPreferences().getString("spamfilters", "");
if (!string.isEmpty()) {
mFilters.addAll(Arrays.asList(string.split(", ")));
}
}
public static void ReferalsPut() {
if (BooleanTrue("refsfilter")) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Helper.GetContext().getAssets().open("Referals.txt")));
while (true) {
String readLine = bufferedReader.readLine();
if (readLine != null) {
mFilters.add(readLine);
} else {
bufferedReader.close();
return;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void ShortLinkPut() {
if (BooleanTrue("shortlinkfilter")) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Helper.GetContext().getAssets().open("LinkShorter.txt")));
while (true) {
String readLine = bufferedReader.readLine();
if (readLine != null) {
mFilters.add(readLine);
} else {
bufferedReader.close();
return;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void StandardFilterPut() {
if (BooleanTrue("default_ad_list")) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Helper.GetContext().getAssets().open("StandartFilter.txt")));
while (true) {
String readLine = bufferedReader.readLine();
if (readLine != null) {
mFilters.add(readLine);
} else {
bufferedReader.close();
return;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String SSFSDomain() {
String string = Helper.GetPreferences().getString("ssfscustom", "");
if (!string.isEmpty()) {
return string;
}
return "https://vtsf.vknext.net";
}
public static String VKVersion() {
String string = Helper.GetPreferences().getString("vkversion", "");
if (!string.isEmpty()) {
return string;
}
return "5.29";
}
public static boolean isBlockedByFilter(String str) {
for (String str2 : mFilters) {
if (str.toLowerCase().contains(str2.toLowerCase())) {
return true;
}
}
return false;
}
public static void injectAbout(List<Items2> list) {
list.clear();
list.add(new Items1());
if (!oldabout()) {
list.add(new Items(21, R.string.opencommit));
list.add(new Items(8, R.string.tgchannel));
list.add(new Items(9, R.string.tgchat));
list.add(new Items(16, R.string.vtfaq));
list.add(new Items(19, R.string.vtsite));
list.add(new Items(20, R.string.donate));
list.add(new Items(17, R.string.vkgroup));
list.add(new Items(18, R.string.sett_debug));
return;
}
list.add(new Items(0, R.string.about_app_feedback));
list.add(new Items(1, R.string.about_app_estimate));
list.add(new Items(2, R.string.about_app_privacy));
list.add(new Items(5, R.string.about_app_cookie));
list.add(new Items(3, R.string.about_app_terms_to_use));
list.add(new Items(4, R.string.about_app_license));
list.add(new Items(6, R.string.about_app_data_protect));
list.add(new Items(8, R.string.sett_debug));
}
public static boolean ads(String str) {
if ((str.equals("ads_easy_promote") || str.equals("promo_button") || str.equals("app_widget") || str.equals("ads")) && ads()) {
return false;
}
return false;
}
public static String getLocale() {
String string = Helper.GetPreferences().getString("lang_value", "");
if (string.equals("system")) {
return Locale.getDefault().getLanguage();
}
return string.isEmpty() ? Locale.getDefault().getLanguage() : string;
}
public static boolean proxy() {
return ru.vtosters.lite.utils.Helper.GetPreferences().getString("proxy", "").equals("apiproxy");
}
public static boolean authors_rec(String str) {
return str.equals("authors_rec") && !authorsrecomm();
}
public static boolean captions(JSONObject jSONObject) {
try {
JSONObject jSONObject2 = jSONObject.getJSONObject("caption");
if (!captions()) {
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))));
} catch (JSONException unused) {
return false;
}
}
public static boolean recomm(String str) {
return (str.equals("user_rec") || str.equals("live_recommended") || str.equals("inline_user_rec")) && !postsrecomm();
}
public static boolean friendrecomm(String str) {
return str.equals("friends_recommendations") && !friendsrecomm();
}
public static boolean AD(JSONObject jSONObject) {
return jSONObject.optInt("marked_as_ads", 0) == 1 && adsgroup();
}
public static boolean checkCopyright(JSONObject jSONObject) {
return jSONObject.optInt("copyright", 0) == 1 && copyright_post();
}
public static Activity getCurrentActivity() {
if (activities.size() == 0) {
return null;
}
return activities.get(0);
}
public static void init(Application application) {
setupFilters();
fixGapps();
setProxy();
registerActivities(application);
}
private static void registerActivities(Application application) {
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { // from class: ru.vtoster2.VTCore.1
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityPaused(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityResumed(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityStarted(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityStopped(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityCreated(Activity activity, Bundle bundle) {
if (activity instanceof VKActivity) {
Prefs.activities.add(activity);
}
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityDestroyed(Activity activity) {
Prefs.activities.remove(activity);
}
});
}
public static Class getStartFragment() {
String string = ru.vtosters.lite.utils.Helper.GetPreferences().getString("start_value", "");
if (string.equals("newsfeed")) {
return Feed2049.b.c();
}
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(NavigatorKeys.v)) {
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 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 : Feed2049.b.c();
}
public static Context BaseContextLocale(Context context) {
Locale locale = new Locale(getLocale());
Locale.setDefault(locale);
var resources = context.getResources();
var configuration = resources.getConfiguration();
if (Build.VERSION.SDK_INT >= 24) {
configuration.setLocale(locale);
configuration.setLayoutDirection(locale);
return context.createConfigurationContext(configuration);
}
configuration.locale = locale;
configuration.setLayoutDirection(locale);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
public static int vk_sans_display_demibold() {
return vksans() ? R.font.tt_commons_demi_bold : R.font.vk_sans_display_demibold;
}
public static int vk_sans_text_black() {
return vksans() ? R.font.vk_sans_display_bold : R.font.roboto_black;
}
public static int vk_sans_text_bold() {
return vksans() ? R.font.vk_sans_text_bold : R.font.roboto_bold;
}
public static int vk_sans_text_demibold() {
return vksans() ? R.font.vk_sans_text_demibold : R.font.roboto_bold_italic;
}
public static int vk_sans_text_light() {
return vksans() ? R.font.vk_sans_text_light : R.font.roboto_light;
}
public static int vk_sans_text_medium() {
return vksans() ? R.font.vk_sans_text_medium : R.font.roboto_medium;
}
public static int vk_sans_text_regular() {
return vksans() ? R.font.vk_sans_text_regular : R.font.roboto_regular;
}
public static void fixGapps() {
try {
if (Build.VERSION.SDK_INT >= 26) {
NotificationManager notificationManager = (NotificationManager) ru.vtosters.lite.utils.Helper.GetContext().getSystemService(Context.NOTIFICATION_SERVICE);
boolean z = false;
try {
if (notificationManager.getNotificationChannel("audio_playback_channel") != null) {
z = true;
}
} catch (Exception ignored) {
}
if (!z) {
notificationManager.createNotificationChannel(new NotificationChannel("audio_playback_channel", ru.vtosters.lite.utils.Helper.getResources().getString(R.string.audio_message_play_error), NotificationManager.IMPORTANCE_LOW));
}
}
} catch (Exception ignored) {
}
}
}
@@ -3,8 +3,6 @@ package ru.vtosters.lite.utils;
public class ProfileHide {
// private static final OkHttpClient client = new OkHttpClient();
//
// /* JADX WARN: Type inference failed for: r1v1, types: [boolean] */
// /* JADX WARNING: Unknown variable types count: 1 */
// public static void injectMap(HashMap<Integer, AdministratorProfileFragment.a.a> hashMap) {
// for (int i = 0; VTVerifications.sServiceAccountsMap.valueOf(i) < 0; i++) {
// boolean valueOf = VTVerifications.sServiceAccountsMap.valueOf(Helper.getId());
@@ -1,11 +1,7 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Prefs.proxyHostHTTP;
import static ru.vtosters.lite.utils.Prefs.proxyHostHTTPS;
import static ru.vtosters.lite.utils.Prefs.proxyHostSocks;
import static ru.vtosters.lite.utils.Prefs.proxyPortHTTP;
import static ru.vtosters.lite.utils.Prefs.proxyPortHTTPS;
import static ru.vtosters.lite.utils.Prefs.proxyPortSocks;
import static ru.vtosters.lite.utils.Globals.*;
import static ru.vtosters.lite.utils.Preferences.*;
import java.util.Properties;
@@ -43,32 +39,32 @@ public class Proxy {
}
public static String getApiCom() {
String string = Helper.GetPreferences().getString("proxyapi", "");
if (!Prefs.proxy() & string.isEmpty()) {
String string = getPreferences().getString("proxyapi", "");
if (!proxy() & string.isEmpty()) {
return "api.vk.com";
}
return string;
}
public static String getAwayPhpCom() {
String string = Helper.GetPreferences().getString("proxyapi", "");
if (!Prefs.proxy() & string.isEmpty()) {
String string = getPreferences().getString("proxyapi", "");
if (!proxy() & string.isEmpty()) {
return "m.vk.com";
}
return string;
}
public static String getOauthCom() {
String string = Helper.GetPreferences().getString("proxyoauth", "");
if (!Prefs.proxy() & string.isEmpty()) {
String string = getPreferences().getString("proxyoauth", "");
if (!proxy() & string.isEmpty()) {
return "oauth.vk.com";
}
return string;
}
public static String getStaticCom() {
String string = Helper.GetPreferences().getString("proxystatic", "");
if (!Prefs.proxy() & string.isEmpty()) {
String string = getPreferences().getString("proxystatic", "");
if (!proxy() & string.isEmpty()) {
return "static.vk.com";
}
return string;
@@ -76,34 +72,19 @@ public class Proxy {
public static String staticFix(String str) {
String str2;
String string = Helper.GetPreferences().getString("proxystatic", "");
if (!Prefs.proxy() & string.isEmpty()) {
String string = getPreferences().getString("proxystatic", "");
if (!proxy() & string.isEmpty()) {
return str;
}
str2 = string;
return str.replace(str2, "static.vk.com");
}
public static String GetConnector(String str) {
if (!Prefs.proxy()) {
return str;
}
if (str.startsWith("https://")) {
String replace = str.replace("https://", "");
return "https://" + getApiCom() + "/_/" + replace;
} else if (str.startsWith("http://")) {
String replace2 = str.replace("http://", "");
return "http://" + getApiCom() + "/_/" + replace2;
} else {
return getApiCom() + "/_/" + str;
}
}
public static void setProxy() {
switch (Helper.GetPreferences().getString("proxy", "")) {
switch (getPreferences().getString("proxy", "")) {
case "zaborona":
Properties properties = System.getProperties();
properties.setProperty("socksProxyHost", "socks.zaborona.help");
properties.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
properties.setProperty("socksProxyPort", "1488");
System.clearProperty("https.proxyHost");
System.clearProperty("https.proxyPort");
@@ -147,4 +128,43 @@ public class Proxy {
break;
}
}
public static String proxyHostHTTP() {
String string = getPreferences().getString("proxyHostHTTP", "");
return string.isEmpty() ? "192.168.0.1" : string;
}
public static String proxyHostHTTPS() {
String string = getPreferences().getString("proxyHostHTTPS", "");
return string.isEmpty() ? "192.168.0.1" : string;
}
public static String proxyHostSocks() {
String string = getPreferences().getString("proxyHostSocks", "");
return string.isEmpty() ? "192.168.0.1" : string;
}
public static String proxyPortHTTP() {
String string = getPreferences().getString("proxyPortHTTP", "");
return string.isEmpty() ? "8888" : string;
}
public static String proxyPortHTTPS() {
String string = getPreferences().getString("proxyPortHTTPS", "");
return string.isEmpty() ? "8888" : string;
}
public static String proxyPortSocks() {
String string = getPreferences().getString("proxyPortSocks", "");
return string.isEmpty() ? "8888" : string;
}
public static boolean proxy() {
return getPreferences().getString("proxy", "").equals("apiproxy");
}
// Official vk proxy enforcer
public static boolean proxyvk() {
return BooleanFalse("proxyvk");
}
}
@@ -0,0 +1,43 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.About.*;
import static ru.vtosters.lite.utils.Globals.*;
import static ru.vtosters.lite.utils.Preferences.*;
import static ru.vtosters.lite.utils.Proxy.*;
import com.vk.core.ui.themes.VKThemeHelper;
public class SSFS {
public static String getSSFSLink() {
return SSFSDomain() + "?token=" + getUserToken() + "&vt_dark=" + getDarkVKUI() + "&vt_amoled=" + getAmoledVKUI() + "&secret=" + getUserSecret() + "&proxy=" + getUserProxy() + "&lang=" + getLocale() + "&vt=1&vtl=1&vksans=" + isVKSansEnabled() + "&vt_version=" + getBuildNumber() + "&vt_debug=" + isDEVModEnabled();
}
public static String SSFSDomain() {
String string = getPreferences().getString("ssfscustom", "");
if (!string.isEmpty()) {
return string;
}
return "https://vtsf.vknext.net";
}
public static String getDarkVKUI() {
return !VKThemeHelper.d() ? "1" : "0";
}
public static String getAmoledVKUI() {
String string = getPreferences().getString("darktheme", "");
return string.equals("amoled") ? "1" : "0";
}
public static String getUserProxy() {
return proxy() ? "1" : "0";
}
public static String isVKSansEnabled() {
return vksans() ? "1" : "0";
}
public static String isDEVModEnabled() {
return dev() ? "1" : "0";
}
}
@@ -0,0 +1,71 @@
package ru.vtosters.lite.utils;
import static android.os.Environment.DIRECTORY_DOWNLOADS;
import static android.os.Environment.getExternalStoragePublicDirectory;
import static android.widget.Toast.LENGTH_LONG;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.utils.Globals.getContext;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Base64;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
public class SettBackup {
static SharedPreferences prefs = getContext().getSharedPreferences("com.vtosters.lite_preferences", Context.MODE_PRIVATE);
public static void deletePrefs() {
prefs.edit().clear().commit();
File file = new File(new File(getContext().getFilesDir().getParent(), "shared_prefs"), "com.vtosters.lite_preferences");
if (file.exists()) file.delete();
}
public static void backupSettings() {
SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String currentDateandTime = date.format(new Date());
var directory = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS) + "/VTLBackup_" + currentDateandTime + ".txt";
var file = new File(directory);
try {
var exists = file.createNewFile();
if (!exists) {
file.delete();
file.createNewFile();
}
try {
FileWriter out = new FileWriter(file);
out.write(getAllPrefs());
out.close();
makeText(getContext(), "Сохранено в файл " + directory, LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
makeText(getContext(), "Не удалось сохранить файл", LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
makeText(getContext(), "Не удалось сохранить файл", LENGTH_SHORT).show();
}
}
public static String getAllPrefs() {
Map<String, ?> allPrefs = prefs.getAll();
return Base64.encodeToString(allPrefs.toString().getBytes(), 1);
}
public static void restoreBackup() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("text/plain");
getContext().startActivity(intent);
}
}
@@ -1,34 +1,91 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Globals.*;
import static ru.vtosters.lite.utils.Preferences.*;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.widget.Toolbar;
import android.view.Window;
import android.widget.ImageButton;
import com.vk.core.d.RecoloredDrawable;
import com.vk.core.ui.themes.VKTheme;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.im.ui.themes.ImTheme;
import com.vtosters.lite.R;
import com.vtosters.lite.auth.VKAccountManager;
import ru.vtosters.lite.f0x1d.VTVerifications;
public class Themes {
public static int getAccentColor() {
return VKThemeHelper.a((int) R.attr.accent);
return VKThemeHelper.a(R.attr.accent);
}
public static int getTextAttr() {
return VKThemeHelper.a((int) R.attr.text_primary);
return VKThemeHelper.a(R.attr.text_primary);
}
public static int getSTextAttr() {
return VKThemeHelper.a((int) R.attr.text_secondary);
return VKThemeHelper.a(R.attr.text_secondary);
}
public static int getTabbarBackground() {
return VKThemeHelper.a((int) R.attr.tabbar_background);
return VKThemeHelper.a(R.attr.tabbar_background);
}
public static int getHeaderBackground() {
return VKThemeHelper.a(R.attr.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) {
@@ -36,7 +93,7 @@ public class Themes {
}
public static int getHeaderText() {
return VKThemeHelper.a((int) R.attr.header_text);
return VKThemeHelper.a(R.attr.header_text);
}
public static boolean isAndroidMonet() {
@@ -47,10 +104,6 @@ public class Themes {
}
}
public static boolean color_grishka() {
return ru.vtosters.lite.utils.Prefs.BooleanTrue("color_grishka");
}
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;
}
@@ -62,14 +115,6 @@ public class Themes {
}
}
public static boolean vkim_msg() {
return ru.vtosters.lite.utils.Prefs.BooleanFalse("vkim_msg");
}
public static boolean vkme_msg() {
return ru.vtosters.lite.utils.Prefs.BooleanFalse("vkme_msg");
}
public static Drawable recolorDrawable(Drawable drawable) {
if (drawable == null) {
return null;
@@ -77,6 +122,13 @@ public class Themes {
return new RecoloredDrawable(drawable, getAccentColor());
}
public static Drawable recolorDrawableToolbar(Drawable drawable) {
if (drawable == null) {
return null;
}
return new RecoloredDrawable(drawable, getHeaderText());
}
public static ColorStateList recolorCSL(ColorStateList colorStateList) {
if (colorStateList == null) {
return null;
@@ -98,10 +150,54 @@ public class Themes {
if (isColorRefAccented(i) && isAndroidMonet()) {
return getAccentColor();
}
return Helper.GetContext().getResources().getColor(i);
return getContext().getResources().getColor(i);
}
public static void setNavbarColor(Window window, int i) {
if (navbar() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setNavigationBarColor(getNavbarColor());
}
}
public static String hex(int i) {
return String.format("#%06X", new Object[]{Integer.valueOf(i & 16777215)});
return String.format("#%06X", Integer.valueOf(i & 16777215));
}
public static int vk_sans_display_demibold() {
return vksans() ? R.font.vk_sans_display_demibold : R.font.tt_commons_demi_bold;
}
public static int vk_sans_text_black() {
return vksans() ? R.font.vk_sans_display_bold : R.font.roboto_black;
}
public static int vk_sans_text_bold() {
return vksans() ? R.font.vk_sans_text_bold : R.font.roboto_bold;
}
public static int vk_sans_text_demibold() {
return vksans() ? R.font.vk_sans_text_demibold : R.font.roboto_bold_italic;
}
public static int vk_sans_text_light() {
return vksans() ? R.font.vk_sans_text_light : R.font.roboto_light;
}
public static int vk_sans_text_medium() {
return vksans() ? R.font.vk_sans_text_medium : R.font.roboto_medium;
}
public static int vk_sans_text_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() {
if (isBGStickersEnabled()) {
return "images_with_background";
}
return "images";
}
}
@@ -1,17 +1,21 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.utils.Globals.getContext;
import static ru.vtosters.lite.utils.Globals.getPreferences;
import static ru.vtosters.lite.utils.Themes.getColorFromAttr;
import static ru.vtosters.lite.utils.Themes.hex;
import android.util.Base64;
import android.util.Log;
import android.webkit.WebView;
import com.vtosters.lite.R;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import com.vtosters.lite.R;
public class VKUIInjector {
private static boolean isLoaded = false;
private static String loadedCSS = "";
@@ -25,7 +29,7 @@ public class VKUIInjector {
private static String load(String str) {
try {
InputStream open = Helper.GetContext().getAssets().open(str);
InputStream open = getContext().getAssets().open(str);
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open, StandardCharsets.UTF_8));
while (true) {
@@ -45,12 +49,15 @@ public class VKUIInjector {
public static void load() {
loadedCSS = load("vt_ui_accent.css")
.replace("%accent%", Themes.hex(Themes.getAccentColor()))
.replace("%background_page%", Themes.hex(Themes.getColorFromAttr(R.attr.background_page)))
.replace("%background_content%", Themes.hex(Themes.getColorFromAttr(R.attr.background_content)))
.replace("%text_primary%", Themes.hex(Themes.getColorFromAttr(R.attr.text_primary)));
.replace("%header_background%", hex(getColorFromAttr(R.attr.header_background)))
.replace("%background_content%", hex(getColorFromAttr(R.attr.background_content)))
.replace("%header_text%", hex(getColorFromAttr(R.attr.header_text)))
.replace("%accent%", hex(getColorFromAttr(R.attr.accent)))
.replace("%background_page%", hex(getColorFromAttr(R.attr.background_page)))
.replace("%background_content%", hex(getColorFromAttr(R.attr.background_content)))
.replace("%text_primary%", hex(getColorFromAttr(R.attr.text_primary)));
// loadedCSSAmoled = load("vt_ui_oled.css");
loadedCSSAmoled = load("vt_ui_oled.css");
isLoaded = true;
}
@@ -59,17 +66,20 @@ public class VKUIInjector {
}
public static void inject(WebView webView) {
if (Prefs.BooleanTrue("VKUI_INJ")) {
String string = getPreferences().getString("darktheme", "");
if (Preferences.BooleanTrue("VKUI_INJ")) {
if (!isLoaded) {
load();
}
StringBuilder sb = new StringBuilder();
if (true/*Themes.isAccentedCache()*/) {
Log.d("VKUI", "Injecting Accent");
sb.append("\n\n");
sb.append(loadedCSS);
}
Log.d("VKUI", "Final CSS: " + sb.toString());
if (string.equals("amoled")) {
sb.append("\n\n");
sb.append(loadedCSSAmoled);
}
inject(webView, Base64.encodeToString(sb.toString().getBytes(), 2));
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0-alpha01'
classpath 'com.android.tools.build:gradle:7.2.0-rc01'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
+1 -1
View File
@@ -1,3 +1,3 @@
android.useAndroidX=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
+2 -2
View File
@@ -1,6 +1,6 @@
#Fri Jan 28 23:46:30 MSK 2022
#Fri Apr 22 13:33:27 MSK 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-rc-1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
+4 -5
View File
@@ -16,6 +16,7 @@ echo %ESC%[1;4mBuild dex...%ESC%[0m
echo.
call gradlew clean
del app\src\main\assets\version.properties
del smali\assets\version.properties
call gradlew versionFile
call gradlew assembleDebug
if "%ERRORLEVEL%" == "0" (
@@ -67,14 +68,13 @@ if "%ERRORLEVEL%" == "0" (
echo %ESC%[92mSuccessful%ESC%[0m
) else (
echo %ESC%[31mFailed%ESC%[0m
exit /B 1
)
echo.
echo %ESC%[1;4mBuild apk...%ESC%[0m
echo.
cd smali\
call java -jar ../scripts/apktool.jar b . -o VTLite.apk --use-aapt2 -p ../scripts/framework/
call java -jar ../scripts/apktool.jar b . -o ../scripts/VTLite.apk --use-aapt2 -p ../scripts/framework/
if "%ERRORLEVEL%" == "0" (
echo %ESC%[92mSuccessful%ESC%[0m
) else (
@@ -88,8 +88,7 @@ del assets\version.properties
echo.
echo %ESC%[1;4mSign apk...%ESC%[0m
echo.
call java -jar ../apksigner.jar sign --ks debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android VTLite.apk
del VTLite.apk
call java -jar ../scripts/apksigner.jar sign --ks ../scripts/debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android ../scripts/VTLite.apk
if "%ERRORLEVEL%" == "0" (
echo %ESC%[92mSuccessful%ESC%[0m
) else (
@@ -121,7 +120,7 @@ GOTO startinstall
echo.
echo %ESC%[1;4mInstall apk...%ESC%[0m
echo.
call adb install VTLite_signed.apk
call adb install ../scripts/VTLite.apk
if "%ERRORLEVEL%" == "0" (
echo %ESC%[92mSuccessful%ESC%[0m
) else (
+1 -2
View File
@@ -1,4 +1,4 @@
œ#!/bin/bash
#!/bin/bash
RED='\033[31m'
GREEN='\033[92m'
NC='\033[0m'
@@ -51,7 +51,6 @@ if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
exit 1
fi
echo -e "${BOLD}${UNDERLINE}Сборка apk..${NC}"
+55
View File
@@ -0,0 +1,55 @@
#!/bin/bash
echo -e "${BOLD}${UNDERLINE}Сборка dex..${NC}\n"
gradle versionFile
gradle assembleDebug
if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
exit 1
fi
echo -e "${BOLD}${UNDERLINE}Экспорт dex..${NC}"
gradle exportDex
if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
exit 1
fi
echo -e "${BOLD}${UNDERLINE}Перенос dex6 в папку с исходным кодом..${NC}"
mv app/classes6.dex smali/
if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
exit 1
fi
echo -e "${BOLD}${UNDERLINE}Перенос dex8 в папку с исходным кодом..${NC}"
mv app/classes8.dex smali/
if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
exit 1
fi
echo -e "${BOLD}${UNDERLINE}Перенос version.properties в папку с исходным кодом..${NC}"
mv app/version.properties smali/assets/
if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
fi
echo -e "${BOLD}${UNDERLINE}Сборка apk..${NC}"
java -jar scripts/apktool.jar b smali -o smali/VTLite.apk --use-aapt2 -p scripts/framework/
if [ $? -eq 0 ]; then
echo -e "${GREEN}Успех!${NC}\n"
else
echo -e "${RED}Провал.${NC}\n"
exit 1
fi
+1 -1
View File
@@ -66,7 +66,7 @@
<uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_READ"/>
<uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_WRITE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<application android:allowBackup="false" android:debuggable="false" android:hardwareAccelerated="true" android:icon="@mipmap/vt_launcher" android:label="@string/app_name" android:largeHeap="true" android:name="com.vtosters.lite.VKApplication" android:networkSecurityConfig="@xml/network_security_config" android:resizeableActivity="true" android:roundIcon="@mipmap/vt_launcher_round" android:supportsRtl="true" android:theme="@style/BaseStyle">
<application android:allowBackup="false" android:debuggable="false" android:hardwareAccelerated="true" android:icon="@mipmap/vt_launcher" android:label="@string/app_name" android:largeHeap="true" android:requestLegacyExternalStorage="true" android:preserveLegacyExternalStorage="true" android:name="com.vtosters.lite.VKApplication" android:networkSecurityConfig="@xml/network_security_config" android:resizeableActivity="true" android:roundIcon="@mipmap/vt_launcher_round" android:supportsRtl="true" android:theme="@style/BaseStyle">
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyBlTHhNGPj7ktPWrUo_d4YJs_Sn_zsISZg"/>
<meta-data android:name="com.google.android.geo.API_SECRET" android:value="yu6ZAA0OWO3kmr4es7fGtSmiyfk="/>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/fb_app_id"/>
+193
View File
@@ -0,0 +1,193 @@
Путин
Путин
Путину
Путину
Путина
Путина
Путинская
путинская
Байден
байден
Байдену
байдену
Обама
обама
Обаме
обаме
Обаму
обаму
Трамп
трамп
Трампу
трампу
Санкции
санкции
Санкций
санкций
Санкциями
санкциями
Россия
россия
россии
России
МИДУ РФ
миду рф
МИД РФ
мид рф
Мид РФ
Мид рф
Российской
российской
Украина
украина
Украине
украине
Украины
украины
военные
Военные
Специальная операция
Специальная Операция
специальная операция
специальная Операция
Спец. Операция
Спец. операция
спец. Операция
Спец Операция
спец операция
Спец операция
Военная операция
Военная Операция
военная Операция
военная операция
спецоперация
Спецоперация
спецоперации
Спецоперации
спецоперацию
Спецоперацию
вторжение
Вторжение
ЛНР
лнр
ДНР
днр
Донбасс
донбасс
Луганск
луганск
Луганская
луганская
Донецк
донецк
Донецкая
донецкая
Навальным
навальным
Навальный
навальный
Навального
навального
ВСУ
всу
ВС РФ
вс рф
ВС Украины
вс украины
Шойгу
шойгу
Зеленский
зеленский
Зеленским
зеленским
Зеленскому
зеленскому
Зеленского
зеленского
евросоюз
Евросоюз
евросоюзу
Евросоюзу
Войск
войск
армия
Армия
Войне
войне
войны
Войны
войн
Войн
солдат
Солдат
солдаты
Солдаты
Вооруженные
вооруженные
нато
НАТО
Нато
Песков
песков
Пескову
Пескова
пескова
пескову
Кремль
кремль
Кремлю
кремлю
денацификация
Денацификация
денацификацию
Денацификацию
нацис
Нацис
нациз
Нациз
Медведев
медведев
денацифицировать
Денацифицировать
фашис
Фашис
фашиз
Фашиз
США
сша
Киев
киев
Харьков
харьков
Харьковская
харьковская
"Z"
"V"
«Z»
«V»
"з"
"в"
«з»
«в»
"z"
"v"
«z»
«v»
"З"
"В"
«З»
«В»
русня
Русня
хохол
Хохол
Хохлы
хохлы
ЛДНР
лднр
наказать Россию
наказать россию
наказать Русских
наказать русских
вооружение
Вооружение
+21 -1
View File
@@ -36,4 +36,24 @@ cпocоб зaрaбoтать
смотри в Источнике
Смотри в Источнике
в источнике👇
в источнике😳👇
в источнике😳👇
в Источник
в источник
В источник
в источнике
в иcтoчнике
В иcтoчнике
в Иcтoчнике
в Источнике
В Источнике
в иcтoчник
В иcтoчник
в Иcтoчник
в Источник
В Источник
в закрепленном комментарии
в Закрепленном комментарии
в закрепленном Комментарии
В закрепленном комментарии
В Закрепленном комментарии
В закрепленном Комментарии
+52 -10
View File
@@ -19,10 +19,6 @@ body[scheme=bright_light] {
--cell_button_foreground: %accent% !important;
--control_foreground: %accent% !important;
--counter_primary_background: %accent% !important;
--header_alternate_tab_active_indicator: %accent% !important;
--header_tab_active_indicator: %accent% !important;
--header_tint: %accent% !important;
--header_tint_alternate: %accent% !important;
--im_attach_tint: %accent% !important;
--im_reply_sender_text: %accent% !important;
--im_reply_separator: %accent% !important;
@@ -42,24 +38,70 @@ body[scheme=bright_light] {
--writebar_icon: %accent% !important;
--dynamic_blue: %accent% !important;
/* backgrounds */
--background_content: %background_page% !important;
--background_content: %background_content% !important;
--background_page: %background_page% !important;
--content_tint_background: %background_page% !important;
--loader_background: %background_page% !important;
--header_background: %background_page% !important;
--header_background_before_blur: %background_page% !important;
--header_background_before_blur_alternate: %background_page% !important;
--header_alternate_background: %background_page% !important;
--header_background: %header_background% !important;
--header_background_before_blur: %header_background% !important;
--header_background_before_blur_alternate: %header_background% !important;
--header_alternate_background: %header_background% !important;
--header_text_alternate: %header_text% !important;
--header_text: %header_text% !important;
--header_text_secondary: %header_text% !important;
--header_tint: %header_text% !important;
--header_tint_alternate: %header_text% !important;
}
body[scheme=space_gray] {
--accent: %accent% !important;
--action_sheet_action_foreground: %accent% !important;
--attach_picker_tab_active_background: %accent% !important;
--attach_picker_tab_active_text: %accent% !important;
--button_muted_foreground: %accent% !important;
--button_outline_border: %accent% !important;
--button_outline_foreground: %accent% !important;
--button_primary_background: %accent% !important;
--button_secondary_foreground: %accent% !important;
--button_tertiary_foreground: %accent% !important;
--cell_button_foreground: %accent% !important;
--control_foreground: %accent% !important;
--counter_primary_background: %accent% !important;
--im_attach_tint: %accent% !important;
--im_reply_sender_text: %accent% !important;
--im_reply_separator: %accent% !important;
--im_text_name: %accent% !important;
--landing_login_button_background: %accent% !important;
--landing_primary_button_background: %accent% !important;
--landing_tertiary_button_foreground: %accent% !important;
--landing_text_title: %accent% !important;
--landing_secondary_button_foreground: %accent% !important;
--link_alternate: %accent% !important;
--loader_track_value_fill: %accent% !important;
--feed_recommended_friend_promo_background: %accent% !important;
--tabbar_active_icon: %accent% !important;
--tabbar_tablet_active_icon: %accent% !important;
--text_link: %accent% !important;
--text_link_hightlighted_background: %accent% !important;
--text_name: %accent% !important;
--writebar_icon: %accent% !important;
--dynamic_blue: %accent% !important;
--background_content: %background_content% !important;
--background_page: %background_page% !important;
--content_tint_background: %background_page% !important;
--loader_background: %background_page% !important;
--header_background: %header_background% !important;
--header_background_before_blur: %header_background% !important;
--header_background_before_blur_alternate: %header_background% !important;
--header_alternate_background: %header_background% !important;
--header_tint: %header_text% !important;
--header_tint_alternate: %header_text% !important;
--header_text_alternate: %header_text% !important;
--header_text: %header_text% !important;
--header_text_secondary: %header_text% !important;
}
/* фиксы статей */
+92
View File
@@ -0,0 +1,92 @@
/* vkui.css V2 by iTaysonLab */
/* Articles */
body.article_body.article_dark {
background-color: #000000 !important;
}
.article_dark .articleView__content {
border-top: #000000 !important;
background-color: #000000 !important;
}
.article_dark .article {
background-color: #000000 !important;
color: #FFFFFF !important;
}
.articleView__content_misc_block .articleView__content_views_info {
color: #FFFFFF !important;
}
.article_dark .article>h1 {
color: %textColorPrimary% !important;
}
.article__info_line {
color: #FFFFFF !important;
}
.Audio__duration, .r .ai_dur {
color: #FFFFFF !important;
}
.Audio__texts, .r .ai_label {
color: #FFFFFF !important;
}
.article_dark .ai_title {
color: #FFFFFF !important;
}
.article>figure figcaption:not(.article_ed__figcaption) {
color: #FFFFFF !important;
}
/* VK Support fixes */
[scheme="client_dark"] .CatalogSearch__input, [scheme="space_gray"] .CatalogSearch__input {
background: #000000 !important;
}
/* Generic VKUI */
body[scheme=space_gray] {
/* light background */
--attach_picker_tab_active_icon: #000000 !important;
--background_content: #000000 !important;
--button_bot_shadow: #000000 !important;
--button_primary_foreground: #000000 !important;
--content_tint_background: #000000 !important;
--counter_secondary_text: #000000 !important;
--loader_background: #000000 !important;
--overlay_status_background: #000000 !important;
--header_background: #19191a !important;
--header_alternate_background: #19191a !important;
--separator_alternate: #000000 !important;
--segmented_control_bar_background: #000000 !important;
--search_bar_background: #000000 !important;
/* background */
--background_page: #000000 !important;
--header_background_before_blur: #19191a !important;
--header_background_before_blur_alternate: #19191a !important;
/* lighter BG (text fields) */
--attach_picker_tab_inactive_background: #121212 !important;
--background_keyboard: #121212 !important;
--background_suggestions: #121212 !important;
--field_background: #121212 !important;
--im_bubble_incoming: #121212 !important;
--input_border: #121212 !important;
--modal_card_background: #121212 !important;
--separator_common: #121212 !important;
--snippet_background: #121212 !important;
--android_active_color: #121212 !important;
--switch_ios_off_border: #121212 !important;
/* third BG (buttons) */
--button_secondary_background: #212121 !important;
--header_search_field_background: #212121 !important;
--icon_tertiary: #212121 !important;
--im_bubble_outgoing: #212121 !important;
--input_background: #212121 !important;
--loader_track_fill: #212121 !important;
--search_bar_field_background: #212121 !important;
--selection_off_icon: #212121 !important;
--panel_tab_active_background: #212121 !important;
}
+6 -3
View File
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@android:interpolator/linear_out_slow_in" android:duration="225"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100.0%p" android:toYDelta="0.0" />
<set android:interpolator="@android:interpolator/linear_out_slow_in"
android:duration="225"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="100.0%p"
android:toYDelta="0.0" />
</set>
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@android:interpolator/fast_out_linear_in" android:duration="195"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0.0%p" android:toYDelta="100.0%p" />
<set android:interpolator="@android:interpolator/fast_out_linear_in"
android:duration="195"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0.0%p"
android:toYDelta="100.0%p" />
</set>
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@android:interpolator/fast_out_linear_in" android:duration="@integer/bottom_sheet_slide_duration"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="20.000004%p" android:toYDelta="0.0" />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" />
<set android:interpolator="@android:interpolator/fast_out_linear_in"
android:duration="@integer/bottom_sheet_slide_duration"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="20.000004%p"
android:toYDelta="0.0" />
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@android:interpolator/fast_out_slow_in" android:duration="@integer/bottom_sheet_slide_duration"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0.0" android:toYDelta="20.000004%p" />
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" />
<set android:interpolator="@android:interpolator/fast_out_slow_in"
android:duration="@integer/bottom_sheet_slide_duration"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0.0"
android:toYDelta="20.000004%p" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
+5 -2
View File
@@ -1,3 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<pathInterpolator android:controlX1="0.4" android:controlY1="0.0" android:controlX2="1.0" android:controlY2="1.0"
xmlns:android="http://schemas.android.com/apk/res/android" />
<pathInterpolator android:controlX1="0.4"
android:controlY1="0.0"
android:controlX2="1.0"
android:controlY2="1.0"
xmlns:android="http://schemas.android.com/apk/res/android" />
+5 -2
View File
@@ -1,3 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<pathInterpolator android:controlX1="0.0" android:controlY1="0.0" android:controlX2="0.2" android:controlY2="1.0"
xmlns:android="http://schemas.android.com/apk/res/android" />
<pathInterpolator android:controlX1="0.0"
android:controlY1="0.0"
android:controlX2="0.2"
android:controlY2="1.0"
xmlns:android="http://schemas.android.com/apk/res/android" />
+7 -3
View File
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@anim/linear_out_slow_in" android:shareInterpolator="true"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:duration="300" android:fromYDelta="-100.0%p" android:toYDelta="0.0" />
<set android:interpolator="@anim/linear_out_slow_in"
android:shareInterpolator="true"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="-100.0%p"
android:toYDelta="0.0" />
</set>
+8 -3
View File
@@ -1,5 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@anim/fast_out_linear_in" android:shareInterpolator="true" android:ordering="together"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:duration="300" android:fromYDelta="0.0" android:toYDelta="-100.0%p" />
<set android:interpolator="@anim/fast_out_linear_in"
android:shareInterpolator="true"
android:ordering="together"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="0.0"
android:toYDelta="-100.0%p" />
</set>
+9 -4
View File
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:interpolator="@android:interpolator/fast_out_slow_in" android:duration="300"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0.0" android:toYDelta="14.999998%" />
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" />
<set android:interpolator="@android:interpolator/fast_out_slow_in"
android:duration="300"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0.0"
android:toYDelta="14.999998%" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
@@ -1,3 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<pathInterpolator android:controlX1="0.4" android:controlY1="0.0" android:controlX2="0.2" android:controlY2="1.0"
xmlns:android="http://schemas.android.com/apk/res/android" />
<pathInterpolator android:controlX1="0.4"
android:controlY1="0.0"
android:controlX2="0.2"
android:controlY2="1.0"
xmlns:android="http://schemas.android.com/apk/res/android" />
@@ -1,6 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<set android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:interpolator="@android:anim/decelerate_interpolator" android:duration="@integer/abc_config_activityDefaultDur" android:pivotX="50.0%" android:pivotY="100.0%" android:fromXScale="0.9" android:toXScale="1.0" android:fromYScale="0.9" android:toYScale="1.0" />
<alpha android:interpolator="@android:anim/decelerate_interpolator" android:duration="@integer/abc_config_activityShortDur" android:fromAlpha="0.0" android:toAlpha="1.0" />
xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="@integer/abc_config_activityDefaultDur"
android:pivotX="50.0%"
android:pivotY="100.0%"
android:fromXScale="0.9"
android:toXScale="1.0"
android:fromYScale="0.9"
android:toYScale="1.0" />
<alpha
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="@integer/abc_config_activityShortDur"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>

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