Compare commits

...
1649 Commits
Author SHA1 Message Date
k1zn d678ff5e9b translate 2022-10-14 19:35:37 +05:00
gdlbo 4829acd869 fix slow stickers load + some imp 2022-10-14 00:43:17 +03:00
gdlbo 6df6fdf01c miniapps ban 2022-10-14 00:08:23 +03:00
k1zn 4a2e73d676 fix context crash 2022-10-13 21:44:37 +05:00
aliveoutside 4c5a1c5a17 download track synchronously 2022-10-13 03:17:17 +03:00
aliveoutside 1aedacf401 remove useless ffmpeg banner in logs 2022-10-13 03:17:05 +03:00
aliveoutside 9d4bffd8aa use an executor to download tracks 2022-10-13 02:52:23 +03:00
aliveoutside ede17b31a2 move vkexecutors receiving to separate package 2022-10-13 02:52:23 +03:00
aliveoutside e94f93facb update telegram stickers entry icons 2022-10-13 02:52:23 +03:00
gdlbo 2460b27af1 Update LastFMScrobbler.java 2022-10-12 23:59:50 +03:00
gdlbo 9cb9bf4167 max quality for external videos 2022-10-12 22:04:08 +03:00
gdlbo 6753dc9a8c superapp restart app 2022-10-12 21:34:05 +03:00
gdlbo c257e3a5ce refactored video alert adapter 2022-10-12 21:28:02 +03:00
k1zn a055656424 в 2022-10-12 18:30:06 +05:00
k1zn 4882315bf4 another translate 2022-10-12 18:27:31 +05:00
k1zn 1d8f998a5f translate 2022-10-12 18:08:13 +05:00
k1zn ff945b76b8 fix localization bug 2022-10-12 17:50:34 +05:00
gdlbo 2d14c78a90 fixed some long titles 2022-10-12 03:13:52 +03:00
gdlbo 10d1a40bd8 some code imp 2022-10-12 02:35:36 +03:00
gdlbo 78e3757cf4 deleted unused code 2022-10-12 01:58:02 +03:00
gdlbo 2aef797efe some dev fixes 2022-10-12 01:24:50 +03:00
gdlbo 20999810ab fixed load verifs from notif 2022-10-12 00:48:03 +03:00
gdlbo d8c45ffeff fix #695 2022-10-12 00:33:40 +03:00
gdlbo 05d339eeb0 fix #695 2022-10-12 00:29:01 +03:00
gdlbo e50366da8a added #701 2022-10-12 00:02:53 +03:00
gdlbo 915b31477b fix 700 2022-10-11 23:50:15 +03:00
aliveoutside 9d2878b9dc revert "fixed redundant thread creation" b9a55799
it breaks Telegram stickers downloading, we'll investigate later
2022-10-09 15:54:26 +03:00
gdlbo bcfefe777d fix executer 2022-10-09 01:38:47 +03:00
k1zn b69e55606a fix some mistake 2022-10-09 02:32:17 +05:00
k1zn 2f06d2a008 refactoring autocache code 2022-10-09 02:31:08 +05:00
aliveoutside d151d27063 fix #831 2022-10-09 00:23:35 +03:00
gdlbo ad128f1e7e Update OTADownloader.java 2022-10-08 23:52:22 +03:00
gdlbo efe8a2c883 fix toast dl dialogs 2022-10-08 23:11:19 +03:00
aliveoutside 5def26131b [foaf] fix regexes and run the dialog from ui thread 2022-10-08 23:06:53 +03:00
gdlbo a586e4e240 Update FoafBase.java 2022-10-08 22:46:31 +03:00
Vologhat 5e66a5b924 Merge branch 'main' of https://github.com/vtosters/lite 2022-10-08 20:54:54 +03:00
Vologhat 98a58c9e94 regenerated R.java and public.xml, replaced getIdentifier calls to id constants 2022-10-08 20:54:18 +03:00
aliveoutside baba2c0009 [music] download playlist synchronously 2022-10-08 17:45:36 +03:00
aliveoutside 2ae3f48d9a [music] move temp tses dir to app internal storage 2022-10-08 17:45:36 +03:00
k1zn 9e5eae49d1 remove shadow from attachments 2022-10-08 19:19:36 +05:00
Vologhat 9e50a116ef Merge pull request #824 from zelvalea/main
Чрезмерное создание потоков
2022-10-08 14:23:37 +03:00
Vologhat 19fb86ca58 refactored last.fm scrobbler 2022-10-08 10:37:47 +03:00
zelva e7db1e2359 cleanup and fixed unwanted races 2022-10-07 14:42:04 +03:00
aliveoutside bc25be1a27 Merge pull request #823 from vtosters/gettext-removing
remove clipdata$item gettext
2022-10-07 12:21:58 +03:00
k1zn a583c98f44 fix renaming app bug 2022-10-06 18:24:57 +05:00
gdlbo d40162caa1 disabled auto theme for non milk users 2022-10-05 20:57:15 +03:00
Sunmisc 5bc4451355 cleanup 2022-10-05 16:22:20 +03:00
Sunmisc b62de5b90e cleanup 2022-10-05 16:21:59 +03:00
Sunmisc e79322a18c cleaned up and got rid of deprecated class 2022-10-05 16:16:34 +03:00
Sunmisc b9a55799fe fixed redundant thread creation 2022-10-05 15:49:25 +03:00
gdlbo 9ba210e166 fixed crash 2022-10-05 15:33:34 +03:00
k1zn eab3549ff9 remove clipdata$item gettext 2022-10-05 16:58:25 +05:00
Vologhat 98bbdf872b returned alert dialog for disabling Doze and refactored code 2022-10-04 00:51:16 +03:00
Vologhat d17e4849eb remove comment 2022-10-04 00:28:34 +03:00
Vologhat 18709ac89f added permission in AndroidManifest.xml for ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS flag 2022-10-04 00:27:50 +03:00
gdlbo 9de8e3e409 newsfeed notif counter feature 2022-10-03 23:53:59 +03:00
gdlbo 3f3d1c7f28 Update DisableBattery.java 2022-10-03 22:59:55 +03:00
gdlbo 5250ba39d2 Update ContactsUtils.java 2022-10-03 22:59:48 +03:00
gdlbo ae08e57c80 magic fix 2022-10-03 21:29:04 +03:00
gdlbo 2f24eb6145 Update README.md 2022-10-03 20:28:43 +03:00
Denis 88fa60fcfb Update README.md 2022-10-03 20:19:28 +03:00
Denis df2d5ceb12 Update README.md 2022-10-03 20:19:28 +03:00
Denis f2bc275430 Update README.md 2022-10-03 20:19:28 +03:00
Denis fbf7a3520b Update README.md 2022-10-03 20:19:28 +03:00
Denis 510952913b Update features.md 2022-10-03 20:19:28 +03:00
Denis 39c05533d0 Create features.md 2022-10-03 20:19:28 +03:00
gdlbo 4f7d00b0a0 fixed saving pics...? 2022-10-03 19:53:33 +03:00
k1zn 12e9c14838 Update README.md 2022-10-03 20:17:31 +05:00
k1zn 072fd007ca Update README.md 2022-10-03 19:57:43 +05:00
k1zn 002bf7e155 Update README.md 2022-10-03 19:55:17 +05:00
gdlbo 1a8da81f1e added settings tab name in tabbar 2022-10-03 11:56:51 +03:00
gdlbo 4ca5f7d2c5 fixed def system theme val 2022-10-03 11:45:41 +03:00
gdlbo 4bcbaf0d7a Update Scrobbler.java 2022-10-03 02:59:31 +03:00
gdlbo eb95b8f41e fixed autocaching 2022-10-03 02:12:44 +03:00
gdlbo f77fb0152e fixed caching path 2022-10-03 01:27:40 +03:00
gdlbo 528736a18e fixed crash 2022-10-03 01:22:46 +03:00
Pavel f00084692f songs -> tracks, new cache playlist cover 2022-10-02 21:51:52 +05:00
Pavel 901b6b5cf8 update cache playlist cover 2022-10-02 21:51:52 +05:00
aliveoutside a4711ffd4b [music] remove duplicate notification about track caching 2022-10-02 19:45:10 +03:00
aliveoutside aacfad3122 [music] fix "Unable to play track" if album is null 2022-10-02 19:32:12 +03:00
aliveoutside e53f1efc2d [music] scrobble album if it is not empty 2022-10-02 19:28:07 +03:00
aliveoutside 8e85844bd3 [music] insert the cached track only if it not in database, else ignore 2022-10-02 18:41:47 +03:00
aliveoutside a5ac9f35e7 [music] don't cache the track if it is cached already 2022-10-02 18:29:35 +03:00
gdlbo 65244f254a Update SystemInfo.java 2022-10-01 23:08:24 +03:00
gdlbo 88c150fcfc some music cache imp 2022-10-01 19:02:25 +03:00
k1zn a0b23f8590 return notif counter for newsfeed (on milkshake) 2022-10-01 17:44:39 +05:00
gdlbo d4cebf403a added cached playlist in online 2022-09-30 21:03:34 +03:00
Erik Kiznov 86ab876cff update logos link in readme 2022-09-29 23:45:42 +05:00
Erik Kiznov 2c69214210 newsfeed - default value "recent" 2022-09-29 23:21:59 +05:00
Erik Kiznov 1cfc61d6f5 fix null str in friends requests 2022-09-29 22:29:41 +05:00
gdlbo 29a98e6360 fixed crash 2022-09-29 20:25:44 +03:00
Erik Kiznov 01a8be4e18 hide "user_message" in friend request item 2022-09-29 18:58:22 +05:00
Erik Kiznov 2c3415839e Update FriendsGetRequests$a.smali 2022-09-29 18:41:21 +05:00
gdlbo 0c3d7f1d73 fixes detection 2022-09-28 17:45:01 +03:00
gdlbo 576999b582 added device info frag + fixed miui detection 2022-09-28 17:40:37 +03:00
gdlbo 0af6f8166d Update Preferences.java 2022-09-27 21:27:30 +03:00
gdlbo 750c166961 Update Preferences.java 2022-09-27 21:25:11 +03:00
Vologhat 4d7d5ea125 "getprop" execution to reflection replacement for reason XIAOMI 2022-09-27 21:21:41 +03:00
Vologhat c8e6468068 fix xiaomi shit (maybe) 2022-09-27 20:50:54 +03:00
gdlbo 00fdbe371f some imp 2022-09-27 20:25:42 +03:00
Vologhat b6f8707a60 added one ui check and miui ui version info 2022-09-27 19:03:04 +03:00
gdlbo 3be07cb211 some themes ref 2022-09-27 18:27:24 +03:00
Vologhat cfed0a59ff code refactoring 2 2022-09-27 17:23:52 +03:00
Vologhat 8080cad8c9 code refactoring 2022-09-27 17:15:46 +03:00
Pavel 60afca9f4d Normal elements positioning in settings 2022-09-27 14:31:10 +03:00
gdlbo 665516944e themes imp 2022-09-27 11:41:21 +03:00
Vologhat ecce32bfe7 fixed fucking alert dialog 2022-09-25 20:56:39 +03:00
Vologhat ae059dadfe refactored vk alert dialog and imagine array adapter 2022-09-25 20:51:30 +03:00
Vologhat 2be8c6a11a refactored vk alert dialog and imagine array adapter 2022-09-25 20:02:03 +03:00
Erik Kiznov 0447c580e4 remove "do not get ads" 2022-09-24 23:22:08 +05:00
Erik Kiznov 291097e852 Update NewsfeedHook.java 2022-09-24 23:01:02 +05:00
Denis 8c7d103be7 Update README.md
Добавил нововведения
2022-09-24 18:01:32 +05:00
Vologhat 427653a796 fixed alert dialogs 2022-09-24 05:00:20 +03:00
gdlbo 0044771a06 fix notif appname 2022-09-23 16:44:12 +03:00
gdlbo 9eb0231e1a cleanup code 2022-09-23 16:30:49 +03:00
gdlbo 83178cbd6c fixed ios def icons colors mb 2022-09-23 15:26:42 +03:00
gdlbo 9c0c27d16b caching playlists 2022-09-23 14:54:12 +03:00
Erik Kiznov 70d597f6e8 fix ios writebar attach (mb) 2022-09-23 11:23:12 +05:00
Erik Kiznov 990e2f3e09 Revert "im_ic_attach → im_ic_add_circle"
This reverts commit fb524186d1.
2022-09-23 11:21:10 +05:00
Erik Kiznov 3d4be416d8 mediacontent 2022-09-22 23:12:07 +05:00
gdlbo 11d12fc397 fix caching 2022-09-22 21:01:26 +03:00
gdlbo caf70b72b5 fix compiling 2022-09-22 20:09:05 +03:00
gdlbo f6d860c439 Merge remote-tracking branch 'origin/music'
# Conflicts:
#	app/src/main/java/ru/vtosters/lite/ui/fragments/MediaFragment.java
#	app/src/main/java/ru/vtosters/lite/utils/ContactsUtils.java
#	app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java
#	smali/res/values-ru/strings.xml
#	smali/res/values/strings.xml
2022-09-22 19:51:52 +03:00
gdlbo 7d99f06053 Update build.gradle 2022-09-22 19:47:05 +03:00
Erik Kiznov b4e260d7cb [music] translate app error string 2022-09-21 23:50:32 +05:00
Erik Kiznov 46281102cb fix get current activity (maybe) 2022-09-21 23:35:44 +05:00
gdlbo b237ec034a some null checks 2022-09-21 21:13:22 +03:00
Erik Kiznov bfae3b5a7d [music] translate strings 2022-09-21 23:05:01 +05:00
gdlbo 5311aa0fb9 speedup db cache cleaning + some imp 2022-09-21 20:50:02 +03:00
gdlbo 2dd61e4cce deleted useless buttons in mbsh 2022-09-21 20:36:34 +03:00
gdlbo 63b97d280b vkx playlist caching 2022-09-20 20:25:23 +03:00
aliveoutside 529d4afb3b [music] download mp3 via VK X if integration is enabled 2022-09-20 19:50:23 +03:00
aliveoutside d2de67bcc3 [music] support subtitles 2022-09-20 19:03:06 +03:00
aliveoutside d02d6ceac1 [music] use callback onfailure 2022-09-20 19:03:06 +03:00
gdlbo 4ac4ae03f1 Update MusicNotificationBuilder.java 2022-09-19 22:48:35 +03:00
gdlbo 4534ed1156 caching/downloading own music (without playlists) 2022-09-19 22:14:55 +03:00
aliveoutside c18bdb3abb [music] playlist caching 2022-09-19 20:11:43 +03:00
inotflying fb524186d1 im_ic_attach → im_ic_add_circle 2022-09-19 17:27:58 +03:00
aliveoutside 827f10392f [music] use executorservice in download playlist hook
so it won't freeze the ui
2022-09-19 15:31:40 +03:00
aliveoutside 105f2c76c0 [music] support playlists with more than 1000 tracks 2022-09-19 14:56:56 +03:00
aliveoutside 2e6617ec83 [music] [PlaylistConverter] add track to playlist only if it has a vaild download url 2022-09-19 13:58:23 +03:00
gdlbo 8806f36182 ios writebar lol 2022-09-18 22:09:48 +03:00
aliveoutside 07ca91d8a2 [music] move notifySavingToCache to MusicNotificationBuilder 2022-09-18 18:59:19 +03:00
aliveoutside 4443f69056 [music] move callback and notification builders to their own packages 2022-09-18 18:59:19 +03:00
gdlbo 4cc0b04b68 Delete VKListHelper.java 2022-09-18 18:55:12 +03:00
gdlbo 89f2e7cf51 Update MusicBottomSheetHook.java 2022-09-18 18:42:12 +03:00
aliveoutside 8b36fea7a5 [music] fix track caching 2022-09-18 18:35:48 +03:00
aliveoutside e5848f2f91 [music] remove hardcoded track name in M3UDownloader 2022-09-18 18:29:20 +03:00
Erik Kiznov 5448b2f27e [music] translate notification text 2022-09-18 19:48:25 +05:00
Erik Kiznov 253b3bdcb9 [main] translate video history error
this commit is already in c3a17ca4ca (music branch)
2022-09-18 13:57:24 +05:00
Erik Kiznov c3a17ca4ca [music] translate all strings 2022-09-18 13:54:55 +05:00
Erik Kiznov 4cf7422997 [main] translate all strings 2022-09-18 13:05:18 +05:00
Erik Kiznov 270fca127b [main] translate all strings 2022-09-18 13:00:15 +05:00
aliveoutside 8b614f786d 100% fix crash on start 2022-09-18 00:54:22 +03:00
Vologhat 415d3fb3a7 added thumbnails support for music cache 2022-09-18 00:35:49 +03:00
Vologhat 593086d3b1 fixed ffmpeg convertation 2022-09-17 21:53:38 +03:00
aliveoutside f3fda343d2 potentially fix crash on start related to system theme changer 2022-09-17 21:49:33 +03:00
gdlbo 6633eb8f60 some caching stuff 2022-09-17 20:51:40 +03:00
gdlbo 65d66007e0 auto caching 2022-09-17 20:24:18 +03:00
aliveoutside 9763f54bf5 [music] use double quotes instead of single quotes in ffmpeg 2022-09-17 20:23:46 +03:00
aliveoutside 6be6b5c714 [music] fix after merge 2022-09-17 20:23:46 +03:00
aliveoutside f7c4663329 [music] move notification callback outside of PlaylistDownloader 2022-09-17 20:23:45 +03:00
gdlbo 03c19bc9cf delete from cache 2022-09-17 20:09:32 +03:00
gdlbo c27410d359 caching.... 2022-09-17 20:03:27 +03:00
gdlbo 00dda2141b cache lol 2022-09-17 20:03:14 +03:00
aliveoutside 68c3a1d137 [music] make PlaylistDownloader more generic 2022-09-17 19:25:16 +03:00
aliveoutside e60ab4a54e [music] some docs for TrackDownloader 2022-09-17 19:25:04 +03:00
gdlbo d9d57428ce cache files impl 2022-09-17 18:45:39 +03:00
aliveoutside 78d30f9546 [music] The refactoring
one class should only do a one thing and do it great
2022-09-17 18:45:22 +03:00
gdlbo db1b95b15a disabled cache file path 2022-09-17 18:21:31 +03:00
gdlbo d27c191800 Fixed unpl songs 2022-09-17 17:00:43 +03:00
gdlbo 682d9bdef1 empty cache 2022-09-17 16:43:57 +03:00
gdlbo 6f3565a4e3 Update MusicBottomSheetHook.java 2022-09-17 16:10:20 +03:00
gdlbo a7e70dabe5 fix vkx caching 2022-09-17 16:06:27 +03:00
gdlbo d602766fc4 Merge remote-tracking branch 'origin/main' into music 2022-09-17 15:14:05 +03:00
gdlbo 5c95ae3dd0 fixCTX 2022-09-17 15:13:40 +03:00
gdlbo 0e354123fc new cache btn 2022-09-17 14:54:58 +03:00
gdlbo db51fb01c0 added caching vkx music from app 2022-09-17 01:53:52 +03:00
gdlbo cfdf283457 fixes 2022-09-17 01:25:58 +03:00
gdlbo 724e8b9308 some buttons inject 2022-09-17 01:06:19 +03:00
iTaysonLab 46a05c916c add separate playlist support 2022-09-16 22:37:17 +02:00
iTaysonLab c814a1b384 logs 2022-09-16 22:04:00 +02:00
aliveoutside d1eed0fbd5 do not reapply theme on every config change 2022-09-16 23:01:31 +03:00
iTaysonLab 6faa7dbb74 Merge branch 'music' of https://github.com/vtosters/lite into music 2022-09-16 21:50:22 +02:00
iTaysonLab 57e8c32629 Implement libvkx playlist injecting 2022-09-16 21:49:24 +02:00
aliveoutside 9b6425442a refactor converter code a bit 2022-09-16 21:50:01 +03:00
gdlbo 025f582f6a getTracksInPlaylist 2022-09-16 21:40:50 +03:00
gdlbo 2dec7b28f4 vkx lib update + vkx cache dev 2022-09-16 20:16:20 +03:00
gdlbo 30886adc62 fix strange crash 2022-09-16 18:59:48 +03:00
gdlbo 761d32dab6 logs 2022-09-16 17:08:35 +03:00
gdlbo 7dbebc1cd1 Update PlaylistHelper.java 2022-09-16 16:43:04 +03:00
gdlbo dd6c793979 Merge remote-tracking branch 'origin/main' into music 2022-09-16 16:11:04 +03:00
aliveoutside c441823d94 use new catalog for artist search
fixes #745
2022-09-16 15:45:39 +03:00
aliveoutside 090c82dd40 append id3 tags to downloaded tracks 2022-09-16 13:03:56 +03:00
aliveoutside a7a5a3cd4c add coreLibraryDesugaring so we can use some cool java apis
https://developer.android.com/studio/write/java8-support#library-desugaring
2022-09-16 13:03:40 +03:00
aliveoutside 0e36807bd6 Merge branch 'main' into music 2022-09-16 00:46:15 +03:00
aliveoutside 24c41e5a6d bypass android notification updates rate limits 2022-09-16 00:37:08 +03:00
aliveoutside 22e12b6422 close streams in IOUtils 2022-09-16 00:13:09 +03:00
gdlbo 0efdefb207 ThemeChanging meme 2022-09-15 23:57:20 +03:00
aliveoutside 80d2045fbb update build.gradle 2022-09-15 23:51:18 +03:00
aliveoutside 7bb0d69a96 parallel .ts downloading 2022-09-15 23:43:42 +03:00
aliveoutside 96d71394fd merge .ts files more properly
use copying instead of recoding merged .ts to mp3

fixes #688
fixes #630
2022-09-15 23:41:05 +03:00
aliveoutside 371f9ae4a6 what the fuck? @Vologhat 2022-09-15 22:51:25 +03:00
gdlbo b439165246 fixed icon + vkx playlists playing 2022-09-15 21:35:50 +03:00
gdlbo 07eefdcea9 playlist bs inj + fix getTrackFile 2022-09-15 21:02:38 +03:00
aliveoutside 9d8533e066 fix external video player 2022-09-15 20:30:27 +03:00
gdlbo 37f39f29ab Merge remote-tracking branch 'origin/main' into music 2022-09-15 19:47:59 +03:00
gdlbo 84d2d583a3 fix crash for applying theme 2022-09-15 19:46:27 +03:00
aliveoutside f2c73c6ede [music] speed up downloading like 100x times 2022-09-15 19:40:16 +03:00
aliveoutside 59e92e30f2 [music] merge .ts files with Java:
using Java NIO on android O+
using FileOutputStream on older androids
2022-09-15 19:19:46 +03:00
aliveoutside be1bc8efbb remove gridmedia from recommendations 2022-09-15 18:58:53 +03:00
gdlbo ac0206f5ab Merge branch 'main' into music
# Conflicts:
#	app/src/main/java/ru/vtosters/lite/music/MP3Downloader.java
2022-09-15 18:42:31 +03:00
gdlbo e576fa0be5 powersave flex 2022-09-15 18:05:31 +03:00
gdlbo 1e0e432d57 Update ContactsUtils.java 2022-09-15 17:24:35 +03:00
gdlbo 3a1c93d4d0 fix params media frag 2022-09-15 16:46:49 +03:00
gdlbo 378e6192c7 hide system anims 2022-09-15 16:38:29 +03:00
gdlbo 67d0a4c88d added dialog for clear vid history 2022-09-15 16:28:44 +03:00
gdlbo d59297d348 deleted old video frag 2022-09-15 16:15:55 +03:00
gdlbo 1da12a02b6 Create update_jars_brew.sh 2022-09-15 15:58:39 +03:00
gdlbo 9ceee0b3d9 disabled anim sett for a13 2022-09-15 15:56:45 +03:00
aliveoutside 281b4d9773 allow to change order of telegram stickers 2022-09-15 00:34:48 +03:00
aliveoutside 18714288d7 partially fix contacts import 2022-09-14 00:24:12 +03:00
aliveoutside 8ac098e4f8 Merge pull request #739
Remove old music catalog
2022-09-13 22:02:24 +03:00
inotflying eda5ab139e Remove old music catalog 2022-09-13 20:23:50 +03:00
gdlbo ab3221cc01 getInfo -> execute + VKMeHandler codebase 2022-09-11 14:31:58 +03:00
gdlbo 92d4ff2027 tablet fixes 2022-09-11 02:35:59 +03:00
gdlbo cedf5d263a tablet fixes 2022-09-11 02:29:47 +03:00
gdlbo 08909baf2f no shopping anymore 2022-09-11 02:01:36 +03:00
gdlbo 383bafae92 fixed splash 2022-09-11 01:54:03 +03:00
gdlbo c2661e11ec Update JsonInjectors.java 2022-09-11 01:33:16 +03:00
gdlbo 9c4ccce409 test upload contacts 2022-09-11 01:18:48 +03:00
gdlbo c1b2409baa contacts hack v2 2022-09-11 00:46:54 +03:00
gdlbo 54ee9f6c5b Update ContactsUtils.java 2022-09-10 23:55:05 +03:00
gdlbo d83033e983 contacts hack 2022-09-10 23:49:32 +03:00
Vologhat 92c0369332 added system theme warning dialog 2022-09-10 22:45:15 +03:00
gdlbo d796455bbe fix crash with unsupported msg 2022-09-10 21:35:25 +03:00
gdlbo dc4743f2a3 fix restart sett 2022-09-10 19:54:20 +03:00
aliveoutside 94c8736bc1 android:configChanges - uiMode 2022-09-10 19:36:01 +03:00
aliveoutside e05255263b remove useless log 2022-09-10 18:58:54 +03:00
aliveoutside e916b5fcc8 check the system theme on app start 2022-09-10 18:52:49 +03:00
aliveoutside 09e0dbd01d switch theme when "Use system theme" switch changed to true 2022-09-10 18:48:30 +03:00
aliveoutside 84e5ce6dc2 add system theme switch to settings 2022-09-10 18:42:47 +03:00
aliveoutside 2520b709bd remove dead code in ThemesUtils 2022-09-10 17:47:41 +03:00
aliveoutside 0ed16b0836 follow system theme (light/dark) 2022-09-10 17:35:41 +03:00
aliveoutside 6e55514edf Update README.md 2022-09-10 16:55:14 +03:00
aliveoutside 93d515b423 add russian string for play_in_vkx 2022-09-10 16:49:14 +03:00
aliveoutside b88ecd97fc pass playlist and action id to the hook 2022-09-10 16:46:05 +03:00
aliveoutside 5c1b39c79f pass playback context to vk x 2022-09-10 16:33:34 +03:00
aliveoutside bae7263554 implement "Play in VK X" quick action in track bottomsheet
resolves #723
2022-09-10 16:09:38 +03:00
aliveoutside 63f4ed3885 fix AudioDownloader 2022-09-06 14:00:35 +03:00
aliveoutside ad90c522ac move image downloader to IOExecutor 2022-09-06 13:57:24 +03:00
aliveoutside 374b221f0d fix #627
also fix wrong mime-types for downloaded files
2022-09-06 13:39:39 +03:00
Erik Kiznov 99adb95816 download fix 2022-09-06 12:38:00 +05:00
gdlbo e96a3b304f Update AdBlockHook.java 2022-09-04 16:39:29 +03:00
gdlbo cf4855bdd1 fixed newsfeed issues 2022-09-04 16:32:22 +03:00
gdlbo 8c8c574a4e Update OnlineFormatterHook.java 2022-09-04 14:55:23 +03:00
gdlbo 653afd69b6 Fix null dialog.getId() 2022-09-04 13:44:30 +03:00
aliveoutside 0660c9664d fix #713 2022-09-04 11:56:37 +03:00
aliveoutside a72ef8570a simplify post != null in AdBlockHook 2022-09-04 11:23:42 +03:00
gdlbo 4ce55a22f9 removed custom folders path feature 2022-09-03 23:37:00 +03:00
gdlbo 910c991adb Update CacheUtils.java 2022-09-03 23:23:56 +03:00
gdlbo b746594b1d some adblock refactoring 2022-09-03 23:18:12 +03:00
Erik Kiznov 0698985623 discover adblock logging fix 2022-09-02 21:45:04 +05:00
gdlbo 859d9dd2b8 discoverAdBlock + try catch hack
trying to find bug
2022-09-02 19:03:21 +03:00
gdlbo 341d1b6e70 Update JsonInjectors.java 2022-09-02 17:40:50 +03:00
gdlbo cbdf33f253 discover adblock 2022-09-02 17:40:04 +03:00
Erik Kiznov 536dd9ea51 i hate vk api error codes
v=5.187 -> "error_msg": "Access token has expired"

v=5.186 -> "response": "..."
2022-09-02 00:11:49 +05:00
gdlbo 624b4d4724 Update RequestDumper.java 2022-09-01 21:45:27 +03:00
k1zn 0e604c81c7 params to map<string, string> 2022-09-01 23:42:21 +05:00
gdlbo 3175fe3af2 Update WallGetById.smali 2022-09-01 21:40:47 +03:00
gdlbo 9f37390d59 removed legacy ad remover 2022-09-01 21:26:39 +03:00
gdlbo 2dfcc9096f Revert "speedup chats opening with wp"
This reverts commit 00d8e60d1e.
2022-09-01 21:03:09 +03:00
gdlbo 00d8e60d1e speedup chats opening with wp 2022-09-01 21:00:08 +03:00
Erik Kiznov 010a71ecca remove file remove 2022-09-01 22:40:07 +05:00
gdlbo e82547ddbb deleted 2/3 compressing shit 2022-09-01 20:37:07 +03:00
gdlbo 484b0f5850 fix deleting 2022-09-01 19:55:50 +03:00
gdlbo fd9837aee4 some shitcode for saving wp + true compressing + moved to webp format of file 2022-09-01 19:54:49 +03:00
aliveoutside 255e5e62db fix discover tab #481 2022-09-01 15:08:28 +03:00
gdlbo 4da1ec3b76 some theme fixes 2022-08-31 13:48:45 +03:00
gdlbo 296b717891 Update ServerDialog.java 2022-08-30 13:51:33 +03:00
gdlbo e709f6ac68 some fixes
force updates + setup filters fixes
2022-08-30 13:45:54 +03:00
aliveoutside e231e4a2b4 Revert "Update Preferences.java"
This reverts commit 2e8f168d9f.
2022-08-30 12:07:43 +03:00
Erik Kiznov 2e8f168d9f Update Preferences.java 2022-08-30 13:49:30 +05:00
Erik Kiznov e75eb4caa5 remove adblock from create new post
пост все равно создается, а фрагмент создания новой записи не закрывается, так что удалим отсюда фильтрацию
2022-08-30 01:02:14 +05:00
Erik Kiznov 58905bbc59 fix default filters value
все фильтры из mFilters при первом запуске VTLite работали и удаляли посты, даже если фильтры не были включены
2022-08-30 00:45:51 +05:00
k1zn ae9d89c6c6 update README.md to v0.4.12-beta 2022-08-28 21:20:34 +05:00
gdlbo 41ac03a7e1 speedup setupfilters and cache 2022-08-27 16:30:45 +03:00
gdlbo 4bded5c565 nigg 2022-08-27 16:09:25 +03:00
gdlbo 652f5e665f wp disabled 2022-08-27 15:53:56 +03:00
gdlbo 05e118ff31 Update ApiProxy.java 2022-08-27 13:36:31 +03:00
gdlbo c63457674d Update ApiProxy.java 2022-08-27 13:36:01 +03:00
gdlbo c9b8dbc8dd support vk.ru at opening links 2022-08-27 13:34:03 +03:00
gdlbo 34c6a7f8b1 i hate my life 2022-08-27 13:30:12 +03:00
aliveoutside 74d4a5368a move slow tasks from MainActivityInjector to executors 2022-08-27 12:49:01 +03:00
aliveoutside b2256d20e0 Revert "notif counter for newsfeed if enabled milk"
This reverts commit c8c8678785.
2022-08-27 12:48:40 +03:00
gdlbo f887648f48 I love NullPointerException
NullPointerException
NullPointerException
NullPointerException
NullPointerException
NullPointerException
2022-08-26 23:03:35 +03:00
gdlbo 8ee29b4b83 Update WallpapersHooks.java 2022-08-26 22:10:43 +03:00
gdlbo a4c6af8ace Update WallpapersHooks.java 2022-08-26 22:05:47 +03:00
gdlbo 9ec4e52eba newsfeed improves 2022-08-26 21:56:11 +03:00
gdlbo b756bfa622 proxy fixes 2022-08-26 21:33:29 +03:00
Erik Kiznov f96baa58ac wallpapers hooks: fix (maybe)
- close outputstream > release dedicated memory
- delete temp file on exit
- improved check"compress" for null
2022-08-26 23:12:48 +05:00
Erik Kiznov d9f03a5d0e msg downloader: VK_DOMAIN -> private 2022-08-26 21:13:58 +05:00
Erik Kiznov 15d2daa887 msg downloader: update
- add wall_reply support
- add story support
- add podcast support
- add gift support
- add miniapp support
- add audio playlist support
- add poll support
- add market support
- add VK_DOMAIN constant (idk why но пусть будет)
2022-08-26 21:09:01 +05:00
gdlbo 8e12f50a7f updated todo in msgdl 2022-08-26 17:00:42 +03:00
Erik Kiznov 9ff220475d msg downloader: update
- fix group links
2022-08-26 18:39:35 +05:00
Erik Kiznov 2c6619a512 msg downloader: update
- add geo support
- add chat screenshot support
- add custom action support
- add audio message support
- add audio support
- add video support
2022-08-26 18:09:18 +05:00
Erik Kiznov 5ea599b61e msg downloader: update
- replace "get" to "opt" for avoid errors
- fix vmoji sticker resolution
2022-08-26 03:11:09 +05:00
Erik Kiznov 4eea4e2011 msg downloader: update
- decrypt replies & forward messages
- fix html bug
2022-08-26 02:41:16 +05:00
Erik Kiznov f1a7816e69 msg downloader: remove some returns 2022-08-26 01:16:01 +05:00
Erik Kiznov 12c01133e1 msg downloader: update
- fix photo attach size
- replace mentions to links
- add sticker support
- add reply support
- add forward messages support
- add chat actions support
2022-08-26 01:13:20 +05:00
gdlbo 3856932a3f some proxy fixes (vkui dead idk why) 2022-08-24 22:36:22 +03:00
gdlbo a10c333cc6 deleted duplicate of profile 2022-08-24 14:11:31 +03:00
gdlbo 4d950e5c68 deleted duplicate of profile 2022-08-24 14:06:33 +03:00
gdlbo c72e102076 dl icon for msg dl 2022-08-24 14:00:24 +03:00
gdlbo 43f3df487b msg downloader test 2022-08-24 13:15:37 +03:00
Erik Kiznov ca48f97d83 remove send toast
fix messages load
2022-08-23 19:52:25 +03:00
gdlbo b69beff4d2 fix https://github.com/vtosters/lite/issues/643 2022-08-23 16:15:22 +03:00
gdlbo 67401c6868 disabled vk api ping url (cringe and dead already) 2022-08-23 16:08:17 +03:00
gdlbo 9fa8df30eb wp compress 2022-08-23 15:40:35 +03:00
gdlbo ecf896e44e maybe fix 649 2022-08-23 14:04:14 +03:00
gdlbo 58a9b69dd9 fix https://github.com/vtosters/lite/issues/669 2022-08-23 13:38:56 +03:00
Erik Kiznov 26a64545ff translate strings
translate all new untranslated strings, removed useless cast to WithUserContent in ReplyMsgHook.java
2022-08-22 18:09:35 +03:00
gdlbo 05c557a8f7 fix whitelist toast 2022-08-22 16:17:54 +03:00
gdlbo c8c8678785 notif counter for newsfeed if enabled milk 2022-08-22 04:41:25 +03:00
gdlbo 4e6eb74a8e fix bg color 2022-08-22 03:52:01 +03:00
gdlbo 52cb007a67 code improvements 2022-08-22 03:44:16 +03:00
gdlbo 657d038d9c groups filters whitelist 2022-08-22 03:31:44 +03:00
gdlbo de4d283f75 fix open vk.com links 2022-08-21 16:37:12 +03:00
gdlbo 3b37412a58 gmsless frag fixes 2022-08-21 16:23:16 +03:00
gdlbo dd6b9b32b8 some link fixes 2022-08-21 15:15:27 +03:00
gdlbo 31a456582b vk.com -> vk.ru 2022-08-21 14:54:14 +03:00
gdlbo 6ab317cbf5 fix ded wp 2022-08-20 23:33:51 +03:00
gdlbo 32c469d870 fix https://github.com/vtosters/lite/issues/657 2022-08-20 23:26:15 +03:00
gdlbo e0f09cea24 fix strange miui 13 bug 2022-08-20 22:31:43 +03:00
gdlbo e668cfb2a3 Update NewsfeedHook.java 2022-08-20 21:13:49 +03:00
gdlbo 857b63a356 Update FoafBase.java 2022-08-20 19:12:36 +03:00
gdlbo 0c03406774 fixed null list + fix reset items 2022-08-20 18:49:32 +03:00
gdlbo ac3cb847f4 refactored conversation_bar inj 2022-08-20 16:58:39 +03:00
gdlbo 05ed60b86d added vika support to start proxy dialog 2022-08-20 16:14:58 +03:00
gdlbo 020ec70221 fixed stories and vid downloading 2022-08-20 15:24:08 +03:00
Erik Kiznov 478825e708 reply 🔒 decrypt fix [pt. 2] 2022-08-20 13:31:47 +03:00
Erik Kiznov 6ce0e630db reply 🔒 decrypt fix 2022-08-20 13:31:47 +03:00
gdlbo 6e538f44b5 some pix fixes 2022-08-20 12:17:22 +03:00
gdlbo bd3bec2a31 fixed m3u8 path downloading 2022-08-19 16:00:24 +03:00
gdlbo cf25e39485 Update .gitignore 2022-08-19 15:56:40 +03:00
gdlbo 1f87d7a403 fix default ad bool 2022-08-19 15:55:40 +03:00
gdlbo 10da74285c Update build.gradle 2022-08-19 14:33:17 +03:00
aliveoutside 9fc5aa4fc3 Merge branch 'vtl-remaster' into music
# Conflicts:
#	app/libs/classes-dex2jar.jar
#	app/libs/classes2-dex2jar.jar
#	app/libs/classes3-dex2jar.jar
#	app/libs/classes4-dex2jar.jar
#	app/libs/classes5-dex2jar.jar
#	app/src/main/java/ru/vtosters/lite/downloaders/notifications/NotificationChannels.java
#	app/src/main/java/ru/vtosters/lite/music/MP3Downloader.java
2022-08-19 13:54:46 +03:00
aliveoutside 3a2607274f fix libs 2022-08-19 12:50:14 +03:00
gdlbo 6cbe7caec1 added compressing of wallpaper
speedup chat open
fix crash if file is too large
2022-08-18 23:22:48 +03:00
gdlbo 452b4aa667 fix settings crash on sdk < 24 2022-08-18 22:53:02 +03:00
gdlbo c4d77e40f4 removed globalUsersOnline + some code fixes 2022-08-18 22:24:28 +03:00
spiky-s 3c9a787a77 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s d400da3ab9 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s ded67ac699 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s 2c3d78b0b4 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s ed9701a04b improved online hook 2022-08-18 22:13:11 +03:00
spiky-s 9af33a4a01 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s 481abbc3d8 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s d9065c3073 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s 46295e5216 improved online hook 2022-08-18 22:13:11 +03:00
spiky-s 5eeff2f08d Add files via upload 2022-08-18 22:13:11 +03:00
spiky-s 341a368656 improved online hooks 2022-08-18 22:13:11 +03:00
gdlbo f9657af36c fix decrypt copy 2022-08-18 21:45:38 +03:00
gdlbo 5bead1b88f clipboard decrypt from header 2022-08-18 21:29:27 +03:00
Erik Kiznov c4d915e60d support 🔒 decrypt messages in reply window 2022-08-18 20:03:43 +03:00
gdlbo 834f70b585 fixes 2022-08-18 16:03:35 +03:00
gdlbo a5243e6839 Update EncryptProvider.java 2022-08-18 15:17:32 +03:00
gdlbo 03487678ac fixed decrypt in dialogs 2022-08-18 15:07:18 +03:00
k1zn c482e82ebe Update EncryptProvider.java 2022-08-18 14:29:15 +03:00
Erik Kiznov 14ecc21937 fix remove "🔒" bug 2022-08-18 14:24:29 +03:00
k1zn 65aa04a7e3 fix bug in decryptMessage 2022-08-18 14:24:29 +03:00
gdlbo d8e1ce12f7 copy msg decryption 2022-08-18 14:14:15 +03:00
k1zn 9a84b5b87d [2] support for decrypt message in writebar_edit 2022-08-18 13:10:32 +03:00
k1zn 0a42040188 [1] support for decrypt message in writebar_edit 2022-08-18 13:10:32 +03:00
gdlbo 8e66f75baf Proxy fixes 2022-08-18 00:01:22 +03:00
Erik Kiznov 72e1371fe0 translate strings 2022-08-17 22:46:35 +03:00
gdlbo e9c8170ee4 proxy fixes 2022-08-17 22:30:02 +03:00
gdlbo 330793f8bc Added saving key state 2022-08-17 21:18:58 +03:00
gdlbo 45015c571f some refactoring 2022-08-17 20:26:22 +03:00
gdlbo b6fcf0330d Proxy services inj 2022-08-17 20:09:59 +03:00
gdlbo cc95856e47 Proxy Refactoring 2022-08-17 17:11:50 +03:00
gdlbo cbab131610 random socks5 test 2022-08-17 13:45:39 +03:00
gdlbo 879c218f0c fix vk appname selection 2022-08-17 13:21:39 +03:00
gdlbo ef0e2caabf dockbar updates + updated gradle ver 2022-08-16 23:51:34 +03:00
Erik Kiznov d4ab0a1366 direct link 2022-08-16 18:57:05 +03:00
Erik Kiznov 9cbc45dea3 try ... catch in OTADownloader.java 2022-08-16 18:57:05 +03:00
aliveoutside b6133da808 fix #624
added a check if an attachment is instance of an attachment type where we could get the original link to the photo
2022-08-16 04:24:30 +03:00
aliveoutside 59fb11dbaa remove useless logs from MediaFragment 2022-08-16 04:10:15 +03:00
gdlbo 3de88254f6 dialog can be null........... 2022-08-15 21:13:42 +03:00
gdlbo 306338992e New device id generator for webview auth 2022-08-15 20:44:22 +03:00
Erik Kiznov 370ee53bde fix donate urls 2022-08-15 18:47:08 +03:00
gdlbo ccc61ebb92 code fixes 2022-08-15 18:26:27 +03:00
Erik Kiznov 522cac34b0 fix spaces in .xml 2022-08-15 16:44:43 +03:00
gdlbo 282c2e3ed7 text pin fix 2022-08-15 16:30:35 +03:00
gdlbo 97453703e1 fixed null decrypt msg 2022-08-15 15:30:49 +03:00
gdlbo dfeff9903d fixed translator dialog 2022-08-15 14:50:00 +03:00
gdlbo 208e601f08 fixed translator 2022-08-15 14:35:33 +03:00
gdlbo e9d63463c5 fixed translator 2022-08-15 14:34:22 +03:00
gdlbo c86a1533e4 fixed registerActivities 2022-08-15 14:31:57 +03:00
gdlbo a1332043a1 Update CryptImHook.java 2022-08-15 14:21:32 +03:00
gdlbo 86e41aef7f Crypt hook 2022-08-15 14:19:12 +03:00
Erik Kiznov a1937420e8 translate encryption settings 2022-08-15 14:17:37 +03:00
gdlbo f5383a58e1 fixed init + added enc buttons (without hooks) 2022-08-15 13:39:26 +03:00
gdlbo 3476e4eed4 fix proxy
https://github.com/vtosters/lite/issues/505
2022-08-14 21:21:21 +03:00
gdlbo 9f01927bd1 fix proxy
https://github.com/vtosters/lite/issues/505
2022-08-14 21:21:21 +03:00
Erik Kiznov be2b7c99fc [c] -> c
this commit fix russian letter "c" in variables to english letter "c"
2022-08-14 17:55:18 +03:00
Erik Kiznov d4410a1b85 [c] -> c
this commit fix russian letter "c" in variables to english letter "c"
2022-08-14 17:55:18 +03:00
k1zn 1e16a43b1e fix "vk pay" logo in superapp widget 2022-08-13 22:30:43 +03:00
k1zn 5b70beceeb fix "vk pay" logo in superapp widget 2022-08-13 22:30:43 +03:00
gdlbo e8dea04d5d Fixed rename bug 2022-08-13 21:36:35 +03:00
gdlbo 1dc000f8f5 Fixed rename bug 2022-08-13 21:36:35 +03:00
Erik Kiznov 7d3c4ce4a6 translate layouts 2022-08-13 21:29:03 +03:00
Erik Kiznov 92159a9242 translate layouts 2022-08-13 21:29:03 +03:00
gdlbo b49813e2b1 translation fixes 2022-08-13 20:57:29 +03:00
gdlbo c977cd5bdf translation fixes 2022-08-13 20:57:29 +03:00
Erik Kiznov 9bd5cafc2d delete slashes 2022-08-13 20:46:17 +03:00
Erik Kiznov b96fbc5a5f delete slashes 2022-08-13 20:46:17 +03:00
Erik Kiznov 433801a9d0 fix bug 2022-08-13 20:46:17 +03:00
Erik Kiznov ed115442dc fix bug 2022-08-13 20:46:17 +03:00
Erik Kiznov 3dd4e4df38 translate all strings to RU/EN 2022-08-13 20:46:17 +03:00
Erik Kiznov 8925e85bb4 translate all strings to RU/EN 2022-08-13 20:46:17 +03:00
gdlbo 3c90940695 added buttons to header of dialog 2022-08-13 20:13:48 +03:00
gdlbo d2e9968829 added buttons to header of dialog 2022-08-13 20:13:48 +03:00
gdlbo c7e5c57248 updated jars 2022-08-13 20:13:18 +03:00
gdlbo 7c820b7207 updated jars 2022-08-13 20:13:18 +03:00
gdlbo 0fbdccbecc Update issue templates 2022-08-13 15:44:45 +03:00
gdlbo 61d63d574b Update issue templates 2022-08-13 15:44:45 +03:00
gdlbo c5a0d7d05c Update issue templates 2022-08-13 14:28:22 +03:00
gdlbo d07bf40dc3 Update issue templates 2022-08-13 14:28:22 +03:00
gdlbo d365cd9068 Update issue templates 2022-08-13 14:24:07 +03:00
gdlbo d8a7b451c0 Update issue templates 2022-08-13 14:24:07 +03:00
gdlbo 6ea4822f41 Update issue templates 2022-08-13 14:23:31 +03:00
gdlbo 28ab01cbff Update issue templates 2022-08-13 14:23:31 +03:00
gdlbo cc16f4727f updated gradle to 7.2.2 2022-08-13 13:31:59 +03:00
gdlbo 244bae71e2 updated gradle to 7.2.2 2022-08-13 13:31:59 +03:00
gdlbo 79c2fc9010 some code reformat 2022-08-12 22:08:16 +03:00
gdlbo 66951fa826 some code reformat 2022-08-12 22:08:16 +03:00
gdlbo e9047274b3 StoryCircleImageView + CommunityBorderedImageView java
80 and 136
radius unread 2 read 1
2022-08-12 22:01:58 +03:00
gdlbo ac364f1ae2 StoryCircleImageView + CommunityBorderedImageView java
80 and 136
radius unread 2 read 1
2022-08-12 22:01:58 +03:00
gdlbo 5f57558c52 some rounding improvements 2022-08-12 17:44:40 +03:00
gdlbo 01f956477b some rounding improvements 2022-08-12 17:44:40 +03:00
gdlbo 3c8b394a4b fixed abbr avatar rounding 2022-08-12 17:32:22 +03:00
gdlbo c525427594 fixed abbr avatar rounding 2022-08-12 17:32:22 +03:00
gdlbo f5037dced3 some settings improvements 2022-08-12 02:38:59 +03:00
gdlbo 8a83052941 some settings improvements 2022-08-12 02:38:59 +03:00
gdlbo 274e1bd0df fixed some paths 2022-08-12 01:40:21 +03:00
gdlbo 0bcbf2b4f8 fixed some paths 2022-08-12 01:40:21 +03:00
gdlbo 32daac436e updated jars 2022-08-12 01:39:51 +03:00
gdlbo a7d8e7294f updated jars 2022-08-12 01:39:51 +03:00
gdlbo 820ca12c3e fixed DownloadUtils + added custom folders reset 2022-08-12 01:07:54 +03:00
gdlbo 38aa6c1905 fixed DownloadUtils + added custom folders reset 2022-08-12 01:07:54 +03:00
gdlbo f3cda292e0 fixed superapp crash 2022-08-11 23:50:03 +03:00
gdlbo 91bd29cf93 fixed superapp crash 2022-08-11 23:50:03 +03:00
gdlbo 75c98b98dd mb fix crash sdk 21+ 2022-08-11 23:29:40 +03:00
gdlbo 186a807d54 mb fix crash sdk 21+ 2022-08-11 23:29:40 +03:00
gdlbo cc6e3c2dd8 fix bug 2022-08-11 22:29:11 +03:00
gdlbo 48ba199613 fix bug 2022-08-11 22:29:11 +03:00
Vologhat 9a9a73e89a refactor newsfeed manager 2022-08-11 21:03:35 +03:00
Vologhat df3b374f3a refactor newsfeed manager 2022-08-11 21:03:35 +03:00
gdlbo a6f52af5d1 newsfeedlist manager 2022-08-11 16:05:04 +03:00
gdlbo 5c26dd8ea4 newsfeedlist manager 2022-08-11 16:05:04 +03:00
gdlbo fa12e8f7e0 cache fixes 2022-08-10 13:17:38 +03:00
gdlbo 14cf129435 cache fixes 2022-08-10 13:17:38 +03:00
aliveoutside 3a7a05e630 fix not loading recommended posts page 2022-08-09 19:47:54 +03:00
aliveoutside 073c80d1b0 fix not loading recommended posts page 2022-08-09 19:47:54 +03:00
gdlbo e05fe77fb4 fixed default undel prefix 2022-08-06 23:19:47 +03:00
gdlbo b0856d6232 fixed default undel prefix 2022-08-06 23:19:47 +03:00
gdlbo b86128ac66 TargetImageView 2022-08-06 17:39:34 +03:00
gdlbo 0cdccd6a54 TargetImageView 2022-08-06 17:39:34 +03:00
gdlbo 3e9058002b disabled pinned msg buttons 2022-08-06 15:26:29 +03:00
gdlbo 829a333d7f disabled pinned msg buttons 2022-08-06 15:26:29 +03:00
gdlbo 76775f0ad4 max dp 10 2022-08-06 14:00:24 +03:00
gdlbo 42984efe25 max dp 10 2022-08-06 14:00:24 +03:00
gdlbo 086210718c rounding hook fixes 2022-08-06 13:40:40 +03:00
gdlbo 7656468636 rounding hook fixes 2022-08-06 13:40:40 +03:00
gdlbo bc1f11da61 code imp 2022-08-06 12:49:56 +03:00
gdlbo 448a169bc3 code imp 2022-08-06 12:49:56 +03:00
gdlbo 63075ca216 code imp 2022-08-05 23:13:35 +03:00
gdlbo 27cacc03a2 code imp 2022-08-05 23:13:35 +03:00
gdlbo 4876a881d2 DownloadUtils fixes 2022-08-05 22:24:29 +03:00
gdlbo 2002db57d9 DownloadUtils fixes 2022-08-05 22:24:29 +03:00
gdlbo fef7082e66 DownloadUtils 2022-08-05 21:41:34 +03:00
gdlbo 0aad1ef358 DownloadUtils 2022-08-05 21:41:34 +03:00
gdlbo 4dc7223629 dir fixes 2022-08-05 21:21:18 +03:00
gdlbo d8f5b5e910 dir fixes 2022-08-05 21:21:18 +03:00
aliveoutside 9fbb2fada4 use different request codes for different download types 2022-08-05 21:07:30 +03:00
aliveoutside 3d5c832cec use different request codes for different download types 2022-08-05 21:07:30 +03:00
gdlbo a31d75ea41 more folders picker 2022-08-05 20:49:09 +03:00
gdlbo bc467ac335 more folders picker 2022-08-05 20:49:09 +03:00
gdlbo efa28aa3d6 more folders picker 2022-08-05 20:39:24 +03:00
gdlbo aee5f38fb5 more folders picker 2022-08-05 20:39:24 +03:00
aliveoutside 9dd3a26bab implement download folder picker 2022-08-05 19:53:02 +03:00
aliveoutside a4612a127d implement download folder picker 2022-08-05 19:53:02 +03:00
gdlbo f49bc4d05d some code imp 2022-08-05 19:48:31 +03:00
gdlbo 7a21f11b64 some code imp 2022-08-05 19:48:31 +03:00
gdlbo 0ca4ba2697 some code imp 2022-08-05 19:47:53 +03:00
gdlbo 4775715b66 some code imp 2022-08-05 19:47:53 +03:00
gdlbo 09333dc64d some code imp 2022-08-05 19:28:27 +03:00
gdlbo c481d5fca9 some code imp 2022-08-05 19:28:27 +03:00
aliveoutside 91bfea9917 fix #571
also get rid of java reflection
2022-08-05 03:03:40 +03:00
aliveoutside be65e6816d fix #571
also get rid of java reflection
2022-08-05 03:03:40 +03:00
gdlbo 042595f238 come imp 2022-08-04 15:49:48 +03:00
gdlbo 1f2200c584 come imp 2022-08-04 15:49:48 +03:00
gdlbo 174151b52b some code imp 2022-08-04 14:47:36 +03:00
gdlbo 52b58dc79b some code imp 2022-08-04 14:47:36 +03:00
gdlbo 7fed263a0e DialogItemView converted to java
i am dead inside tbh
2022-08-04 14:30:29 +03:00
gdlbo de92e4670c DialogItemView converted to java
i am dead inside tbh
2022-08-04 14:30:29 +03:00
gdlbo 79fd0350e4 Merge pull request #566 from k1zn/vtl-remaster 2022-08-04 01:24:22 +03:00
gdlbo 4806bb89eb Merge pull request #566 from k1zn/vtl-remaster 2022-08-04 01:24:22 +03:00
Erik Kiznov 4f760b5a4d another renaming 2022-08-04 02:02:44 +05:00
Erik Kiznov 0cdbf9ce99 another renaming 2022-08-04 02:02:44 +05:00
Erik Kiznov f19a4275de Merge branch 'vtl-remaster' of https://github.com/k1zn/lite into vtl-remaster 2022-08-04 02:01:18 +05:00
Erik Kiznov a7bde644a4 Merge branch 'vtl-remaster' of https://github.com/k1zn/lite into vtl-remaster 2022-08-04 02:01:18 +05:00
Erik Kiznov 7e36bbf83e edit some strings about filters 2022-08-04 01:59:47 +05:00
Erik Kiznov e461b4654e edit some strings about filters 2022-08-04 01:59:47 +05:00
k1zn 0a7338bf89 Fix lower case bug 2022-08-04 01:55:18 +05:00
k1zn 8d7f2dfee8 Fix lower case bug 2022-08-04 01:55:18 +05:00
k1zn c1197e461b Renaming 2022-08-04 01:22:06 +05:00
k1zn bf5bc08671 Renaming 2022-08-04 01:22:06 +05:00
Erik Kiznov 7baaf08167 Add filter for source name 2022-08-04 01:08:30 +05:00
Erik Kiznov 437bef3d03 Add filter for source name 2022-08-04 01:08:30 +05:00
gdlbo 0d75bec938 fixed def catalog music 2022-08-01 22:34:14 +03:00
gdlbo 024079c4bc fixed def catalog music 2022-08-01 22:34:14 +03:00
gdlbo 0af00ab7d1 ads_tracking_disabled true 2022-08-01 22:17:38 +03:00
gdlbo ed53f509ee ads_tracking_disabled true 2022-08-01 22:17:38 +03:00
gdlbo 2011901666 adblock lmao 2022-08-01 21:36:47 +03:00
gdlbo 6b90aedae8 adblock lmao 2022-08-01 21:36:47 +03:00
gdlbo b75ce047df Reducing the size of news traffic by disabling the ad request 2022-08-01 21:09:08 +03:00
gdlbo 4db73ff3d1 Reducing the size of news traffic by disabling the ad request 2022-08-01 21:09:08 +03:00
aliveoutside bfd258ba54 fix #465
added a check for "Music" folder existence
2022-08-01 16:50:29 +03:00
aliveoutside 4a092f0920 fix #465
added a check for "Music" folder existence
2022-08-01 16:50:29 +03:00
Vologhat 186c1f80e6 added "likes on right" displaying mode for posts and viewers 2022-08-01 13:33:58 +03:00
gdlbo 59c8be9ac2 some vkui improvements 2022-08-01 01:53:50 +03:00
gdlbo eb2c4c02d2 some fixes 2022-08-01 00:48:58 +03:00
gdlbo fe2fd354fd read to feature 2022-08-01 00:39:02 +03:00
k1zn 16fd8925ff Add translate function to catch 2022-07-31 23:01:30 +03:00
k1zn 661302d90f Remove %
The percentage in the text breaks the translation process, so I remove it.
2022-07-31 23:01:30 +03:00
Erik Kiznov 2c8dd6e89a Another refactoring... 2022-07-31 23:01:30 +03:00
Erik Kiznov 91fe8a8fb4 Add @ support 2022-07-31 23:01:30 +03:00
Erik Kiznov cc3456758e Fix bug 2022-07-31 23:01:30 +03:00
Erik Kiznov c2dc772905 Refactoring 2022-07-31 23:01:30 +03:00
Erik Kiznov 9915e8d2df Don't translate mentions
Don't translate mentions in MessagesHook
2022-07-31 23:01:30 +03:00
gdlbo 5c79dbe1c2 req dumper 2022-07-31 22:26:36 +03:00
Vologhat f6555f49d8 beta stuff for music 2022-07-31 22:14:49 +03:00
gdlbo f83e97404a video history delete 2022-07-31 18:33:37 +03:00
aliveoutside f704d54178 fix #450 / #547 and speed up logout 2022-07-31 18:10:30 +03:00
gdlbo 3577e3b70c about debug activation 2022-07-31 16:58:39 +03:00
gdlbo 000bd5e7d3 settings moment 2022-07-31 14:04:23 +03:00
gdlbo 4d3e8d4354 cache moment 2022-07-31 13:42:50 +03:00
gdlbo 0d51b40676 deepl ded 2022-07-31 13:34:24 +03:00
Erik Kiznov 054f03480e Fix strings about bombs 2022-07-31 13:34:24 +03:00
Vologhat 114b46ccee added translation language as argument 2022-07-31 13:34:24 +03:00
gdlbo 0715c0cfcf some imp 2022-07-31 13:34:24 +03:00
gdlbo a51a146780 fixed gtranslate + added reply’s translate 2022-07-31 13:34:24 +03:00
gdlbo c2c3ea68fa some imp 2022-07-31 13:34:24 +03:00
gdlbo 8e40da9fb4 compiling fix 2022-07-31 13:34:23 +03:00
gdlbo d6b744533b compiling fix 2022-07-31 13:34:23 +03:00
Vologhat df1d411ae0 added new translators and choicing of that 2022-07-31 13:34:23 +03:00
gdlbo 2904616d67 Update MessagesSendApiCmd.smali 2022-07-31 13:34:23 +03:00
gdlbo 61eac6feca some fixes 2022-07-31 13:34:23 +03:00
gdlbo 1f29f2ddc5 fixed dialog 2022-07-31 13:34:23 +03:00
gdlbo fbff3eadde dialog fixes 2022-07-31 13:34:23 +03:00
gdlbo 7c8a76616c added bombs 2022-07-31 13:34:23 +03:00
gdlbo 465d52df67 updated icons 2022-07-31 13:34:23 +03:00
gdlbo 57e69b0d98 Create ic_deepl_logo_icon.xml 2022-07-31 13:34:22 +03:00
gdlbo a799828de0 some icons 2022-07-31 13:34:22 +03:00
gdlbo e6ad306e24 migrated to vkalertdialog 2022-07-31 13:34:22 +03:00
gdlbo 5ff1e0a0a6 Update DNRInjector.java 2022-07-31 13:34:22 +03:00
gdlbo 09048a7a21 china number one 2022-07-31 13:34:22 +03:00
gdlbo 2e2e890875 updated translate dialog 2022-07-31 13:34:22 +03:00
gdlbo 271b1cdfee Update Translate.java 2022-07-31 13:34:08 +03:00
gdlbo bc06512250 fixed onclick 2022-07-31 13:34:08 +03:00
gdlbo a94af3a4db message hook 2022-07-31 13:34:08 +03:00
gdlbo 924a34b458 code imp 2022-07-31 13:34:07 +03:00
Vologhat f73b880b6d added messages hook and base class for translators 2022-07-31 13:34:07 +03:00
Vologhat a53a9eaeaa fixed errors 2022-07-31 13:34:07 +03:00
gdlbo 88390f0fc9 dialog 2022-07-31 13:33:42 +03:00
gdlbo c6721841ac rebase 2022-07-31 13:33:31 +03:00
Vologhat dfa77311f2 removed deepl and added yandex 2022-07-31 13:32:49 +03:00
Vologhat 57e241ab7d replace net to okhttp 2022-07-31 13:32:48 +03:00
gdlbo 50b97aac8a DeepLApi test 2022-07-31 13:32:48 +03:00
k1zn 6166b29b29 Update README.md 2022-07-30 18:32:54 +03:00
gdlbo 7ee1331263 fixed msg 2022-07-30 17:54:26 +03:00
gdlbo 0cc0299215 deviceinfo and geodata hide feature 2022-07-30 17:37:28 +03:00
iNotFlying a7e0f2ae2b Update README.md 2022-07-30 15:48:05 +03:00
gdlbo c38e0aa61e fixed adding music catalog bug 2022-07-30 13:59:54 +03:00
iNotFlying 9496da151a Refactoring 2022-07-30 02:33:23 +03:00
gdlbo 5cec11c6dd dialog pin/unpin system (api) 2022-07-30 01:13:52 +03:00
gdlbo a285bf4270 updated stock icon 2022-07-29 23:54:37 +03:00
aliveoutside 344c418412 Merge pull request #539 from ricoshett/vtl-remaster
добавлена быстрая навигация
размер изображений в блоке Линукса и Винды теперь одинаков
2022-07-29 18:30:14 +03:00
gdlbo 5464053fa0 code beautifying 2022-07-29 16:28:49 +03:00
ricoshett 8036fc332b update README.md 2022-07-29 16:23:44 +03:00
aliveoutside c1cb5c23ae update ffmpeg-kit 2022-07-29 18:39:39 +03:00
gdlbo dbb25fbabd some java moments 2022-07-29 16:14:24 +03:00
k1zn d75a339a02 Fix README.md 2022-07-29 15:20:07 +03:00
aliveoutside 6fd15a05ff Merge pull request #536 from k1zn/vtl-remaster
<!> Ignore *.md files in Github Actions
2022-07-29 14:49:54 +03:00
aliveoutside 0d991138c0 Update README.md (Update README.md)
Update README.md (Update README.md) (Update README.md)
2022-07-29 14:49:44 +03:00
k1zn 5264a397a0 Update build.yml 2022-07-29 16:41:30 +05:00
iNotFlying c2fe5e6c3c Update README.md 2022-07-29 12:52:35 +04:00
iNotFlying 7c232b70ed Update README.md 2022-07-29 12:50:27 +04:00
iNotFlying 8761d23bda Update README.md 2022-07-29 12:30:41 +04:00
iNotFlying 81203ef531 Update README.md 2022-07-29 12:29:31 +04:00
iNotFlying 743356af01 Update README.md 2022-07-29 12:17:27 +04:00
iNotFlying 036cf4846c Update README.md 2022-07-29 12:15:21 +04:00
iNotFlying 7f97394861 Update README.md 2022-07-29 12:13:31 +04:00
aliveoutside d439469f39 Merge pull request #532 from k1zn/vtl-remaster
fixes a bug where pinned dialogs don't show up in the message section
2022-07-29 01:32:05 +03:00
k1zn 8ec891d0bc Fix locals + fix fields 2022-07-29 03:13:58 +05:00
k1zn bb318aeeb1 Set MessagesGetConversationsApiCmd fields to public 2022-07-29 02:29:00 +05:00
k1zn 6621f7c2a2 Add support for major_sort_id in messages
This commit fixes a bug where pinned dialogs don't show up in the message section.
2022-07-29 02:15:53 +05:00
iNotFlying 108e212c56 Update README.md 2022-07-28 23:15:47 +03:00
iNotFlying f923db90ea Update README.md 2022-07-28 23:15:47 +03:00
k1zn e5a0e9617b Update README.md 2022-07-28 23:15:47 +03:00
k1zn e0d27dd97c Update README.md 2022-07-28 23:15:47 +03:00
k1zn 5d49fc586b Update README.md 2022-07-28 23:15:47 +03:00
k1zn e1beef2e29 Update README.md 2022-07-28 23:15:47 +03:00
gdlbo 0803e73949 added music grabber 2022-07-28 20:16:01 +03:00
gdlbo e7b8dd56fe icon changed 2022-07-28 18:02:20 +03:00
gdlbo add56248e1 Revert "Temporary fix for pinned dialogs"
This reverts commit 90a539d361.
2022-07-28 17:48:31 +03:00
k1zn 90a539d361 Temporary fix for pinned dialogs
A temporary fix for pinned dialogs, so that they at least appear in the section
2022-07-28 17:45:45 +03:00
gdlbo ed2645e3ff cache sett refactoring 2022-07-28 15:49:24 +03:00
gdlbo cdc8d2eaf2 screenshot detect 2022-07-28 13:21:37 +03:00
gdlbo bdb9dc670c some code improvements 2022-07-28 11:46:08 +03:00
gdlbo 32b3a035a8 some settings logic reworked 2022-07-28 02:24:38 +03:00
gdlbo c44aea13d6 some improvements of scrobbler 2022-07-28 01:41:21 +03:00
gdlbo ce4bb21782 fixed hint text 2022-07-28 01:40:51 +03:00
gdlbo fa5716d651 Update Scrobbler.java 2022-07-28 00:49:39 +03:00
gdlbo c7971c9860 Update Scrobbler.java 2022-07-28 00:46:52 +03:00
gdlbo 9d3e7c53de lastfm test 2022-07-28 00:15:41 +03:00
gdlbo 81c4e1c019 fixed crashreporter 2022-07-28 00:15:41 +03:00
Vologhat a4125653cf The great refactoring 2022-07-27 21:05:15 +03:00
gdlbo 3c3b51d6ab podcasts are dead + returned old vk pay 2022-07-27 18:03:45 +03:00
gdlbo 9e21dee290 some pic fixes 2022-07-27 16:42:50 +03:00
gdlbo c341e493f8 upped conv api ver 2022-07-27 15:51:30 +03:00
gdlbo e6325c74d8 upped vk hardcoded build number 2022-07-27 13:52:12 +03:00
gdlbo e703adb168 some music fixes 2022-07-27 13:33:47 +03:00
gdlbo ae2b9e0cce some default prefs fix 2022-07-26 19:21:08 +03:00
gdlbo 6db84cbc12 default prefs + fix default fragment 2022-07-26 19:09:38 +03:00
gdlbo db41faee3e temp fix for a10+ 2022-07-26 18:50:45 +03:00
gdlbo 905158bb07 some deobf FileUtils (why?) 2022-07-26 18:42:13 +03:00
k1zn a08782de4e Fix access_token regex (again) 2022-07-26 18:14:32 +03:00
k1zn 0fcbffab26 Fix access_token regex 2022-07-26 18:14:32 +03:00
gdlbo 30d6ccbd9a fix comments 2022-07-26 18:13:40 +03:00
gdlbo cd7f3f8b52 fixed video catalog + deleted useless feature 2022-07-25 21:59:55 +03:00
Erik Kiznov 4b57fa9414 Add VK Video new icon 2022-07-25 21:49:54 +03:00
Erik Kiznov 9d3099f816 Updated VK Music icon for all DPI 2022-07-25 21:49:54 +03:00
Erik Kiznov a0c02b2fd1 VK Rebranding (Part 2.1)
Founded and updated some VK logos (in notification, in app-icon)
2022-07-25 21:49:54 +03:00
Erik Kiznov df8c86fe4c New "Music" logo in dockbar 2022-07-25 21:49:54 +03:00
Erik Kiznov 008a24bfff VK Rebranding (Part 2)
* Updated VK Logo
* Updated VK Music logo
* Updated VK Pay logo
2022-07-25 21:49:54 +03:00
gdlbo 5484766ef1 dockbar improved 2022-07-25 21:19:18 +03:00
gdlbo b36a3bfbdb speedup settings 2022-07-25 21:19:18 +03:00
gdlbo 7fc842c9ef fixed open music catalog 2022-07-25 21:19:18 +03:00
gdlbo 8615faff4a fixed tgs dialog 2022-07-25 21:19:18 +03:00
gdlbo ba05c831cc deleted getAdvertisingId check + deleted vigo tracker 2022-07-25 21:19:18 +03:00
gdlbo 3f11a14d92 deleted my target lib (fully) 2022-07-25 21:19:18 +03:00
gdlbo 0284dec33a del ad audio lib 2022-07-25 21:19:18 +03:00
Erik Kiznov 8d376d9e5a VK Rebranding
This commit updates VK logo in all (maybe) pictures
2022-07-25 18:50:25 +03:00
gdlbo ce731b1832 dockbar fixes 2022-07-25 01:53:12 +03:00
gdlbo 64a8552647 some migration to VkAlertDialog 2022-07-25 01:45:32 +03:00
gdlbo e0b06449ec dockbar fixes 2022-07-24 22:32:35 +03:00
gdlbo 64d62b10a1 size text labels 2022-07-24 20:35:56 +03:00
gdlbo 1a3cf8695d bold text labels 2022-07-24 20:11:11 +03:00
gdlbo 1251dd1d2d dockbar colors fix 2022-07-24 19:43:26 +03:00
gdlbo 06d5b1a779 some profile inj fixes 2022-07-24 16:16:17 +03:00
gdlbo c18a3dde9e new profile buttons injector 2022-07-24 15:24:21 +03:00
Vologhat 6961bc073a added new way of music downloading 2022-07-24 02:17:20 +03:00
gdlbo e1b6f8d66f unlocked dockbar_tab_titles 2022-07-24 00:31:21 +03:00
gdlbo b95edec916 fixes
foaf time is now with local timezone
fixed music starting
2022-07-24 00:02:46 +03:00
gdlbo 8756cd1f20 foaf online 2022-07-23 21:36:37 +03:00
Vologhat 8122c92bbf Update JsonInjectors.java 2022-07-22 15:52:04 +03:00
gdlbo 3e53455a05 Update StandartFilter.txt 2022-07-22 15:06:28 +03:00
gdlbo 07ddb66264 fixed parseRepostItem fetch bug 2022-07-22 15:01:09 +03:00
gdlbo 4fef230a06 speedup adblock 2022-07-22 14:42:25 +03:00
gdlbo 2d73131863 speedup adblock + logs 2022-07-22 13:55:43 +03:00
Vologhat f90ae6bade optimized new newsfeed adblocker 2022-07-22 02:31:20 +03:00
Vologhat b4a45a17c7 optimized new newsfeed adblocker 2022-07-22 01:42:32 +03:00
gdlbo 8767540164 speedup stories adblock 2022-07-22 00:34:47 +03:00
gdlbo fb8e327856 some fixes 2022-07-22 00:29:56 +03:00
gdlbo 344b30aa62 new adblock (alpha) 2022-07-21 23:35:03 +03:00
gdlbo d776693aea unlocked custom newsfeed 2022-07-21 22:08:26 +03:00
gdlbo aaf2f9c6c9 fuck vk 2022-07-21 21:45:23 +03:00
gdlbo 5fbabfbe23 some ad fixes 2022-07-21 19:38:20 +03:00
Vologhat 42645a5414 fixes in stories adblocker 2022-07-21 16:56:05 +03:00
gdlbo 5af63e0adf some ad fixes 2022-07-21 16:34:55 +03:00
gdlbo ba430052de some ad fixes 2022-07-21 15:35:13 +03:00
gdlbo a81ebed663 new stories adblock 2022-07-21 15:30:21 +03:00
gdlbo 920883ada1 def catalog music 2022-07-21 14:16:22 +03:00
gdlbo 41c5f57ccc convBarRecomm 2022-07-21 12:50:46 +03:00
gdlbo 2aa7862fe1 whatsnew block hide 2022-07-21 12:24:09 +03:00
Vologhat 22795bab81 added feature of item state changing by swipe to dockbar and superapp editors 2022-07-21 12:00:46 +03:00
gdlbo 9ae1c0c1bb fix superapp 2022-07-20 23:12:28 +03:00
Vologhat c155e560ba fixed chat preview 2022-07-20 22:30:23 +03:00
gdlbo f92dd71d35 some settings sorting 2022-07-20 18:40:19 +03:00
gdlbo 474f9f0197 vkme warn 2022-07-20 18:21:35 +03:00
gdlbo aee76ba2ff google moment fix 2022-07-20 18:08:07 +03:00
Vologhat 398b6fc37b added state changing by swipe for unmoved items to adapter 2022-07-20 17:55:54 +03:00
gdlbo 454cea3556 dockbar_accent is true 2022-07-20 16:50:00 +03:00
gdlbo 90816b5c67 some dockbar fixes + accent 2022-07-20 16:42:28 +03:00
gdlbo 7c1ac4b267 hide beta feature (need to rework tbh) 2022-07-20 15:54:32 +03:00
gdlbo c145b64441 some dockbar and superapp editor fixes 2022-07-20 15:50:37 +03:00
Vologhat 2ad5ab7a87 added superapp editor, added titles in dockbar and some changes
-Added new SuperApp editor
-Added titles in dockbar and option for it in settings
-Refactored DockBarAdapter
2022-07-20 15:05:17 +03:00
gdlbo 95fd69c5da vkpay/games/miniapps hide feature 2022-07-20 12:24:58 +03:00
gdlbo 1a3f18cbc2 fixed vkx cringe logging 2022-07-19 21:46:38 +03:00
gdlbo f4031ead02 updated some wrappers 2022-07-19 21:39:27 +03:00
gdlbo 37b7783b40 updated some wrappers 2022-07-19 21:38:17 +03:00
gdlbo 8059743e0b added playlists 2022-07-19 20:58:30 +03:00
gdlbo 2c1beedf8b disabled stats 2022-07-19 19:02:55 +03:00
gdlbo 484510da77 music tricks kekw 2022-07-19 19:02:30 +03:00
gdlbo ddf046cd20 music tricks 2022-07-19 16:52:59 +03:00
gdlbo 1c5316ba4e Update LogWriterService.java 2022-07-19 16:52:59 +03:00
aliveoutside 5503caed79 fix #453 2022-07-19 17:21:35 +03:00
aliveoutside 1f11530d04 update .gitignore 2022-07-19 15:58:57 +03:00
gdlbo 95b5fca205 IconsFragment fixes 2022-07-18 22:42:52 +03:00
gdlbo 7432fe7aba icooooooooons! 2022-07-18 22:27:28 +03:00
gdlbo c4630042c7 some fixes 2022-07-18 21:44:03 +03:00
gdlbo 16f4178e36 fix superappitems counter 2022-07-18 21:25:44 +03:00
gdlbo 421d080ec7 icons 2022-07-18 15:31:25 +03:00
Vologhat 381a759c4b temporary hooks disabling 2022-07-18 14:26:27 +03:00
gdlbo 08bb1e1174 fix proxy? 2022-07-18 12:50:41 +03:00
gdlbo 7fec602f34 fixed vk me mode 2022-07-18 10:38:05 +03:00
gdlbo 1f9aca7399 added some new counters 2022-07-18 03:21:48 +03:00
gdlbo 6b5c5bedea fixed friends hide with birthday 2022-07-18 01:53:56 +03:00
Vologhat 0901af5106 fixed dockbar counters #449 2022-07-18 01:35:26 +03:00
Vologhat 5ef7b85e87 fixed scroll to top feature 2022-07-18 01:13:14 +03:00
gdlbo 7facf974e6 fixed ExternalLinkHandler 2022-07-17 23:31:43 +03:00
Vologhat eb21d3d11c fix external player crash in vkplayer 2022-07-17 22:31:29 +03:00
gdlbo 03e8d7873e updated some strings 2022-07-17 21:18:27 +03:00
Vologhat 11faab902f added some features to photo viewer #411
-Added image searching in the internet with feature of selecting search engine
-Added copying image file url to the clipboard
-Added opening image file url in the browsers
2022-07-17 21:15:23 +03:00
gdlbo 9c1b00ef23 some settings summ fixes 2022-07-17 16:59:36 +03:00
gdlbo f40d3a5aac counters 2022-07-17 15:21:19 +03:00
gdlbo 07aa13d9b0 fixed stickers dialog 2022-07-17 15:21:06 +03:00
gdlbo 0b267091ba fixed live tab + imports 2022-07-17 13:54:23 +03:00
gdlbo ead6860674 some dockbar fixes 2022-07-17 13:21:46 +03:00
gdlbo a87c34f1fd updated StandartFilter.txt 2022-07-17 11:37:18 +03:00
gdlbo 4e4813fd5c some dockbar fixes 2022-07-17 11:14:45 +03:00
gdlbo 58e728f26c added tgsbotkey check if not valid 2022-07-17 11:08:32 +03:00
gdlbo 35282945cc some dockbar fixes 2022-07-17 11:03:45 +03:00
gdlbo 18965af7d8 fixed saving settings 2022-07-17 10:56:04 +03:00
Vologhat a3987abf11 make shorter external player string in action menu 2022-07-17 08:42:17 +03:00
gdlbo 58ab5cf4cf some settings fixes 2022-07-17 00:18:22 +03:00
gdlbo 6f115d1766 some settings fixes 2022-07-16 23:42:10 +03:00
gdlbo 568a489993 dockbar fixes 2022-07-16 23:26:19 +03:00
gdlbo 2e50607a90 added disabler of OnlineFormatter 2022-07-16 23:02:38 +03:00
Vologhat 560321f4a3 fix #443 2022-07-16 18:07:54 +03:00
aliveoutside afc0173423 [musicdownloader] increase the audio quality 2022-07-16 20:01:25 +03:00
aliveoutside da5ac90189 [musicdownloader] fix previous commit 2022-07-16 19:43:16 +03:00
aliveoutside d8d435c994 [musicdownloader] show the download progress in notifications 2022-07-16 19:39:10 +03:00
Vologhat 0e225db32d dockbar editor fixes 2022-07-15 17:39:25 +03:00
gdlbo e06e5ac3a7 some hooks refactoring 2022-07-15 11:09:15 +03:00
aliveoutside a073314c28 fix vkx integration 2022-07-15 02:39:17 +03:00
gdlbo c643776790 Update CopyrightAds.txt 2022-07-14 23:00:00 +03:00
gdlbo a67f3cd11e fix getVoiceListened 2022-07-14 22:33:13 +03:00
gdlbo 04087259c3 fixed dialog style in tgs and PreferencesUtil 2022-07-14 22:12:23 +03:00
Vologhat 3f6177150d changed dockbar editor logic
- Changed data storage method
- Added json config check
- Some optimizations
2022-07-14 22:10:37 +03:00
gdlbo 3f339821f7 Update MsgMarkAsListenedJob.smali 2022-07-14 21:50:40 +03:00
gdlbo 9abef592fb getVoiceListened inj 2022-07-14 21:48:58 +03:00
gdlbo a561f05b32 Fixed vkx inj + some fixes 2022-07-14 21:15:29 +03:00
Vologhat a8c4f0d505 fix #416 2022-07-14 20:09:46 +03:00
Vologhat 93551d6b2d added base fragment with toolbar implementation 2022-07-14 20:09:20 +03:00
Vologhat 6ff176e5d4 added layout helper 2022-07-14 20:08:52 +03:00
gdlbo cdec126f54 miniapps hide feature 2022-07-14 19:27:53 +03:00
gdlbo 2885129531 hide friends recomm in friends 2022-07-14 18:27:10 +03:00
gdlbo f84a04356a android:debuggable="false" 2022-07-14 12:15:00 +03:00
gdlbo 621bc6aef7 Update build.gradle 2022-07-14 02:44:53 +03:00
gdlbo e4dfb30870 Update build.gradle 2022-07-14 02:36:36 +03:00
gdlbo 2b4da660c7 disabled force miui dark theme 2022-07-14 01:43:15 +03:00
gdlbo a870e09609 added check for android sdk 26 to get adaptive icon 2022-07-14 01:37:27 +03:00
gdlbo 32f3a11713 some codebase to future update with support no adaptive icons 2022-07-14 01:34:11 +03:00
gdlbo 104ae44b84 Update DockBarEditorFragment.java 2022-07-14 01:12:55 +03:00
gdlbo 17f8932ff4 Update build.gradle 2022-07-14 01:12:52 +03:00
gdlbo 0d4d820993 added splashscreen for < Android 12
pls check
2022-07-14 00:35:14 +03:00
gdlbo 878bf49dc4 added cleaning web cache for theme changing 2022-07-14 00:13:56 +03:00
gdlbo fe8ab52595 deleted some useless and dead vk features 2022-07-13 23:45:57 +03:00
gdlbo dd1a3774f8 disabled feature 2022-07-13 19:07:42 +03:00
gdlbo 7e1bd28d26 dnt inj 2022-07-13 19:03:44 +03:00
gdlbo 59593db4ec recomm disabler 2022-07-13 18:49:45 +03:00
gdlbo 6694739a4f fixed crash + added notifs about verif 2022-07-13 18:41:41 +03:00
gdlbo 4323802862 Update IconsFragment.java 2022-07-13 18:06:31 +03:00
Vologhat c2056853e0 Update IconsFragment.java 2022-07-13 17:57:48 +03:00
gdlbo d15a439477 icon manager test dead 2022-07-13 17:41:44 +03:00
gdlbo bb59cfa68a VideoDownloader fix 2022-07-13 17:26:29 +03:00
gdlbo 144b502c25 Update TokenConfirmationHandlerChainCall.smali 2022-07-13 15:29:07 +03:00
gdlbo b6c8992441 fix 2022-07-13 15:18:31 +03:00
gdlbo 7a5124a820 some connection fixes 2022-07-13 15:05:13 +03:00
Vologhat f5cac67d38 added vk video opening externally 2022-07-13 13:21:40 +03:00
Vologhat 5b38ea3b3f added external player redirection 2022-07-13 05:34:22 +03:00
Vologhat e6a687264b fixed toolbar visibility 2022-07-13 04:20:02 +03:00
gdlbo 6d16fbe260 codebase for future multiple list pref with appnames and icons 2022-07-13 01:28:15 +03:00
aliveoutside 047c6c94be [musicdownloader] hook track bottomsheet 2022-07-13 04:23:58 +03:00
gdlbo 41229fbab0 Update OtherFragment.java 2022-07-13 01:10:50 +03:00
gdlbo 8fb885a373 some backup fixes 2022-07-13 01:03:04 +03:00
gdlbo dc294ccef0 added some icons 2022-07-13 00:50:17 +03:00
Vologhat 24ef392b1c added restore prefs from file 2022-07-13 00:30:37 +03:00
Vologhat da1efc7261 optimizations 2022-07-12 23:58:00 +03:00
Vologhat c42245abf3 added vkme mode checker 2022-07-12 23:49:53 +03:00
Vologhat 76dc857a43 fixed dockbar counter 2022-07-12 23:14:51 +03:00
gdlbo df11c3b517 icons fix 2022-07-12 23:11:45 +03:00
Vologhat f6500096fa refactored icon switcher 2022-07-12 23:08:41 +03:00
gdlbo 792c0afe06 added all to manifest 2022-07-12 23:04:29 +03:00
gdlbo 11f7faa0ad some fixes 2022-07-12 22:45:14 +03:00
gdlbo 75f03ac207 icon changer test
appname cursed
2022-07-12 21:55:20 +03:00
gdlbo b1df22d207 added resources 2022-07-12 19:32:50 +03:00
gdlbo 47737a72f8 null check 2022-07-12 18:29:59 +03:00
gdlbo 0331bcfa7b network check 2022-07-12 18:27:35 +03:00
gdlbo 0928227fac some fragments in dockbar fixes 2022-07-12 17:42:46 +03:00
gdlbo 8fbc961f47 superapp disabler fix 2022-07-12 17:34:04 +03:00
gdlbo 1f667b4133 new vkpay lol 2022-07-12 17:25:02 +03:00
gdlbo 379d6aab8e some sticker fixes 2022-07-12 16:28:00 +03:00
gdlbo 82e164b351 some filter fixes 2022-07-12 16:15:11 +03:00
gdlbo f4ca06d27e added some effects) 2022-07-12 15:49:02 +03:00
gdlbo a1fe7bb5db some filters fix + added more filters codebase 2022-07-12 15:21:05 +03:00
aliveoutside f01d5efa92 use track id as a temp folder name 2022-07-12 17:37:08 +03:00
gdlbo 9d0e607c0b monochrome wp 2022-07-12 14:14:10 +03:00
gdlbo 413c58c936 mosaic effect 2022-07-12 13:46:04 +03:00
gdlbo c83b6e4c76 fixed crash 2022-07-12 12:42:09 +03:00
gdlbo c5d1e73dc6 some fragments fixes 2022-07-12 12:12:48 +03:00
gdlbo 35d8b6106d restart app when dark theme changed to amoled 2022-07-12 11:11:47 +03:00
gdlbo 6d9f0b9413 restart app when milkshake val changed 2022-07-12 11:00:18 +03:00
gdlbo 2d98e6c40b disabled force dark theme for miui 2022-07-12 10:58:17 +03:00
gdlbo 10a300b614 fixed milkshake changer 2022-07-12 00:00:54 +03:00
gdlbo 902d50cef4 Update DockBarManager.java 2022-07-11 23:21:48 +03:00
Vologhat c518ce4482 Update DockBarManager.java 2022-07-11 21:59:05 +03:00
gdlbo 4d719e4308 codesyle cringe 2022-07-11 21:14:02 +03:00
gdlbo 5bd52c23ae lmao 2022-07-11 21:11:17 +03:00
gdlbo 2755c93147 fix dockbar 2022-07-11 20:58:45 +03:00
aliveoutside 25c5182877 create notifications for music downloading 2022-07-11 23:02:10 +03:00
gdlbo 5af8cb9745 Update BottomNavigationMenu.smali 2022-07-11 20:00:53 +03:00
gdlbo 45ca60570c Update CopyrightAds.txt 2022-07-11 19:57:37 +03:00
Vologhat d65334086e refactored dockbar editor 2022-07-11 19:57:03 +03:00
gdlbo c2b3e3f88e Update WallpaperMenuFragment.java 2022-07-11 19:35:07 +03:00
gdlbo 7b3b939cc6 Update WallpaperMenuFragment.java 2022-07-11 19:34:28 +03:00
gdlbo 0995366ae2 added stickers background if wallpaper is not null 2022-07-11 19:28:48 +03:00
gdlbo 16be89be00 fix dark toast lmao 2022-07-11 19:17:23 +03:00
gdlbo 3bf1a8d398 fixed dialog style 2022-07-11 19:11:51 +03:00
gdlbo 1e876a9217 fixed auth proxy dialog 2022-07-11 17:56:03 +03:00
aliveoutside 2d21a85259 check if ffmpeg converted successfully 2022-07-11 20:14:34 +03:00
aliveoutside 87ef92eff8 finish music downloader 2022-07-11 19:55:04 +03:00
aliveoutside 0e16bbf4f5 fix ts to mp3 converter 2022-07-11 19:26:05 +03:00
aliveoutside edb79e3d7d update ffmpeg libs for mp3 support 2022-07-11 19:25:41 +03:00
aliveoutside 1c6ba006b5 fix ffmpeg loading 2022-07-11 18:07:22 +03:00
gdlbo 6350dbc397 dialog design fixes 2022-07-11 14:36:22 +03:00
gdlbo 827ab9f82d disabled dockbar hook 2022-07-11 13:30:02 +03:00
gdlbo 587e729bdc added dev ver mark 2022-07-11 13:18:32 +03:00
gdlbo 851265e14a Update Globals.java 2022-07-11 13:13:17 +03:00
gdlbo b553ef1c75 fixed player on gappless phones 2022-07-11 13:08:37 +03:00
gdlbo 5570f8be88 added proxy button at start 2022-07-11 13:02:31 +03:00
gdlbo 775f4f12fe writebar coloring 2022-07-11 11:26:05 +03:00
gdlbo 1410aaf7ef Some animation fixes 2022-07-11 02:58:43 +03:00
gdlbo b85aece87b some wp fixes 2022-07-11 02:20:19 +03:00
gdlbo 4caf2f1e6e fixed some cringe blur 2022-07-11 01:38:22 +03:00
gdlbo 60eb78c27f Wallpaper in msg
Upgraded dialogs opening
2022-07-11 01:29:55 +03:00
aliveoutside 701edfa823 try to do ffmpeg convert 2022-07-11 01:34:28 +03:00
aliveoutside e234f3bce4 add some missing classes 2022-07-11 01:34:28 +03:00
aliveoutside f80241b5c0 add some missing classes 2022-07-11 01:34:27 +03:00
aliveoutside 9adc74ff46 update build.gradle 2022-07-11 01:34:27 +03:00
aliveoutside fbc4d054b0 add ffmpeg wrapper 2022-07-11 01:34:27 +03:00
aliveoutside 3676e1f568 add ffmpeg lib 2022-07-11 01:34:27 +03:00
aliveoutside 88832da5ea add libs to assets 2022-07-11 01:34:27 +03:00
gdlbo 2175dad72f Update GroupApiParser.smali 2022-07-10 19:16:43 +03:00
aliveoutside 7c45258976 fix permissions in AudioDownloader 2022-07-10 22:08:58 +03:00
gdlbo 01e1ccb4bf Renames for profiles and groups 2022-07-10 19:01:25 +03:00
gdlbo 966312373e Fix 2022-07-10 17:49:59 +03:00
gdlbo b1b06f480b menu inj test 2022-07-10 17:48:39 +03:00
Vologhat ea1252c07c add method check 2022-07-10 17:31:09 +03:00
Vologhat 871695731c added asyns downloading 2022-07-10 16:37:31 +03:00
gdlbo b7e1326489 Update vt_ui_oled.css 2022-07-10 16:03:42 +03:00
gdlbo d02ae1e212 amoled theme wtf 2022-07-10 16:01:04 +03:00
aliveoutside 6af700e187 test m3u8 downloader 2022-07-10 18:32:02 +03:00
gdlbo 01f0175467 fixed crash at start 2022-07-10 15:25:19 +03:00
gdlbo 86d85aec3c updated jars + added amoled theme values to code 2022-07-10 14:52:23 +03:00
aliveoutside c2001c24f6 move some stuff to music package 2022-07-10 17:35:10 +03:00
gdlbo 7726ad974c reformated code 2022-07-10 14:32:27 +03:00
Vologhat 1f859997f4 M3U8 Dumper 2022-07-10 14:11:27 +03:00
gdlbo 1c20fd4c19 Some online fixes 2022-07-10 10:54:25 +03:00
gdlbo bdee61948d Update OnlineFormatter.java 2022-07-10 04:05:03 +03:00
gdlbo 6c903dcd20 Update OnlineFormatter.java 2022-07-10 03:21:35 +03:00
gdlbo dd5cf0eace added appid saving + some fixes 2022-07-10 01:38:14 +03:00
aliveoutside c713d9a59b - Дашь списать домашку?
- Да, только не списывай точь-в-точь
-
2022-07-10 04:14:55 +03:00
gdlbo 2029447d86 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-07-10 01:08:41 +03:00
aliveoutside 81f225be5b m3u8 shit 2022-07-10 04:07:02 +03:00
gdlbo 6258e524d9 imports 2022-07-10 01:08:19 +03:00
gdlbo cf3ecaa325 Added local caching appid names 2022-07-10 01:07:55 +03:00
gdlbo 9c9afa9925 VideoDownloader inj 2022-07-09 22:40:56 +03:00
gdlbo 9ee1357b53 Fixed bug with reload mgs on old design on sdk 28+ 2022-07-09 22:18:28 +03:00
gdlbo cf376364ba Update StoryDownloader.java 2022-07-09 22:03:20 +03:00
gdlbo 0fa5a97661 Stories video downloader 2022-07-09 21:59:42 +03:00
gdlbo a3c7b2a6fb some stories download fixes 2022-07-09 21:24:35 +03:00
gdlbo a1cc6c5adf disabled fixGapps 2022-07-09 20:47:18 +03:00
gdlbo 86051d3b01 isMusicRestricted must be true by default 2022-07-09 20:26:49 +03:00
gdlbo 28e5bbf2de Update VideoDownloader.java 2022-07-09 20:22:38 +03:00
gdlbo 9373375a95 Update VideoDownloader.java 2022-07-09 20:19:05 +03:00
gdlbo 295f37b9f5 check if link is not valid 2022-07-09 20:18:31 +03:00
gdlbo 06c526ef74 Video downloader in settings 2022-07-09 20:09:02 +03:00
gdlbo d4f737167d updated jars 2022-07-09 19:48:22 +03:00
gdlbo 8c3be43f25 renamed music to media settings + some settings refactoring 2022-07-09 19:48:06 +03:00
gdlbo 880487f841 Update Newsfeed.java 2022-07-09 19:31:11 +03:00
gdlbo 2d73e10bbf Some settings logic fixes 2022-07-09 18:47:32 +03:00
gdlbo 6a37a8e9e4 fixed poll if 2022-07-09 16:03:28 +03:00
gdlbo 4868e506f3 show poll results 2022-07-09 15:58:38 +03:00
gdlbo db9721e96a updated jars 2022-07-09 15:58:18 +03:00
gdlbo 34c560e105 fix msg db 2022-07-09 15:26:37 +03:00
gdlbo c65f20f8bb Story downloader test
video download dead xd
2022-07-09 15:13:13 +03:00
gdlbo 0fefcafba8 updated jars 2022-07-09 15:12:45 +03:00
gdlbo 730e61836f Update NavigationDelegateBottom.smali 2022-07-08 14:29:07 +03:00
gdlbo f212fdcae8 VK Me mode inject 2022-07-08 14:10:27 +03:00
gdlbo 9acffafda0 kostil for dockbak lol 2022-07-08 13:58:26 +03:00
gdlbo 1a62889cb9 inj dockbar 2022-07-08 13:36:25 +03:00
gdlbo 4ff5ea9fec Fixed feed cache toggle 2022-07-08 11:03:15 +03:00
gdlbo 77bc356f4b Video redesign optional 2022-07-08 11:00:03 +03:00
gdlbo be5633f29c Update Toggles.java 2022-07-08 10:55:08 +03:00
gdlbo 1bf6c00e4c VTSettings fixes
fixed design
fixed proxy type null
2022-07-08 10:49:12 +03:00
gdlbo 9cc5eab93d Update DockBarManager.java 2022-07-08 10:35:26 +03:00
gdlbo 39bd57b3f6 Update DockBarManager.java 2022-07-08 10:31:35 +03:00
gdlbo a50452fb58 Update DockBarManager.java 2022-07-07 21:38:42 +03:00
gdlbo 63229b42c1 Fixed dockbar color?, fixed double vt icons 2022-07-07 20:37:49 +03:00
gdlbo 8e5f3ec3b6 fixed R.java.......... 2022-07-07 20:14:37 +03:00
gdlbo 61a4ef17a4 Revert "Update public.xml"
This reverts commit 0a3b6f5bc0.
2022-07-07 19:48:48 +03:00
gdlbo 4498d231ad IconManager manifest inject 2022-07-07 19:18:02 +03:00
gdlbo eb659dd453 Fixed AndroidManifest 2022-07-07 19:12:31 +03:00
Vologhat 7aa3205c79 Update R.java 2022-07-07 19:02:00 +03:00
gdlbo 3a49e3ba01 Update IconManager.java
fixed logic
2022-07-07 16:41:58 +03:00
gdlbo cb07a9c8dd Update IconManager.java 2022-07-07 16:40:40 +03:00
gdlbo bd8a20e64c Update IconManager.java 2022-07-07 16:33:14 +03:00
gdlbo dcb0471d33 Update IconManager.java 2022-07-07 16:30:24 +03:00
gdlbo 49c1ca45c8 IconManager codebase 2022-07-07 16:26:19 +03:00
aliveoutside e2ca160507 hook dockbar 2022-07-07 16:37:26 +03:00
gdlbo 0a3b6f5bc0 Update public.xml 2022-07-07 13:16:36 +03:00
gdlbo 2391174a0a Update R.java 2022-07-07 11:51:39 +03:00
gdlbo 1ddaa8d162 fix download icon for tgs 2022-07-07 11:39:29 +03:00
aliveoutside 54e5930e8d telegram stickers doesn't look like shit now 2022-07-07 04:58:27 +03:00
gdlbo dad839ca56 tgs inj 2022-07-06 18:07:49 +03:00
Vologhat 8d60831e65 fixed crashes in StickersFragment 2022-07-06 17:39:39 +03:00
gdlbo 837a888b37 some music fixes 2022-07-06 11:40:02 +03:00
gdlbo 39dae8f8e8 Update VTSettings.java 2022-07-06 10:04:57 +03:00
gdlbo 90761b1599 updated superapp in settings 2022-07-06 09:58:04 +03:00
Vologhat 75394d2239 fixed superapp injector 2022-07-05 20:51:02 +03:00
Vologhat bf3dab1585 fixed profile hiding 2022-07-05 20:43:20 +03:00
Vologhat f224645c9c optimizations 2022-07-05 20:11:06 +03:00
gdlbo 36a9d621b4 Update ProfileHide.java 2022-07-05 16:28:17 +03:00
gdlbo f1c2d2c95a profile hide inj test
profiles dead lmao
2022-07-05 16:25:01 +03:00
gdlbo b71581d48a Update JsonInjectors.java 2022-07-05 15:11:24 +03:00
gdlbo 81e85fba7e Update JsonInjectors.java 2022-07-05 15:00:31 +03:00
gdlbo ed6244919d upgraded convBar ext + added debug link 2022-07-05 14:51:44 +03:00
gdlbo 782ff2bb66 Update Proxy.java 2022-07-05 13:11:24 +03:00
gdlbo 2a02efec0d Update Proxy.java 2022-07-05 13:07:32 +03:00
gdlbo a74c48d8d0 proxy fixes 2022-07-05 13:02:24 +03:00
gdlbo 5054dbdc7d Some settings + proxy fixes 2022-07-03 14:11:33 +03:00
gdlbo 0db27e1690 Fix proxy summ for vt settings 2022-07-03 13:39:22 +03:00
gdlbo 93937be836 Fix crash for android 5, 5.1, 6 + added cute icon for superapp editor 2022-07-03 13:33:27 +03:00
gdlbo 2649b21ac7 fixed scaling pic 2022-07-02 14:00:54 +03:00
gdlbo d83dc9370d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-07-02 12:55:27 +03:00
gdlbo c3bae00331 fixed rounding pic 2022-07-02 12:55:17 +03:00
gdlbo 13b5ad11a8 Merge pull request #410 from k1zn/vtl-remaster 2022-07-02 08:19:27 +03:00
k1zn bf90cbd9ee Fix Russian music subscription string 2022-07-02 02:00:06 +05:00
k1zn ac25b978e3 Fix Ukrainian music subscription string 2022-07-02 01:59:30 +05:00
gdlbo 6549c3e51a music subs warning 2022-07-01 15:41:35 +03:00
gdlbo aa301b007c deleted useless feature 2022-07-01 15:37:59 +03:00
gdlbo d17663bb6e fixed loopedanimstickers pref 2022-07-01 14:55:31 +03:00
gdlbo 49ae2bdbe3 Loop anim stickers test 2022-07-01 14:45:05 +03:00
gdlbo f2bc513869 added more font sizes 2022-07-01 14:29:52 +03:00
gdlbo 6abc2e4cf9 Fixes
Deleted unused code
Fixed some settings
Sorted toggles features
2022-07-01 14:24:16 +03:00
Vologhat 0fba48dd73 added backup settings in test mode 2022-06-30 19:47:11 +03:00
gdlbo 9fa484d378 fixed some toggles 2022-06-30 17:55:09 +03:00
gdlbo 697189a2b9 superapp editor test 2022-06-30 17:40:20 +03:00
gdlbo b39493bd3d Update JsonInjectors.java 2022-06-30 14:33:05 +03:00
Vologhat 44e1f1b265 fixed fox1d code 2022-06-30 14:20:31 +03:00
aliveoutside e73855a830 fix ne4italki popup menu 2022-06-30 01:59:33 +03:00
aliveoutside 4e50cf3f8d yes milkshake 2022-06-30 01:44:28 +03:00
gdlbo 7869a3163f startfragment inj 2022-06-29 20:31:31 +03:00
gdlbo 036e9939c7 Update SuperAppPresenter.smali 2022-06-29 20:29:27 +03:00
gdlbo b743f64b3e superapp inj
without superapp editor
2022-06-29 20:20:49 +03:00
gdlbo 0f40f58801 no shopping v2 2022-06-29 18:49:15 +03:00
gdlbo f52a20aa1a no shopping anymore in stock menu 2022-06-29 18:03:02 +03:00
gdlbo 158ca27531 Fixed crash in interface sett 2022-06-29 17:56:32 +03:00
gdlbo e48ed3aac6 fixed translation 2022-06-29 17:46:33 +03:00
gdlbo 733ed9daf0 More animations :) 2022-06-29 17:42:51 +03:00
gdlbo f15ea0ee00 Test fix anim crash in My Stickers 2022-06-29 17:41:29 +03:00
gdlbo e95bd7e3c1 anim inj 2022-06-29 17:08:51 +03:00
gdlbo af667093ef fixed imports 2022-06-29 16:49:15 +03:00
gdlbo 5b3c8fd9da fix 2022-06-29 16:40:44 +03:00
gdlbo cc76d48f00 deleted some unused code 2022-06-29 16:08:29 +03:00
gdlbo 994cfa9f21 do not seen stories inj 2022-06-29 16:03:17 +03:00
gdlbo cee15d5ebb showmenu inj 2022-06-29 15:46:25 +03:00
gdlbo 6fe72ebb9f disable videofeed inj 2022-06-29 15:39:50 +03:00
gdlbo a4cc33d3ce milkshake disabled by default + disabled welcome banner on milkshake 2022-06-29 15:29:13 +03:00
gdlbo 7eeb1c3bf2 fixed msgs 2022-06-29 13:49:43 +03:00
gdlbo ca49a100fa Maybe fix msg 2022-06-29 13:28:22 +03:00
gdlbo fd41df894f Update StandartFilter.txt 2022-06-29 12:02:39 +03:00
gdlbo 82b85e6bfd Refactored reposts adblock + updated filter 2022-06-29 11:53:24 +03:00
gdlbo b154e4c5f0 updated filters 2022-06-29 11:47:44 +03:00
gdlbo 03112dd9f7 some important fixes 2022-06-29 01:21:05 +03:00
aliveoutside ef51d5d2b9 update apktool 2022-06-28 19:57:25 +03:00
aliveoutside 58577e74f7 inject ne4italki into dialog menu 2022-06-28 19:57:25 +03:00
gdlbo 54aac33525 Updated Toggles 2022-06-28 01:27:44 +03:00
gdlbo b27cef0d1b Update Toggles.java 2022-06-28 01:05:45 +03:00
gdlbo 5dfc3b4f02 fixed crash in music + added disabler milkshake 2022-06-27 23:55:57 +03:00
aliveoutside 5acf70169c ne4italki 2022-06-27 20:54:04 +03:00
gdlbo 0e388f5888 toggles redirect 2022-06-27 19:45:51 +03:00
gdlbo 2a5c5cb24f ServerDialog disabler 2022-06-27 18:40:11 +03:00
gdlbo 58ec32be6f covbar inj test 2 2022-06-27 17:58:30 +03:00
gdlbo 21fb5fc48b covbar inj test 2022-06-27 16:47:41 +03:00
gdlbo d6fcafe8e0 fixed adfilter 2022-06-27 15:26:37 +03:00
gdlbo 95ade723f9 upgraded newsfeed ad posts detection
added support for reposts
refactored copyright posts detection
updated adblock filters
2022-06-27 15:15:42 +03:00
gdlbo de31594250 Update build.yml 2022-06-26 20:55:30 +03:00
gdlbo 0ff208c2f9 Messages -> Chats 2022-06-26 20:50:36 +03:00
gdlbo 92c69e3d97 Merge pull request #392 from iNotFlying/vtl-remaster 2022-06-26 17:49:40 +03:00
iNotFlying c065eaac6b Telegram icon fix 2022-06-26 18:47:55 +04:00
gdlbo fed9d76bcb Update FriendsGetRecommendationsWithMutual.smali 2022-06-26 17:04:33 +03:00
gdlbo fdb9819ca9 Merge pull request #391 from iNotFlying/vtl-remaster 2022-06-26 16:40:12 +03:00
iNotFlying 90b773dd52 New icons 2022-06-26 16:35:03 +04:00
gdlbo 206ffd17c8 Update OnlineFormatter.java 2022-06-25 20:29:41 +03:00
gdlbo 5363378ea1 Update OnlineFormatter.java 2022-06-25 20:27:02 +03:00
gdlbo bee1e760b8 Update OnlineFormatter.java 2022-06-25 20:15:28 +03:00
gdlbo 996760489f updated Online Formatter 2022-06-25 20:13:58 +03:00
gdlbo 65af8e24c1 Custom online detection
need to do make requests to get appid name from vk
2022-06-25 19:39:34 +03:00
gdlbo d59ef7ddfe ServerDialog upgraded 2022-06-25 15:36:44 +03:00
gdlbo 9ab654b290 ServerDialog upgraded 2022-06-25 15:36:10 +03:00
gdlbo 7217e75a15 ServerDialog null check 2022-06-25 14:50:12 +03:00
gdlbo ae4847d056 ServerDialog impl 2022-06-25 14:41:42 +03:00
gdlbo 88b882c74d fixed verifications 2022-06-25 12:39:17 +03:00
gdlbo 7b12cb9922 fixed number rounding in groups 2022-06-25 12:28:12 +03:00
gdlbo 06a6d6e575 fixed number rounding in groups 2022-06-25 12:24:31 +03:00
gdlbo 20f043885a fixed crash 2022-06-25 12:13:18 +03:00
gdlbo 7ff5d24d10 fixes of music and debug 2022-06-25 12:05:22 +03:00
gdlbo 70059b25d8 fixes of music and debug 2022-06-25 12:05:15 +03:00
gdlbo a7f23c7b72 fixed crashreport icon 2022-06-25 12:01:26 +03:00
gdlbo c056add894 added install permission 2022-06-25 11:57:57 +03:00
gdlbo fbca333163 fixed ota requests 2022-06-25 11:55:56 +03:00
gdlbo 52b153ba82 deleted benchmark tracker + fixes 2022-06-25 11:46:05 +03:00
gdlbo 6b9bc3cdd9 deleted music tracker 2022-06-25 11:33:37 +03:00
gdlbo c6647ff807 fixed profile open 2022-06-25 11:11:34 +03:00
gdlbo b4c2d075ab fixed libvoip lib 2022-06-25 11:00:11 +03:00
gdlbo 4835485085 fixes of LinkProcessorKt 2022-06-25 10:52:05 +03:00
gdlbo 937b01e55b added some redirects to settings 2022-06-25 10:30:56 +03:00
gdlbo 3630b44d38 added support to open links from m.vk.com 2022-06-25 09:23:01 +03:00
gdlbo 086b07ace9 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-25 09:19:06 +03:00
gdlbo 1efdad97eb gmap fix + added needed activities and services 2022-06-25 09:18:56 +03:00
gdlbo 4bd2b31e1d gmap fix 2022-06-25 09:11:33 +03:00
aliveoutside 97cd94de4a vkx integration 2022-06-25 04:05:11 +03:00
gdlbo 820b9fd969 newsfeed filter inj to NewsfeedCustomGet 2022-06-25 01:06:00 +03:00
gdlbo a64f4d1377 stories ads inj 2022-06-25 00:30:01 +03:00
gdlbo 15e9b5c712 awayphp inj 2022-06-25 00:28:08 +03:00
gdlbo c8302d6024 added donate button 2022-06-25 00:22:15 +03:00
gdlbo cc98e5bdb8 inj refresh newsfeed 2022-06-24 23:44:39 +03:00
gdlbo 9f07840030 swipe stories inj 2022-06-24 23:41:28 +03:00
gdlbo 534bd61c3a dockcounter inj 2022-06-24 23:41:13 +03:00
gdlbo e68847ca77 alteremoji inj 2022-06-24 23:33:31 +03:00
gdlbo 8a91ccd47e system emoji inj 2022-06-24 23:26:06 +03:00
aliveoutside e082511d59 fix init 2022-06-24 23:21:45 +03:00
gdlbo 146d4d42e8 fixed some settings logic for stupid users 2022-06-24 23:20:43 +03:00
gdlbo d364b2c87a added date formatter + deleted some unused code 2022-06-24 23:14:51 +03:00
gdlbo 257b2e33f2 chat count load inj + fixes 2022-06-24 22:54:56 +03:00
gdlbo b6afe6f5db date formatter in chats 2022-06-24 22:53:28 +03:00
gdlbo d6959cd074 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-24 22:37:47 +03:00
gdlbo 96f752c6ac value rounding 2022-06-24 22:37:40 +03:00
aliveoutside f8fa4b6c67 hooked stories disabler 2022-06-24 22:13:48 +03:00
gdlbo db7a94a10c shortpost 2022-06-24 22:07:18 +03:00
gdlbo 6aa9eef8ea fixed dialogs load 2022-06-24 20:27:43 +03:00
gdlbo dac5053eb5 upped vk ver 2022-06-24 20:02:23 +03:00
gdlbo c0a3a6c54f getDrawableFromUrl fix 2022-06-24 19:41:08 +03:00
gdlbo b2a34380b6 fix summ in feed 2022-06-24 13:31:16 +03:00
gdlbo 1237a9f8ac added filter for copyright links 2022-06-24 13:27:59 +03:00
aliveoutside 0a6d00b4ab Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-24 13:03:11 +03:00
gdlbo 27c8a1575f added filter for copyright links 2022-06-24 11:54:35 +03:00
gdlbo f7a137537c fixed ads in discover 2022-06-24 11:43:38 +03:00
gdlbo 8953ee1f7f added app version to about 2022-06-24 10:49:25 +03:00
gdlbo 8da5f35c33 renamed some strings 2022-06-24 10:39:31 +03:00
gdlbo 0bc2d2b896 added proxied static and oauth + refactored by copilot 2022-06-24 10:37:49 +03:00
gdlbo 3167dfab09 vk api proxy inj 2022-06-24 09:38:57 +03:00
gdlbo 6c1130aed2 voice inject 2022-06-24 09:31:29 +03:00
gdlbo bded70f6c6 pic compress inject 2022-06-24 09:27:27 +03:00
gdlbo 097a6feeb7 pic compress inject 2022-06-24 09:27:18 +03:00
aliveoutside bd2d49de85 implement messages undeleter (via reflection for now) 2022-06-24 03:56:12 +03:00
gdlbo 4dd43961d4 changed codestyle 2022-06-23 17:31:32 +03:00
gdlbo 9c968d1f4f added reload msg feature 2022-06-23 00:56:32 +03:00
gdlbo 261592a6b3 added multiacc + updated jars 2022-06-23 00:19:57 +03:00
gdlbo a5b45c318d fixed ru locale 2022-06-22 23:27:42 +03:00
gdlbo d50f42a8b0 fixed ssl by default 2022-06-22 23:22:14 +03:00
gdlbo 1ec2e1dd4b fixed some settings 2022-06-22 23:21:02 +03:00
gdlbo 62bd5588e3 ru locale 2022-06-22 23:20:32 +03:00
gdlbo 1c6fd7050d fixed auto detect theme + fixes of debug 2022-06-22 23:09:05 +03:00
gdlbo 94a5ddcc5f fixed workflow compiling 2022-06-22 23:00:55 +03:00
gdlbo 5b756b0c7a fixed windows compiling 2022-06-22 23:00:26 +03:00
gdlbo d940bb63d6 fixed proxy tab 2022-06-22 22:59:33 +03:00
gdlbo 4610626cc7 fixed auth + added old prefs to debug 2022-06-22 22:52:28 +03:00
gdlbo 09704a2f0f updated jars 2022-06-22 20:44:08 +03:00
gdlbo bce4952254 updated themes and disabled auto theme (dead) 2022-06-22 20:43:57 +03:00
gdlbo 4b7fb82710 fixes themes 2022-06-22 19:34:20 +03:00
gdlbo acb06b6953 fixed cringe logs 2022-06-22 19:16:13 +03:00
gdlbo c11bee25d1 added vkui inj + upgraded vkui coloring and theme changing 2022-06-22 18:55:45 +03:00
gdlbo 7543021cff fixed opening vk id and bugtracker 2022-06-22 18:33:00 +03:00
aliveoutside 019c29bfae fix crashing tgstickers fragment 2022-06-22 18:12:17 +03:00
gdlbo 1c7e010aa2 fixed icons 2022-06-22 18:04:46 +03:00
gdlbo a7c9b7dd58 added new params 2022-06-22 17:58:57 +03:00
gdlbo 8e0ff61597 added old icons 2022-06-22 17:56:34 +03:00
aliveoutside 8d5cc68a87 update icons in settings 2022-06-22 17:29:51 +03:00
gdlbo 3e765ba22c fixed FriendsGetRecommendationsWithMutual.smali 2022-06-22 16:49:13 +03:00
gdlbo bea91dd654 newsfeed inj 2022-06-22 16:43:18 +03:00
gdlbo d14f9a7a4d added offline and news injector 2022-06-22 16:41:41 +03:00
gdlbo 8694d39dcb fixed auto cleaning cache 2022-06-22 14:51:22 +03:00
gdlbo 7c808f608f fixed settings opening 2022-06-22 14:47:26 +03:00
gdlbo 42856485fc verifications 2022-06-22 14:21:52 +03:00
gdlbo 76e768dda8 navbar coloring (s0v@ killer tbh) 2022-06-22 12:37:44 +03:00
gdlbo 59d243bb5b deleted video/msg reporter 2022-06-22 12:14:22 +03:00
gdlbo 3a6cd04a84 fix network 2022-06-22 12:08:56 +03:00
gdlbo 4b0bc25e0b deleted vk ui analytics and anr 2022-06-22 11:52:38 +03:00
gdlbo 2ef6206599 deleted app start duration checker 2022-06-22 11:41:29 +03:00
gdlbo e092da882c deleted vk analytics reporter 2022-06-22 11:35:00 +03:00
gdlbo 9c10b06390 deleted my tracker 2022-06-22 11:29:40 +03:00
gdlbo 65208fba3c Deleted crashlytics 2022-06-22 11:17:00 +03:00
gdlbo 36d13cdd72 fixed strings compiling 2022-06-22 10:25:27 +03:00
gdlbo f9c3484c0e Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-22 10:21:33 +03:00
gdlbo f8e22cbfbc inited new version + app name 2022-06-22 10:21:17 +03:00
aliveoutside 5da7f8e2f4 add settings 2022-06-22 04:58:42 +03:00
gdlbo c7bfc871c1 added Toggles.java with hook 2022-06-22 01:23:00 +03:00
aliveoutside fd26567990 fix not loading messages 2022-06-22 04:06:51 +03:00
aliveoutside d27e304136 update jars 2022-06-22 03:55:21 +03:00
aliveoutside 7f91075a92 hide DeletedMessagesHandler for now 2022-06-22 03:54:57 +03:00
aliveoutside 4436c1d9f1 update buildscripts 2022-06-22 03:54:34 +03:00
aliveoutside 69822b4071 fix ModalBottomSheetWrapper 2022-06-22 03:44:08 +03:00
gdlbo 91117a5dea added Toggles.java with hook 2022-06-22 00:42:42 +03:00
gdlbo 2a1b799f7e fix Toggles.java 2022-06-22 00:17:14 +03:00
gdlbo 119d759105 added Toggles.java 2022-06-22 00:13:13 +03:00
aliveoutside b94462fdf0 fix galo4ki 2022-06-22 02:07:39 +03:00
aliveoutside 2820a132d8 fix OTAHelper 2022-06-22 02:07:39 +03:00
gdlbo 46625fdecc fixed imports and Themes.java 2022-06-21 23:05:33 +03:00
Vologhat 3ec0cfad4d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:55:08 +03:00
aliveoutside 6e08ec86ae fix DeletedMessagesHandler 2022-06-22 01:52:15 +03:00
Vologhat 125abe9e36 extended ReflectionUtils 2022-06-21 22:54:44 +03:00
gdlbo eaf94aa97f Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:38:15 +03:00
aliveoutside 8a0c0f61f5 fix DockBarFragment 2022-06-22 01:31:01 +03:00
aliveoutside a49efd7403 fix otadownloader 2022-06-22 01:24:48 +03:00
aliveoutside 6196b828c3 fix net/request 2022-06-22 01:18:00 +03:00
aliveoutside 7a5421706e fix ExternalLinkHandler 2022-06-22 01:13:58 +03:00
gdlbo 43f62669e9 debuggable true 2022-06-21 22:36:49 +03:00
gdlbo f1d77a639c fixed setup with official vk 2022-06-21 22:36:18 +03:00
gdlbo b2e6f55487 Merge branch 'vtl-remaster' of https://github.com/vtosters/lite into vtl-remaster 2022-06-21 20:40:46 +03:00
aliveoutside c6b520fb65 fix dnr and dnt 2022-06-21 23:39:00 +03:00
aliveoutside e5d5447957 remove okhttp request 2022-06-21 23:39:00 +03:00
aliveoutside 3048b098b5 fix foaf 2022-06-21 23:39:00 +03:00
gdlbo b71430f135 fixes refl theme 2022-06-21 20:40:29 +03:00
gdlbo 20bae023d9 fixes refl theme 2022-06-21 20:38:10 +03:00
aliveoutside 9fd973c496 fix materialfragment is settings 2022-06-21 23:14:56 +03:00
aliveoutside 97ed8000b8 add activity to manifest 2022-06-21 23:14:56 +03:00
aliveoutside c7f18e434f fix materialfragment 2022-06-21 23:14:56 +03:00
gdlbo 6d5b9dd188 Update R.java 2022-06-21 20:14:42 +03:00
aliveoutside af59a13dd9 update jars 2022-06-21 23:00:13 +03:00
aliveoutside 771ac02c77 Revert "fixes private/public"
This reverts commit c49e985013.
2022-06-21 22:51:21 +03:00
aliveoutside 925065b317 dev mode 2022-06-21 22:37:24 +03:00
aliveoutside 2893050504 ssl 2022-06-21 22:28:30 +03:00
gdlbo 849a48597c Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 19:16:12 +03:00
aliveoutside ab85d0b03a enable music 2022-06-21 22:13:58 +03:00
aliveoutside 7ce2dd95e2 disable calls 2022-06-21 22:13:57 +03:00
gdlbo 07032c21db fixes analytics 2022-06-21 19:16:07 +03:00
gdlbo 9cb56466c8 fixes private/public 2022-06-21 19:11:41 +03:00
gdlbo c49e985013 fixes private/public 2022-06-21 19:08:51 +03:00
aliveoutside fbd3f1798a Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:01:12 +03:00
aliveoutside 66a53f3486 спустя два дня пофиксили 2022-06-21 21:58:55 +03:00
aliveoutside 45acdecedc Revert "deobf"
This reverts commit 755268de
2022-06-20 00:31:48 +03:00
aliveoutside ec105f2b55 partially ifx 2022-06-20 00:19:11 +03:00
gdlbo 858c5b9342 fixes 2022-06-19 23:37:59 +03:00
gdlbo b548f6adf3 fixes 2022-06-19 20:44:33 +03:00
gdlbo 719147997c fixes 2022-06-19 20:13:27 +03:00
gdlbo 9489ddad5e added new fonts 2022-06-19 20:13:18 +03:00
gdlbo f479c36fcd fix 2022-06-19 19:28:04 +03:00
gdlbo 9a925e7100 fix 2022-06-19 19:17:30 +03:00
gdlbo 7e7f091ab5 fixes 2022-06-19 15:32:24 +03:00
aliveoutside 8aa6c41037 update r.java 2022-06-19 18:21:48 +03:00
gdlbo f30994b82e fixes 2022-06-19 14:52:27 +03:00
gdlbo 873b83cb31 fixes 2022-06-19 14:38:22 +03:00
aliveoutside 4a04f50f98 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 17:17:50 +03:00
aliveoutside ff31cb0377 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 17:01:32 +03:00
aliveoutside 8c16e3dc42 fix preferences 2022-06-19 16:57:53 +03:00
aliveoutside 799d06dd10 fix preferences 2022-06-19 16:54:07 +03:00
gdlbo 985a2b30c6 fixes 2022-06-19 14:17:37 +03:00
gdlbo 66a8c909ee Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 14:01:28 +03:00
gdlbo 6439021fc2 fixes 2022-06-19 14:01:24 +03:00
gdlbo 0a09423e10 fixed all res 2022-06-19 13:11:07 +03:00
gdlbo 119ae933e2 added resources + fixed animfrag 2022-06-19 12:47:35 +03:00
aliveoutside 1fd27c5acf add assests 2022-06-19 07:05:35 +03:00
aliveoutside e3f338c91f update jars 2022-06-19 07:03:08 +03:00
aliveoutside 39723bcf5b remove multiacc (it's already in the client) 2022-06-19 07:02:55 +03:00
aliveoutside d570a77bd5 fix StickersPreferencesFragment 2022-06-19 06:59:52 +03:00
aliveoutside 7b1fcfb15a fix DeletedMessagesHandler 2022-06-19 06:52:32 +03:00
aliveoutside 17ba841440 add update jars script 2022-06-19 06:49:32 +03:00
aliveoutside 6ea830cbc7 fix verifications 2022-06-19 05:57:58 +03:00
aliveoutside 179b1769ae fix vkx 2022-06-19 05:53:17 +03:00
aliveoutside 3cae6da5d7 fix settings 2022-06-19 05:49:10 +03:00
aliveoutside b1ce420393 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 05:44:34 +03:00
aliveoutside a8d1bdc8a8 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 05:30:56 +03:00
aliveoutside f9d0d239b8 fix messages settings 2022-06-19 05:03:00 +03:00
aliveoutside 877153a998 fix 2022-06-19 04:54:56 +03:00
aliveoutside 35c7c4c08d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 04:48:03 +03:00
aliveoutside e3340a76db fix video downloader 2022-06-19 04:42:43 +03:00
aliveoutside 94cef1b5f8 deobf 2022-06-19 04:32:02 +03:00
gdlbo ecc224776e fixes 2022-06-19 02:44:29 +03:00
gdlbo 7deb1bba58 fixes 2022-06-19 02:13:23 +03:00
gdlbo 7ff965c73d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 02:06:52 +03:00
gdlbo 9cc136bfda fixes 2022-06-19 02:06:47 +03:00
gdlbo 8ef0aeef13 fixes 2022-06-19 01:47:55 +03:00
gdlbo d906c1103b fixes 2022-06-19 00:27:34 +03:00
gdlbo 7bfdc6255c dev mode 2022-06-18 23:52:54 +03:00
gdlbo c5162a05aa music + ssl v2 2022-06-18 23:29:48 +03:00
gdlbo d5353a87dc ssl + debug check 2022-06-18 23:29:05 +03:00
aliveoutside 3072531c24 rename 2022-06-18 23:01:03 +03:00
aliveoutside d87ff342d4 disable calls 2022-06-18 20:04:41 +03:00
aliveoutside 3266b8ccd6 fix music 2022-06-18 20:01:17 +03:00
aliveoutside 03cc03b6bf fix buildscripts 2022-06-18 20:01:07 +03:00
aliveoutside 2df8cc5f2a add new files 2022-06-18 19:27:15 +03:00
aliveoutside 8fd7116759 init new ver 2022-06-18 19:12:50 +03:00
gdlbo bd4310e6e8 fixed deleting acc 2022-06-17 22:52:50 +03:00
gdlbo dfa7ba031e shakal mode 2022-06-17 19:49:41 +03:00
gdlbo 6ddea672ad fixed multi account 2022-06-17 19:27:35 +03:00
gdlbo 047378a11d updated gh actions script 2022-06-17 19:13:27 +03:00
gdlbo 3420c4abb0 added compress disabler 2022-06-17 19:10:57 +03:00
gdlbo 15a8d70f5f added compress disabler 2022-06-17 19:08:37 +03:00
gdlbo 91f90a6609 Merge remote-tracking branch 'origin/master' 2022-06-17 18:35:06 +03:00
gdlbo e170b70999 added auto cleaning cache 2022-06-17 18:35:01 +03:00
gdlbo b489011d24 Merge pull request #342 from k1zn/master
Fix avatar position on tablet
2022-06-17 18:27:20 +03:00
gdlbo 58adfbd261 added auto cleaning cache 2022-06-17 18:21:10 +03:00
Erik Kiznov 3bb18b6daf Fix README.md 2022-06-17 20:09:03 +05:00
Erik Kiznov 120bf18416 Fix avatar position on tablet 2022-06-17 19:36:42 +05:00
Vologhat 428c4ef7d6 changed buttons style 2022-06-17 17:12:26 +03:00
gdlbo 40fc05fc15 fix foxbin.f0x1d.com/enotik 2022-06-17 15:12:59 +03:00
gdlbo 2e913223a2 fix 2022-06-17 14:54:47 +03:00
gdlbo 48f12a912c fix 99% problems on android 11 and lower 2022-06-17 14:19:27 +03:00
gdlbo 0228c0b8a1 fixed colors 2022-06-17 13:58:41 +03:00
gdlbo ba07aeb4d7 fix vk icon in menu 2022-06-17 13:53:17 +03:00
gdlbo 529b13f18b fixed crash android 5.1 2022-06-17 13:34:40 +03:00
gdlbo 5720fddb59 fix crash MusicFragment 2022-06-16 23:30:08 +03:00
gdlbo f5c80b230a gcmfix v2 is here 2022-06-16 22:46:07 +03:00
gdlbo 87ee01bac9 gcmfix v2 is here 2022-06-16 22:32:00 +03:00
gdlbo 126ad044f2 gcmfix v2 is here 2022-06-16 22:30:00 +03:00
gdlbo b636648457 counters is back 2022-06-16 21:58:13 +03:00
gdlbo bf3672a8c4 fix rounded msg + improved vkme msg mode 2022-06-16 21:25:41 +03:00
gdlbo e6478d5161 fixed bg stickers issue 2022-06-16 21:14:13 +03:00
gdlbo ddea78aa4b VKID Protection alert in music settings 2022-06-16 20:25:02 +03:00
gdlbo b872fb17b8 VKID Protection alert 2022-06-16 19:38:18 +03:00
gdlbo 4ec2c17df1 VKID Protection alert 2022-06-16 19:35:45 +03:00
gdlbo 38a51f48d0 fix sharing action buttons 2022-06-16 17:05:42 +03:00
gdlbo 838897611c small fixes 2022-06-16 16:51:27 +03:00
gdlbo f42150063c small fixes 2022-06-16 16:37:35 +03:00
gdlbo d164d1219d verif icon coloring in dialogs 2022-06-16 16:24:23 +03:00
gdlbo fb71b4d781 toolbar fixes 2022-06-16 16:02:19 +03:00
gdlbo f338738c1e writebar fix 2022-06-16 14:16:46 +03:00
gdlbo fb704c7388 fix msg loading 2022-06-16 14:03:39 +03:00
gdlbo c99bca4200 online fixes 2022-06-16 13:18:09 +03:00
gdlbo 92f43acb80 fix 2022-06-16 09:12:39 +03:00
gdlbo a7c85a24f2 added signature check to detect github actions builds and etc 2022-06-16 01:26:07 +03:00
gdlbo fe5616b3f7 fixes 2022-06-16 01:06:11 +03:00
gdlbo 5c882c5ce2 fixes 2022-06-16 00:33:40 +03:00
gdlbo 61a4ed43b9 fixed toast 2022-06-16 00:15:31 +03:00
Vologhat b242ad7ae4 Merge branch 'ota' 2022-06-16 00:09:40 +03:00
Vologhat 1b02e806f8 Final fixes 2022-06-16 00:04:34 +03:00
gdlbo eaf23a24ba impossible color fix 2022-06-15 23:08:58 +03:00
gdlbo ce64296c01 kill androidx 2022-06-15 21:47:21 +03:00
Vologhat 6e3716fe01 final changes
added apk downloading and installing features, bottomshit wrapper with mirroring
2022-06-15 21:29:09 +03:00
gdlbo dcdd83243b color fixes 2022-06-15 21:11:30 +03:00
gdlbo 986ec2987c wtf debuggable must be false 2022-06-15 17:20:01 +03:00
gdlbo c98609db5d fixes 2022-06-15 17:13:18 +03:00
Vologhat 0b4e3c6303 added ota 2022-06-15 16:41:21 +03:00
gdlbo bc3e5a706d fixed auto theme 2022-06-15 07:59:10 +03:00
gdlbo 0b56d9dd23 fixes 2022-06-15 02:36:25 +03:00
gdlbo 62ccdf8eba upgraded new settings
refactored multi account counter
2022-06-15 02:13:33 +03:00
gdlbo 72f4226419 fixes 2022-06-14 23:48:07 +03:00
gdlbo f6a45beac5 isdarktheme now should work depending on the dark theme of the app v2 2022-06-14 13:26:47 +03:00
gdlbo a657ddef58 Merge pull request #313 from iNotFlying/master
New VK logo
2022-06-14 13:10:11 +03:00
gdlbo 726e38ff2e isdarktheme now should work depending on the dark theme of the app 2022-06-14 13:08:20 +03:00
iNotFlying 191d3f760e Some fixes 2022-06-14 10:48:25 +03:00
iNotFlying 2cd3b0f39c Merge branch 'vtosters:master' into master 2022-06-14 11:41:47 +04:00
gdlbo abd990eef7 injected new setting to default theme 2022-06-14 01:19:20 +03:00
gdlbo cd875af7d7 fixed dark theme in new settings 2022-06-14 01:07:17 +03:00
gdlbo b1e8f93371 fixed amoled css 2022-06-14 00:15:25 +03:00
gdlbo 64afd0222b amoled theme now is fully amoled theme 2022-06-14 00:11:33 +03:00
gdlbo 32369f1f38 fixes 2022-06-13 23:57:53 +03:00
gdlbo f00be506cc fixes 2022-06-13 22:49:22 +03:00
gdlbo 248fd1ce9c fixes 2022-06-13 22:40:10 +03:00
gdlbo 3e2d4bb665 vkme mode updated 2022-06-13 22:34:35 +03:00
iNotFlying 92689941ca New VK logo 2022-06-13 21:45:29 +03:00
gdlbo c46110cfea vkme mode updated 2022-06-13 21:07:16 +03:00
gdlbo b5250e0b8d vkme mode updated 2022-06-13 21:06:36 +03:00
gdlbo 0e81397305 vkme mode updated 2022-06-13 21:04:16 +03:00
gdlbo 95d306eaed vkme mode updated 2022-06-13 18:18:38 +03:00
gdlbo 339a4fe01f vkme mode updated 2022-06-13 12:38:50 +03:00
gdlbo 48cdbc7681 vkme mode updated 2022-06-13 12:20:21 +03:00
gdlbo 5e85ba10f4 vkme mode updated 2022-06-13 12:01:04 +03:00
gdlbo ea7dd7aba5 vkme mode test 2022-06-13 01:03:10 +03:00
gdlbo c60b766f37 test coloring bottomsheet 2022-06-12 20:02:15 +03:00
gdlbo da9ded2ae1 mini refactoring 2022-06-12 16:19:45 +03:00
gdlbo 29eb517bb9 fix https://github.com/vtosters/lite/issues/156 2022-06-12 15:44:05 +03:00
gdlbo 84a3f6caff fix 2022-06-12 01:49:10 +03:00
gdlbo b34821463a fix hardcoded text 2022-06-12 01:29:19 +03:00
gdlbo 127abbaaeb fix 2022-06-12 01:12:01 +03:00
gdlbo d462d42775 dropdown menu text color fix 2022-06-12 00:36:18 +03:00
gdlbo 5e80ad7e4e dropdown menu coloring!!!!!!! 2022-06-11 23:51:48 +03:00
gdlbo e1aadade5f fixes 2022-06-11 23:08:16 +03:00
gdlbo 77d6f5d977 fixes 2022-06-11 22:57:52 +03:00
gdlbo c4ae2ec0a3 fixes 2022-06-11 22:45:55 +03:00
gdlbo 07ee9269b7 fixes 2022-06-11 20:16:10 +03:00
gdlbo 3ee43f1c50 Animation fragment injector (beta) 2022-06-11 19:46:22 +03:00
gdlbo dd65196af9 fixed games button 2022-06-11 17:29:05 +03:00
gdlbo 5547de006b upgraded ColorStateList recoloring 2022-06-11 16:42:39 +03:00
gdlbo 0fbf571c60 some fixes of color inj 2022-06-11 15:24:04 +03:00
gdlbo f5f05697b6 Merge remote-tracking branch 'origin/master' 2022-06-11 14:26:43 +03:00
gdlbo 5f179f6a26 fixed search color 2022-06-11 14:26:39 +03:00
gdlbo 37c6d29e84 Fix string 2022-06-10 22:22:46 +03:00
gdlbo 0e81ba31cb fixed crash docs 2022-06-10 21:49:12 +03:00
gdlbo 1f24d32109 fixed crash docs 2022-06-10 21:37:52 +03:00
gdlbo ff16f84c43 some improves 2022-06-10 21:00:37 +03:00
gdlbo 5b929bf515 fixed issue with undelete by default (oops) 2022-06-10 19:42:20 +03:00
gdlbo bdcb3db238 fixed issue with dateformat value 2022-06-10 19:00:26 +03:00
gdlbo f7960b1695 Added an expanded view of the date format type selection
Full date in private messages
Minor improvements
Fixed a bug with anti-deletion of messages
2022-06-10 18:58:19 +03:00
gdlbo 825d1b95da improved disabling number shortening 2022-06-10 17:26:40 +03:00
gdlbo 0e7abaf3f0 fixed pic rounding 2022-06-10 16:40:50 +03:00
gdlbo 2731989ae8 fixed serach text coloring 2022-06-10 16:19:00 +03:00
gdlbo 5ad09e11df fixed casino moment 2022-06-10 16:17:32 +03:00
gdlbo 653d2eeeee fixed casino moment 2022-06-10 15:29:46 +03:00
gdlbo 756ad615ed fixed rounded msgs colors monet 2022-06-10 15:26:40 +03:00
gdlbo dd6abafad5 added pref disableanimstickers to debug 2022-06-09 00:04:14 +03:00
gdlbo 0434f06bb5 fixed some accents 2022-06-08 23:44:58 +03:00
gdlbo 50971098ad fixed accent vkim link 2022-06-08 23:26:30 +03:00
gdlbo 1787f10fca fixed load friends page 2022-06-08 22:58:52 +03:00
gdlbo 6d2684db70 added shadow in dialogs vkme 2022-06-08 21:18:05 +03:00
gdlbo f0f1b3a946 disabled divider in dialogs 2022-06-08 21:09:12 +03:00
gdlbo ae9b703726 fixed shadow 2022-06-08 20:55:19 +03:00
gdlbo 10512fb74b fixed shadow on 31 sdk+ 2022-06-08 20:47:52 +03:00
gdlbo ce9bdba30c sdk 31 rounded msgs 2022-06-08 20:29:30 +03:00
gdlbo 188c98589c amoled theme for rounded msgs 2022-06-08 19:55:11 +03:00
gdlbo e5fa42ff14 some fixes 2022-06-08 19:32:29 +03:00
gdlbo f42aa95003 init rounded msg for light theme 2022-06-08 19:26:01 +03:00
gdlbo b16dc816b6 added applying theme after restart 2022-06-08 19:25:01 +03:00
gdlbo b86fe4d65d init rounded msg for dark theme 2022-06-08 18:50:28 +03:00
gdlbo d7e17416f1 init rounded theme 2022-06-08 18:41:03 +03:00
gdlbo 91355f1dd5 fixed stickers time color 2022-06-08 18:28:56 +03:00
gdlbo ae9e3ed07c fixes some themes logic 2022-06-08 17:22:11 +03:00
gdlbo f701993b0f fixes + more translations 2022-06-08 15:14:34 +03:00
gdlbo c5bf617f65 fixes + more translations 2022-06-08 14:02:45 +03:00
gdlbo f09cae1684 fixes 2022-06-07 17:50:02 +03:00
gdlbo 99d7f06981 New feature open news settings via settings lmao 2022-06-07 11:56:23 +03:00
gdlbo eaaf7e2bbf fixed news logic 2022-06-07 11:26:29 +03:00
gdlbo 897382de2b Fixed some translations + fixed settings logic 2022-06-07 11:24:44 +03:00
gdlbo 55d02a8412 Fixed links 2022-06-07 10:51:24 +03:00
gdlbo 7733582238 Casino update from 7 to 5 2022-06-04 22:14:36 +03:00
gdlbo 754c8339df Added randomize to disable donate alert 2022-06-04 21:18:50 +03:00
gdlbo ebf7baaa65 fixed links + disable recomms 2022-06-04 20:36:00 +03:00
gdlbo 8b26b12813 Added donate banners lmao 2022-06-04 20:04:28 +03:00
gdlbo 5deb4186f9 Fixed market colors 2022-06-04 11:25:38 +03:00
gdlbo d3d501f94a Fix dark accent color on monet 2022-06-04 10:25:41 +03:00
gdlbo 634f1213d4 Merge pull request #283 from bxkr/master 2022-06-04 09:32:58 +03:00
Andrew 6fa97ee435 Update R.java 2022-06-04 06:10:16 +03:00
gdlbo 05b3342763 Fix pull requests building 2022-06-04 04:54:54 +03:00
Andrew d434f42d12 Preferences localization
- Added en,ru translations for hardcoded strings in preferences
- Updated public.xml
- Fixed some ru strings
2022-06-03 23:38:52 +03:00
gdlbo 084f13eda4 Fix actions compiling 2022-06-03 20:36:56 +03:00
gdlbo ed59b54618 Fix actions compiling 2022-06-03 20:33:29 +03:00
gdlbo df282b95ad fix some strings 2022-06-03 19:43:23 +03:00
gdlbo 1b38533c83 color fixes 2022-06-03 17:47:29 +03:00
gdlbo 8f4c370ab2 Update build.gradle 2022-06-03 16:00:11 +03:00
gdlbo 9360ea4d85 Color article fixes 2022-06-02 19:45:49 +03:00
gdlbo c87d6581c8 Color fixes 2022-06-02 19:28:16 +03:00
gdlbo 7133fc6c03 Disabled discover ads 2022-06-02 19:04:24 +03:00
gdlbo 46af5af250 Fix https://github.com/vtosters/lite/issues/266 2022-06-02 17:38:28 +03:00
gdlbo 5b9cc6778c Fixes 2022-06-02 16:42:45 +03:00
gdlbo 5260ad8243 Fixed comments load 2022-06-02 14:25:32 +03:00
gdlbo 2996772020 Updated gitignore 2022-06-02 14:02:37 +03:00
gdlbo d37534cb6b Fixed icon changing 2022-06-02 13:25:19 +03:00
gdlbo 92eb48c21e Fixed crash + fixed msg cache 2022-06-02 13:06:55 +03:00
gdlbo d9e867cb6e Refactoring of some code that suggested what to fix in the comments in our vk group 2022-06-02 12:33:52 +03:00
gdlbo f200c6e59a Refactoring of some code that suggested what to fix in the comments in our vk group 2022-06-02 11:20:11 +03:00
gdlbo c668f3bf9a Refactoring 2022-05-31 16:55:19 +03:00
gdlbo bd7afee09b added more documentations 2022-05-31 16:43:58 +03:00
gdlbo ff09a4aec0 Added our git links 2022-05-26 20:25:51 +03:00
gdlbo 1e6c60f2ed Fixed statusbar and navbar light coloring 2022-05-17 23:08:12 +03:00
gdlbo beedb1538d Poll fix 2022-05-17 20:05:16 +03:00
gdlbo 8463f9e963 Fixes 2022-05-17 18:40:56 +03:00
gdlbo ce8f88b8d4 reworked statusbar coloring 2022-05-17 00:35:39 +03:00
gdlbo ff7d080b5a fix music tabs 2022-05-16 22:38:57 +03:00
gdlbo 12ad83c607 reworked do not read 2022-05-16 21:50:32 +03:00
gdlbo cdf5d2c37c fixes 2022-05-16 21:27:59 +03:00
gdlbo 9af8e1729e copyright posts detect 2022-05-16 21:21:39 +03:00
gdlbo d5219ed322 Fixes + some imp of custom msg loader 2022-05-16 00:11:00 +03:00
gdlbo 7af9a72e77 Fixes 2022-05-15 21:23:48 +03:00
gdlbo 08817bde7e Reworked some cringe code 2022-05-15 21:11:25 +03:00
gdlbo d1e9aadd71 fixed white screamers (maybe) 2022-05-13 20:28:20 +03:00
gdlbo b6307182cd fixes 2022-05-13 19:59:36 +03:00
gdlbo cc70e55b53 Fix summ 2022-05-13 15:36:42 +03:00
gdlbo ed08e97a50 Color fixes 2022-05-13 15:12:02 +03:00
gdlbo 44904786d9 Some corrections 2022-05-13 14:13:36 +03:00
gdlbo 12b67ce189 color fix header 2022-05-13 14:10:18 +03:00
gdlbo 21b0edf092 Fixes 2022-05-13 14:05:00 +03:00
gdlbo 2adb446d80 Fix open notifs 2022-05-13 12:40:42 +03:00
gdlbo 60738458bb Fixes 2022-05-13 11:59:15 +03:00
gdlbo a591026258 Fix article custom verifs 2022-05-12 18:47:42 +03:00
gdlbo 1bab7fa17c Monet dockbar icons coloring 2022-05-12 18:04:12 +03:00
gdlbo 2713216728 Added more summaries 2022-05-12 16:50:30 +03:00
gdlbo f9a529275a System theme at start 2022-05-11 20:59:37 +03:00
gdlbo e992203b7c Some color fixes + upped default app version 2022-05-10 22:34:56 +03:00
gdlbo 0ed057d705 Added another cringe feature 2022-05-10 22:12:40 +03:00
gdlbo 9b70ca6faf Fixed doc upload 2022-05-10 21:27:25 +03:00
gdlbo 422c3e4a6c Fixed stats crash 2022-05-10 21:07:29 +03:00
gdlbo 6dac880d61 Custom opus lib bridges 2022-05-10 20:22:39 +03:00
gdlbo c911b2d64e Custom opus lib bridges 2022-05-10 20:18:59 +03:00
gdlbo 39f72f9058 Crashreporter fix 2022-05-10 14:35:33 +03:00
gdlbo 2bff354ad0 Amoled monet accent + color fixes 2022-05-10 14:11:14 +03:00
gdlbo cb55e9b96f Disabled stats.track*** 2022-05-10 13:53:14 +03:00
gdlbo 33f551d464 Fixed vk cringe refl 2022-05-10 13:26:00 +03:00
gdlbo 282fa7bdda Beautify code 2022-05-07 18:31:07 +03:00
gdlbo 0abd97e8e1 Deleted unused code 2022-05-07 11:16:22 +03:00
gdlbo 5dd616685d Decrypt 2022-05-06 14:50:02 +03:00
gdlbo aff99be92d Fixes 2022-05-06 14:05:23 +03:00
gdlbo c255f1e498 Undelete feature + fixes 2022-05-06 13:43:42 +03:00
gdlbo 70342daf07 Merge branch 'master' of https://github.com/vtosters/lite 2022-05-06 01:58:35 +03:00
gdlbo f95672e57d Encryption + Undelete code base 2022-05-06 01:57:33 +03:00
gdlbo 8f5da42df4 color fixes 2022-05-04 16:41:59 +03:00
gdlbo 4022903069 Fixed crash 2022-05-04 14:23:25 +03:00
gdlbo 4600c185e4 Added proxy user/pass auth 2022-05-04 13:12:39 +03:00
gdlbo 30e8ec0038 Update README.md 2022-05-03 23:45:37 +03:00
gdlbo 367b212ca3 Updated build gradle 2022-05-03 22:19:23 +03:00
gdlbo 6533feb62b Merge remote-tracking branch 'origin/master' 2022-05-03 22:11:35 +03:00
gdlbo 95ef37f6a3 Fix 2022-05-03 22:11:19 +03:00
Vologhat 6216c66d95 fix #204 (null pointer while account deleting) 2022-05-02 18:07:04 +03:00
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
gdlbo c7a226999f fixed some issues 2022-03-26 17:43:49 +03:00
gdlbo 1bea6d3f3e updated prefs 2022-03-26 17:03:58 +03:00
gdlbo ffa70d5684 updated README.md 2022-03-26 16:52:38 +03:00
gdlbo 8de9ea9c1b updated debug 2022-03-26 16:44:55 +03:00
gdlbo f8c4393074 updated README.md 2022-03-26 16:28:15 +03:00
gdlbo 79cada7128 Improvements + updated R.java and README.md 2022-03-26 16:27:02 +03:00
aliveoutside 4c40edd00c fix pinned dialogs loading 2022-03-26 16:17:37 +03:00
aliveoutside 20ab276cef fix "popular" videos 2022-03-26 15:44:24 +03:00
gdlbo 689f2d3876 libverify preference 2022-03-25 19:43:52 +03:00
gdlbo c403deb38d fix fix 2fa auth........ 2022-03-25 19:15:28 +03:00
gdlbo d90ecbb8d1 fixed versioning on macos/linux 2022-03-25 18:45:11 +03:00
gdlbo ae16a513ed fixed versioning on macos/linux 2022-03-25 18:30:26 +03:00
gdlbo 7339a28d92 updated README.md 2022-03-25 17:51:00 +03:00
gdlbo d544a633cc added bug report button 2022-03-25 17:28:14 +03:00
gdlbo a6b78dca57 fixed ssfs domain 2022-03-25 16:52:36 +03:00
gdlbo 7dd78345f1 fix Jetifier 2022-03-25 16:45:49 +03:00
gdlbo 0a67c2a910 fixed 2fa, fixed some issues with proxy, deleted xtrafrancyz proxy, fixed compiling, some other fixes 2022-03-25 16:42:25 +03:00
aliveoutside 4e9475a6eb update framework and add apksigner.jar 2022-03-25 16:16:13 +03:00
aliveoutside b5a6a8d027 fix crash when music download button clicked 2022-03-24 22:31:43 +03:00
aliveoutside 1e1869718f fix serverside features 2022-03-24 22:30:52 +03:00
aliveoutside ee69e29153 Update README.md 2022-03-24 19:59:23 +03:00
aliveoutside 137ba631af Update README.md 2022-03-24 19:41:44 +03:00
aliveoutside aa972fa5b3 init 2022-03-24 19:37:43 +03:00
440 changed files with 55581 additions and 56593 deletions
+27
View File
@@ -0,0 +1,27 @@
---
name: Bug Report
about: Заготовка для репорта багов
title: Ошибка обновлении ленты новостей
labels: bug
assignees: ''
---
**Опишите сам баг**
При обновлении новостей вылезает ошибка
**Опишите действия для воспроизведения ошибки**
1. Обновил ленту интересных новостей
2. Пролистал до конца страницы
**Опишите ожидаемый результат**
Интересная лента должна прогружать результаты
**Скриншот ошибки**
**Информация об устройстве:**
- Устройство: Samsung Galaxy J1 Mini
- OS: Android 9 | OneUi 3.0
- Коммит: fa12e8f (В О Приложении написана версия коммита)
**Дополнительная информация о баге или мыслях почему оно может происходить (если есть)**
+15
View File
@@ -0,0 +1,15 @@
---
name: Feature request
about: Предложение функции
title: Улучшение голосовых сообщений
labels: enhancement
assignees: ''
---
**Опишите вашу идею максимально подробно и понятно**
Необходима функция улучшения голосовых сообщений. Она значительно улучшит запись голосовых сообщений и собеседнику будет лучше слышно меня
**Опишите возможное решение/реализацию функции (если понимаете как это можно реализовать на Java/C++)**
**Остальные мысли о предложенной функции**
+78
View File
@@ -0,0 +1,78 @@
### Все функции модификации
* Лента
* Блокировка рекламы в ленте
* Блокировка постов через фильтры
* Возможность добавлять в вайтлист фильтров группы, чтобы в них не удалялись посты
* Возможность отключить рекомендации от ВК
* Медиаконтент
* Округление дат
* 1 января в 4:20
* 1 января в 4:20:00
* 1 января 2000 в 4:20:00
* Округление чисел
* Сокращение постов **(Показать полностью)**
* Результаты опросов без участия
* Возможность указывать папку для загрузки фото/видео/музыки/всего
* Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга)
* Возможность **кешировать музыку / автокешировать ее при прослушивании**
* Возможность выбирать раздел музыки, открываемый по умолчанию
* Возможность скачивать видео, очищать историю просмотра видео
* Возможность найти фотографию через поисковые системы
* Интеграция с <a href="https://vkx.app/">VK X</a>
* Возможность кешировать треки в приложении
* Сообщения
* Обои в сообщениях
* Возможность выключения кнопки записи голосовых сообщений
* Возможность скрыть блок рекомендаций в сообщениях
* Режим **VK Me**
* Возможность вернуть вкладку уведомлений для режима VK Me
* Встроенный переводчик текста для сообщений
* Возможность выбрать язык перевода
* Автоматический перевод ваших сообщений на выбранный язык
* Альтернативный дизайн эмодзи меню
* Возможность использовать системные эмодзи
* Возможнсть использовать Enter с аппаратной клавиатуры
* Панель ввода из приложения VK для iOS
* Telegram Стикеры
* Возможность загружать свои стикерпаки из Telegram во ВКонтакте
* Внешний вид
* Возможность отключать новый дизайн версий VK (Milkshake)
* Название заголовков в докбаре
* Возможность использовать акцент для иконок
* Возможность отключить счётчики в докбаре
* Смена иконки приложения (содержит много уникальных иконок для донатеров)
* Возможность покрасить панель навигации, веб-страницы
* Интерфейс
* Возможность отключить блок историй наверху ленты
* Возможность отключить боковую камеру в разделе «Новости»
* Возможность отключить блок «Что у вас нового?» в разделе «Новости»
* Возможность показывать лайки у постов справа
* Возможность менять стартовый раздел при запуске приложения
* Анимации фрагментов
* Возможность изменять размер закругления картинок (аватарок и прочего)
* Возможность отключить редизайн видеопостов
* Возможность отключить блок миниаппов/VK Pay/Superapp
* Возможность отключить сокращение названий разделов в меню
* Возможность скрыть блок рекомендаций друзей в разделе «Друзья»
* Возможность скрыть подписи в настройках
* Редактор докбара
* Редактор элементов Superapp
* Активность
* Возможность видеть удаленные сообщения
* Функционал, позволяющий оставаться в «оффлайне» (принудительный оффлайн/не отправлять статус онлайна и т.п.)
* Нечиталка/неписалка для ЛС/бесед/ботов/групп
* Возможность отключить информацию о том, что вы просмотрели историю/прослушали голосовое сообщение
* Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger
* Возможность сохранять настройки бесшумных сообщений/сообщений-бомбочек
* Отключить уведомление о том, что вы сделали скриншот в беседе
* Отключение редиректа через away.php
* Отключение отправки метрики
* Прокси
* Поддержка сторонних прокси, таких как: Zaborona, VikaMobile, рандомные прокси и прочие
* Возможность использовать **HTTP/HTTPS/SOCKS** прокси, менять домены **API/OAuth/Static**
* Другое
* Синхронизация контактов с VK
* Очистка кеша приложения (**всё/стикеры/изображения/видео/сообщения/WebView**)
* Автоочистка кеша при достижении указанного вами значения (**100/500 MB, 1/2/5 GB**)
* Функционал для **дебага приложения/бэкап возможности/верификации VTosters**
+46
View File
@@ -0,0 +1,46 @@
<svg width="306" height="48" viewBox="0 0 306 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M85.5063 24.1875C87.475 23.2688 88.7437 21.7375 88.7437 19.375C88.7437 15.7875 85.4625 13.25 80.7375 13.25H69.8438V36H81.2188C86.1188 36 89.5313 33.3313 89.5313 29.7C89.5313 26.9438 87.7375 24.8875 85.5063 24.1875ZM80.7375 17.4063C82.4875 17.4063 83.7125 18.4563 83.7125 19.9C83.7125 21.3438 82.4875 22.35 80.7375 22.35H74.875V17.4063H80.7375ZM74.875 31.8438V26.2875H81.2188C83.1875 26.2875 84.5 27.425 84.5 29.0875C84.5 30.75 83.1875 31.8438 81.2188 31.8438H74.875Z" fill="white"/>
<path d="M104.403 36V17.8438H112.278V13.25H91.4966V17.8438H99.3716V36H104.403Z" fill="white"/>
<path d="M125.768 36.4375C132.899 36.4375 137.931 31.5375 137.931 24.625C137.931 17.7125 132.899 12.8125 125.768 12.8125C118.637 12.8125 113.606 17.7125 113.606 24.625C113.606 31.5375 118.637 36.4375 125.768 36.4375ZM125.768 31.8438C121.656 31.8438 118.856 28.9125 118.856 24.625C118.856 20.3375 121.656 17.4063 125.768 17.4063C129.881 17.4063 132.681 20.3375 132.681 24.625C132.681 28.9125 129.881 31.8438 125.768 31.8438Z" fill="white"/>
<path d="M152.848 36.4375C157.617 36.4375 162.123 33.9875 163.83 29.2188L159.105 28.4313C158.098 30.4438 155.867 31.8438 153.155 31.8438C149.086 31.8438 146.242 28.8688 146.242 24.625C146.242 20.3813 149.086 17.4063 153.155 17.4063C155.78 17.4063 157.967 18.7625 158.93 20.7313L163.655 19.9438C161.992 15.2625 157.705 12.8125 152.848 12.8125C145.892 12.8125 140.992 17.7563 140.992 24.625C140.992 31.4938 145.892 36.4375 152.848 36.4375Z" fill="white"/>
<path d="M177.633 36V17.8438H185.508V13.25H164.727V17.8438H172.602V36H177.633Z" fill="white"/>
<path d="M210.461 24.3625C210.461 17.8 205.561 12.8125 198.648 12.8125C191.736 12.8125 186.836 17.7563 186.836 24.625C186.836 31.4938 191.736 36.4375 198.648 36.4375C203.373 36.4375 207.836 34.2063 209.542 29.875L204.817 29.0875C203.723 30.7063 201.623 31.8438 198.954 31.8438C195.104 31.8438 192.567 29.4813 192.086 25.9813H210.373C210.417 25.5 210.461 24.975 210.461 24.3625ZM198.648 17.1875C201.798 17.1875 204.161 19.2 204.992 22.0438H192.392C193.223 19.1125 195.586 17.1875 198.648 17.1875Z" fill="white"/>
<path d="M219.412 44.9688V32.5438C220.987 34.425 223.831 36.4375 227.812 36.4375C234.331 36.4375 238.925 31.4938 238.925 24.625C238.925 17.7563 234.331 12.8125 227.812 12.8125C223.656 12.8125 220.769 15 219.194 16.925L218.144 13.25H214.381V44.9688H219.412ZM226.587 31.9313C222.344 31.9313 219.412 28.9125 219.412 24.625C219.412 20.3375 222.344 17.3188 226.587 17.3188C230.787 17.3188 233.675 20.3375 233.675 24.625C233.675 28.9125 230.787 31.9313 226.587 31.9313Z" fill="white"/>
<path d="M253.849 36.4375C258.618 36.4375 263.124 33.9875 264.831 29.2188L260.106 28.4313C259.099 30.4438 256.868 31.8438 254.156 31.8438C250.087 31.8438 247.243 28.8688 247.243 24.625C247.243 20.3813 250.087 17.4063 254.156 17.4063C256.781 17.4063 258.968 18.7625 259.931 20.7313L264.656 19.9438C262.993 15.2625 258.706 12.8125 253.849 12.8125C246.893 12.8125 241.993 17.7563 241.993 24.625C241.993 31.4938 246.893 36.4375 253.849 36.4375Z" fill="white"/>
<g clip-path="url(#clip0_428_625)">
<path d="M12.6749 41.8159H9.53384C8.99172 41.8159 8.55225 42.2554 8.55225 42.7975V47.0184C8.55225 47.5605 8.99172 48 9.53384 48H12.6749C13.2171 48 13.6565 47.5605 13.6565 47.0184V42.7975C13.6565 42.2554 13.2171 41.8159 12.6749 41.8159Z" fill="#9C9C9C"/>
<path d="M23.8649 41.8159H20.7238C20.1817 41.8159 19.7422 42.2554 19.7422 42.7975V47.0184C19.7422 47.5605 20.1817 48 20.7238 48H23.8649C24.407 48 24.8465 47.5605 24.8465 47.0184V42.7975C24.8465 42.2554 24.407 41.8159 23.8649 41.8159Z" fill="#9C9C9C"/>
<path d="M39.6686 41.8159H36.5275C35.9854 41.8159 35.5459 42.2554 35.5459 42.7975V47.0184C35.5459 47.5605 35.9854 48 36.5275 48H39.6686C40.2107 48 40.6502 47.5605 40.6502 47.0184V42.7975C40.6502 42.2554 40.2107 41.8159 39.6686 41.8159Z" fill="#9C9C9C"/>
<path d="M50.859 41.8159H47.7179C47.1758 41.8159 46.7363 42.2554 46.7363 42.7975V47.0184C46.7363 47.5605 47.1758 48 47.7179 48H50.859C51.4012 48 51.8406 47.5605 51.8406 47.0184V42.7975C51.8406 42.2554 51.4012 41.8159 50.859 41.8159Z" fill="#9C9C9C"/>
<path d="M38.7852 4.37598H16.503C15.6899 4.37598 15.0306 5.03519 15.0306 5.84837V25.4803C15.0306 26.2935 15.6899 26.9527 16.503 26.9527H38.7852C39.5984 26.9527 40.2576 26.2935 40.2576 25.4803V5.84837C40.2576 5.03519 39.5984 4.37598 38.7852 4.37598Z" fill="#FECE12"/>
<path d="M38.7855 4.37598H19.0554C18.2422 4.37598 17.583 5.03519 17.583 5.84837V25.4803C17.583 26.2935 18.2422 26.9527 19.0554 26.9527H38.7855C39.5986 26.9527 40.2578 26.2935 40.2578 25.4803V5.84837C40.2578 5.03519 39.5986 4.37598 38.7855 4.37598Z" fill="#FD9115"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1335 8.28128C19.7782 8.14803 19.5982 7.75197 19.7315 7.39665C19.7315 7.39665 19.7316 7.39619 19.7318 7.39572L19.7319 7.39538C19.732 7.39518 19.7322 7.39479 19.7322 7.39479L19.7323 7.39425L19.7325 7.39387C19.7326 7.39353 19.7327 7.3932 19.7328 7.39286L19.7335 7.39123C19.7338 7.39043 19.7341 7.38959 19.7344 7.38875C19.7353 7.38647 19.7363 7.38406 19.7373 7.38152C19.7375 7.38088 19.7378 7.38023 19.738 7.37958C19.7407 7.37307 19.7437 7.36574 19.7472 7.35764C19.7541 7.34146 19.7629 7.32218 19.7737 7.30029C19.7953 7.25658 19.8252 7.20196 19.8654 7.14044C19.9456 7.01743 20.0681 6.86517 20.2472 6.71899C20.6184 6.41618 21.1776 6.18456 21.9718 6.21511C22.937 6.25224 23.4046 6.85229 23.6912 7.22007L23.7019 7.23384C24.0007 7.61706 24.0827 7.68699 24.3012 7.68699C24.6147 7.68699 24.7594 7.57228 25.1058 7.28263C25.4712 6.97695 25.9872 6.55817 26.9024 6.55816C27.3396 6.55816 27.6971 6.65327 28.0026 6.81173C28.2952 6.96356 28.513 7.16121 28.6682 7.30401C28.9881 7.59832 29.0893 7.68698 29.3564 7.68698C29.681 7.68698 29.9319 7.53706 30.3702 7.24055L30.4105 7.21321C30.8055 6.94538 31.3766 6.55814 32.1539 6.55815C32.9977 6.55816 33.4997 7.00806 33.8227 7.29944C34.1698 7.61244 34.2741 7.68699 34.4608 7.68698C34.6387 7.68698 34.7881 7.58812 35.1711 7.23256C35.1852 7.2194 35.1999 7.20567 35.2151 7.19147C35.526 6.90098 36.0503 6.41092 36.8165 6.41092C37.5494 6.41092 38.0909 6.77863 38.4193 7.09126C38.5863 7.25042 38.7122 7.40793 38.7968 7.52599C38.8395 7.58557 38.8728 7.63659 38.8965 7.67478C38.9084 7.69391 38.9179 7.70996 38.9252 7.72239C38.9288 7.7286 38.9319 7.73393 38.9343 7.7383C38.935 7.73942 38.9356 7.74048 38.9361 7.74148L38.9376 7.74413C38.9381 7.74499 38.9385 7.74577 38.9389 7.7465L38.9395 7.74755L38.9398 7.74803C38.9399 7.74823 38.94 7.74849 38.94 7.74849C39.123 8.08101 39.0016 8.49881 38.6691 8.68169C38.3376 8.86402 37.9214 8.74401 37.7375 8.41378C37.7361 8.41135 37.7333 8.40671 37.7293 8.40012C37.7197 8.38463 37.7031 8.35896 37.6798 8.32651C37.6325 8.26054 37.562 8.17264 37.4714 8.08639C37.2844 7.90825 37.0653 7.78515 36.8165 7.78515C36.6387 7.78515 36.4891 7.88404 36.1061 8.23958C36.0919 8.25279 36.0772 8.26656 36.0619 8.2808C35.7511 8.57129 35.2268 9.06122 34.4608 9.06122C33.7146 9.06123 33.2417 8.62953 32.956 8.36866L32.9559 8.36855C32.9372 8.35157 32.9194 8.33531 32.9024 8.31995C32.5997 8.0469 32.439 7.93238 32.1539 7.93238C31.8293 7.93237 31.5785 8.08229 31.1402 8.3788C31.127 8.38769 31.1137 8.39674 31.1001 8.40593C30.7052 8.67377 30.1339 9.06122 29.3564 9.06122C28.541 9.06122 28.0824 8.63527 27.7867 8.36062C27.7699 8.34502 27.7536 8.32988 27.7378 8.31536C27.5863 8.17597 27.4851 8.0914 27.3697 8.03158C27.2672 7.9784 27.1278 7.93239 26.9024 7.93239C26.4925 7.9324 26.2968 8.07803 25.9874 8.33677C25.9725 8.34919 25.9573 8.36196 25.9418 8.37504L25.9417 8.37514C25.6135 8.65136 25.1264 9.06123 24.3012 9.06123C23.3796 9.06123 22.9207 8.46907 22.6505 8.12042C22.6395 8.10612 22.6287 8.09223 22.6182 8.07881C22.3395 7.72125 22.2176 7.59982 21.9189 7.58833C21.437 7.56979 21.2109 7.70628 21.1159 7.78384C21.0619 7.82784 21.031 7.86884 21.0162 7.89153C21.0121 7.8977 21.0094 7.90239 21.0078 7.90523C20.8654 8.24322 20.4801 8.41124 20.1335 8.28128ZM21.0133 7.89175L21.0141 7.88973C21.0146 7.88854 21.0151 7.88728 21.0156 7.88595C21.0157 7.88576 21.0157 7.88557 21.0158 7.88538C21.0161 7.88452 21.0165 7.88362 21.0169 7.88269L21.0173 7.88139C21.0156 7.88578 21.0139 7.89015 21.0122 7.89448L21.0133 7.89175ZM37.7382 8.41496C37.7387 8.41581 37.7388 8.41595 37.7384 8.41533L37.7382 8.41496Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1335 11.5866C19.7782 11.4533 19.5982 11.0573 19.7315 10.7019C19.7315 10.7019 19.7316 10.7015 19.7318 10.701L19.732 10.7005L19.7322 10.7001C19.7322 10.6998 19.7324 10.6995 19.7325 10.6992C19.7326 10.6989 19.7327 10.6985 19.7328 10.6982L19.7334 10.6966C19.7338 10.6958 19.7341 10.6949 19.7344 10.694C19.7352 10.692 19.7361 10.6899 19.7369 10.6877L19.738 10.6849C19.7407 10.6784 19.7437 10.671 19.7472 10.6629C19.7541 10.6468 19.7629 10.6275 19.7737 10.6056C19.7953 10.5619 19.8252 10.5073 19.8654 10.4457C19.9456 10.3227 20.0681 10.1705 20.2472 10.0243C20.6184 9.72148 21.1776 9.48987 21.9718 9.52041C22.937 9.55754 23.4046 10.1576 23.6912 10.5254L23.7019 10.5391C24.0007 10.9224 24.0827 10.9923 24.3012 10.9923C24.6147 10.9923 24.7594 10.8776 25.1058 10.5879C25.4712 10.2823 25.9872 9.86347 26.9024 9.86347C27.3396 9.86346 27.6971 9.95856 28.0026 10.117C28.2952 10.2689 28.513 10.4665 28.6682 10.6093C28.9881 10.9036 29.0893 10.9923 29.3564 10.9923C29.681 10.9923 29.9319 10.8424 30.3702 10.5459C30.3822 10.5377 30.3944 10.5295 30.4068 10.5211L30.4105 10.5185C30.8055 10.2507 31.3766 9.86344 32.1539 9.86345C32.9977 9.86346 33.4997 10.3134 33.8227 10.6047C34.1698 10.9177 34.2741 10.9923 34.4608 10.9923C34.6387 10.9923 34.7881 10.8934 35.1711 10.5379C35.1852 10.5247 35.1999 10.511 35.215 10.4969L35.2151 10.4968C35.526 10.2063 36.0503 9.71622 36.8165 9.71622C37.5494 9.71622 38.0909 10.0839 38.4193 10.3966C38.5863 10.5557 38.7122 10.7132 38.7968 10.8313C38.8395 10.8909 38.8728 10.9419 38.8965 10.9801C38.9084 10.9992 38.9179 11.0153 38.9252 11.0277C38.9265 11.03 38.9278 11.0321 38.9289 11.0342C38.931 11.0377 38.9328 11.0408 38.9343 11.0436C38.9351 11.0449 38.9357 11.0461 38.9364 11.0472C38.9368 11.048 38.9372 11.0487 38.9376 11.0494C38.938 11.05 38.9383 11.0506 38.9386 11.0512L38.9389 11.0518L38.9395 11.0528L38.9398 11.0533C38.9399 11.0535 38.8965 10.9801 38.8965 10.9801L38.94 11.0538C39.123 11.3863 39.0016 11.8041 38.6691 11.987C38.3376 12.1693 37.9214 12.0493 37.7376 11.7192C37.7362 11.7168 37.7334 11.7121 37.7293 11.7054C37.7197 11.6899 37.7031 11.6643 37.6798 11.6318C37.6325 11.5658 37.562 11.4779 37.4714 11.3917C37.2844 11.2135 37.0653 11.0904 36.8165 11.0904C36.6387 11.0904 36.4891 11.1893 36.1061 11.5449C36.0919 11.5581 36.0772 11.5719 36.0619 11.5861C35.7511 11.8766 35.2268 12.3665 34.4608 12.3665C33.7146 12.3665 33.2417 11.9348 32.956 11.674L32.9558 11.6738C32.9372 11.6568 32.9194 11.6406 32.9024 11.6252C32.5997 11.3522 32.439 11.2377 32.1539 11.2377C31.8293 11.2377 31.5785 11.3876 31.1402 11.6841C31.127 11.693 31.1136 11.7021 31.1001 11.7113C30.7052 11.9791 30.1339 12.3665 29.3564 12.3665C28.541 12.3665 28.0824 11.9406 27.7867 11.6659C27.7699 11.6503 27.7536 11.6352 27.7378 11.6207C27.5863 11.4813 27.4851 11.3967 27.3697 11.3369C27.2672 11.2837 27.1278 11.2377 26.9024 11.2377C26.4925 11.2377 26.2968 11.3833 25.9874 11.6421L25.9738 11.6535C25.9691 11.6574 25.9643 11.6614 25.9595 11.6654C25.9536 11.6704 25.9477 11.6754 25.9417 11.6804C25.6134 11.9567 25.1264 12.3665 24.3012 12.3665C23.3796 12.3665 22.9207 11.7744 22.6505 11.4257C22.6395 11.4114 22.6287 11.3975 22.6182 11.3841C22.3395 11.0265 22.2176 10.9051 21.9189 10.8936C21.437 10.8751 21.2109 11.0116 21.1159 11.0891C21.0619 11.1331 21.031 11.1741 21.0162 11.1968C21.0121 11.203 21.0094 11.2077 21.0078 11.2105C20.8654 11.5485 20.4801 11.7165 20.1335 11.5866ZM21.0122 11.1998L21.0133 11.1971L21.0146 11.1938L21.0156 11.1913L21.0158 11.1908C21.0161 11.1899 21.0164 11.189 21.0169 11.188L21.0173 11.1867C21.0157 11.1911 21.0139 11.1954 21.0122 11.1998ZM37.7386 11.7209C37.7387 11.7211 37.7387 11.721 37.7384 11.7206L37.7386 11.7209Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1335 14.8258C19.7782 14.6926 19.5982 14.2966 19.7315 13.9412C19.7315 13.9412 19.7316 13.9407 19.7318 13.9402C19.7318 13.9402 19.7321 13.9397 19.7322 13.9394C19.7322 13.939 19.7324 13.9387 19.7325 13.9384L19.7326 13.938C19.7327 13.9378 19.7328 13.9376 19.7328 13.9374C19.733 13.937 19.7331 13.9366 19.7333 13.9362C19.7337 13.9353 19.7341 13.9343 19.7344 13.9333C19.7349 13.9321 19.7354 13.931 19.7358 13.9298L19.7372 13.9262L19.738 13.9241C19.7407 13.9177 19.7437 13.9103 19.7472 13.9022C19.7541 13.8861 19.7629 13.8668 19.7737 13.8449C19.7953 13.8011 19.8252 13.7465 19.8654 13.685C19.9456 13.562 20.0681 13.4097 20.2472 13.2636C20.6184 12.9607 21.1776 12.7291 21.9718 12.7597C22.937 12.7968 23.4046 13.3968 23.6912 13.7646L23.7019 13.7784C24.0007 14.1616 24.0827 14.2316 24.3012 14.2316C24.6147 14.2316 24.7594 14.1168 25.1058 13.8272C25.4712 13.5215 25.9872 13.1027 26.9024 13.1027C27.3396 13.1027 27.6971 13.1978 28.0026 13.3563C28.2952 13.5081 28.513 13.7058 28.6682 13.8486C28.9881 14.1428 29.0893 14.2316 29.3564 14.2316C29.681 14.2316 29.9319 14.0816 30.3702 13.7851L30.4105 13.7578C30.8055 13.4899 31.3766 13.1027 32.1539 13.1027C32.9977 13.1027 33.4997 13.5526 33.8227 13.844C34.1698 14.157 34.2741 14.2316 34.4608 14.2316C34.6387 14.2316 34.7881 14.1326 35.1711 13.7771C35.1852 13.764 35.1999 13.7502 35.2151 13.736C35.526 13.4455 36.0503 12.9555 36.8165 12.9555C37.5494 12.9555 38.0909 13.3232 38.4193 13.6358C38.5863 13.795 38.7122 13.9525 38.7968 14.0706C38.8395 14.1301 38.8728 14.1811 38.8965 14.2193C38.9084 14.2385 38.9179 14.2546 38.9252 14.2669L38.9311 14.2771L38.9343 14.2828L38.9357 14.2853L38.9376 14.2887C38.9379 14.2892 38.9382 14.2897 38.9384 14.2902C38.9386 14.2905 38.9388 14.2908 38.9389 14.2911L38.9392 14.2916L38.9395 14.2921L38.9398 14.2926L38.94 14.293C39.123 14.6256 39.0016 15.0434 38.6691 15.2262C38.3382 15.4082 37.9228 15.289 37.7385 14.96C37.7387 14.9603 37.7386 14.9602 37.7386 14.9602L37.7385 14.96L37.7384 14.9599L37.7383 14.9597L37.7381 14.9594C37.7376 14.9585 37.7366 14.9568 37.7352 14.9545C37.7337 14.952 37.7317 14.9487 37.7293 14.9447C37.7197 14.9292 37.7031 14.9035 37.6798 14.8711C37.6325 14.8051 37.562 14.7172 37.4714 14.631C37.2844 14.4528 37.0653 14.3297 36.8165 14.3297C36.6387 14.3297 36.4891 14.4286 36.1061 14.7841C36.0919 14.7973 36.0772 14.8111 36.062 14.8253C35.7511 15.1158 35.2269 15.6058 34.4608 15.6058C33.7147 15.6058 33.2418 15.1742 32.9561 14.9133C32.9374 14.8963 32.9195 14.8799 32.9024 14.8645C32.5997 14.5914 32.439 14.477 32.1539 14.477C31.8293 14.477 31.5785 14.6269 31.1402 14.9234C31.127 14.9323 31.1136 14.9414 31.0999 14.9507C30.705 15.2185 30.1338 15.6058 29.3564 15.6058C28.541 15.6058 28.0824 15.1798 27.7867 14.9052L27.7865 14.905C27.7698 14.8895 27.7536 14.8744 27.7378 14.8599C27.5863 14.7205 27.4851 14.636 27.3697 14.5761C27.2672 14.5229 27.1278 14.477 26.9024 14.477C26.4925 14.477 26.2968 14.6226 25.9874 14.8813C25.9725 14.8938 25.9572 14.9066 25.9416 14.9197C25.6134 15.196 25.1263 15.6058 24.3012 15.6058C23.3796 15.6058 22.9207 15.0136 22.6506 14.665L22.6474 14.6609C22.6374 14.648 22.6277 14.6355 22.6182 14.6233C22.3395 14.2658 22.2176 14.1444 21.9189 14.1329C21.437 14.1144 21.2109 14.2508 21.1159 14.3284C21.0619 14.3724 21.031 14.4134 21.0162 14.4361C21.0121 14.4422 21.0094 14.4469 21.0078 14.4498C20.8654 14.7878 20.4801 14.9559 20.1335 14.8258ZM21.0123 14.4389L21.0133 14.4363L21.0141 14.4344C21.0146 14.4332 21.0151 14.4319 21.0156 14.4306L21.0162 14.429C21.0149 14.4323 21.0136 14.4356 21.0123 14.4389ZM21.0066 14.4519C21.0064 14.4524 21.0062 14.4528 21.0062 14.4528C21.006 14.4531 21.0062 14.4528 21.0066 14.4519ZM21.0173 14.4261L21.0164 14.4283L21.0169 14.4272C21.017 14.4269 21.0171 14.4265 21.0173 14.4261Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.7315 17.4268C19.5982 17.7821 19.7782 18.1782 20.1335 18.3115C20.4801 18.4414 20.8654 18.2734 21.0078 17.9354C21.0094 17.9326 21.0121 17.9279 21.0162 17.9217C21.031 17.899 21.0619 17.858 21.1159 17.814C21.2109 17.7365 21.437 17.6 21.9189 17.6185C22.2176 17.63 22.3395 17.7514 22.6182 18.109C22.6286 18.1223 22.6393 18.1361 22.6503 18.1502L22.6505 18.1506C22.9207 18.4993 23.3796 19.0914 24.3012 19.0914C25.1264 19.0914 25.6135 18.6815 25.9417 18.4053C25.9573 18.3922 25.9725 18.3794 25.9874 18.3669C26.2968 18.1082 26.4925 17.9626 26.9024 17.9626C27.1278 17.9626 27.2672 18.0086 27.3697 18.0618C27.4851 18.1216 27.5863 18.2061 27.7378 18.3455C27.746 18.353 27.7542 18.3607 27.7626 18.3684C27.7705 18.3758 27.7786 18.3832 27.7867 18.3908C28.0824 18.6654 28.541 19.0914 29.3564 19.0914C30.1339 19.0914 30.7052 18.7039 31.1001 18.4361L31.101 18.4355C31.1143 18.4265 31.1273 18.4177 31.1402 18.409C31.5785 18.1125 31.8293 17.9625 32.1539 17.9626C32.439 17.9626 32.5997 18.0771 32.9024 18.3501C32.9195 18.3655 32.9373 18.3818 32.956 18.3988C33.2417 18.6597 33.7146 19.0914 34.4608 19.0914C35.2268 19.0914 35.7511 18.6015 36.0619 18.311L36.0623 18.3106C36.0774 18.2965 36.092 18.2829 36.1061 18.2698C36.4891 17.9142 36.6387 17.8153 36.8165 17.8153C37.0653 17.8153 37.2844 17.9384 37.4714 18.1166C37.562 18.2028 37.6325 18.2907 37.6798 18.3567C37.7031 18.3891 37.7197 18.4148 37.7293 18.4303C37.7333 18.4369 37.7361 18.4415 37.7375 18.444C37.9214 18.7742 38.3376 18.8942 38.6691 18.7119C39.0016 18.529 39.123 18.1112 38.94 17.7787L38.9398 17.7782L38.9395 17.7777L38.9389 17.7767L38.9384 17.7756C38.9382 17.7753 38.9381 17.7751 38.9379 17.7748L38.9376 17.7743L38.9364 17.7721C38.9358 17.771 38.9351 17.7698 38.9343 17.7685C38.9319 17.7641 38.9288 17.7588 38.9252 17.7526C38.9179 17.7401 38.9084 17.7241 38.8965 17.705C38.8728 17.6668 38.8395 17.6158 38.7968 17.5562C38.7122 17.4381 38.5863 17.2806 38.4193 17.1214C38.0909 16.8088 37.5494 16.4411 36.8165 16.4411C36.0503 16.4411 35.526 16.9312 35.2151 17.2216C35.1999 17.2358 35.1852 17.2496 35.1711 17.2627C34.7881 17.6183 34.6387 17.7172 34.4608 17.7172C34.2741 17.7172 34.1698 17.6426 33.8227 17.3296C33.4997 17.0382 32.9977 16.5883 32.1539 16.5883C31.3766 16.5883 30.8055 16.9756 30.4105 17.2434C30.3969 17.2527 30.3834 17.2618 30.3702 17.2707C29.9319 17.5672 29.681 17.7172 29.3564 17.7172C29.0893 17.7172 28.9881 17.6285 28.6682 17.3342C28.513 17.1914 28.2952 16.9937 28.0026 16.8419C27.6971 16.6834 27.3396 16.5883 26.9024 16.5883C25.9872 16.5883 25.4712 17.0071 25.1058 17.3128C24.7594 17.6025 24.6147 17.7172 24.3012 17.7172C24.0827 17.7172 24.0007 17.6472 23.7019 17.264L23.6912 17.2502C23.4046 16.8825 22.937 16.2824 21.9718 16.2453C21.1776 16.2147 20.6184 16.4464 20.2472 16.7492C20.0681 16.8953 19.9456 17.0476 19.8654 17.1706C19.8252 17.2321 19.7953 17.2868 19.7737 17.3305C19.7629 17.3524 19.7541 17.3716 19.7472 17.3878C19.7437 17.3959 19.7407 17.4032 19.738 17.4098L19.7373 17.4117C19.7363 17.4143 19.7353 17.4167 19.7344 17.4189C19.7341 17.4197 19.7338 17.4205 19.7335 17.4212L19.7335 17.4214C19.7332 17.422 19.733 17.4225 19.7328 17.423C19.7327 17.4234 19.7326 17.4237 19.7325 17.424L19.7325 17.4241C19.7323 17.4244 19.7322 17.4247 19.7322 17.425C19.7322 17.425 19.732 17.4253 19.732 17.4255L19.7318 17.4259C19.7316 17.4264 19.7315 17.4268 19.7315 17.4268ZM21.0133 17.9219L21.0122 17.9247C21.0139 17.9203 21.0156 17.916 21.0173 17.9116L21.0169 17.9129C21.0164 17.914 21.016 17.9151 21.0156 17.9161C21.0151 17.9174 21.0146 17.9187 21.0142 17.9198L21.0133 17.9219ZM21.0066 17.9376C21.0064 17.938 21.0062 17.9384 21.0062 17.9384C21.006 17.9387 21.0062 17.9384 21.0066 17.9376ZM37.7382 18.4451C37.7387 18.446 37.7388 18.4461 37.7384 18.4455L37.7382 18.4451Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.7315 20.7321C19.5982 21.0874 19.7782 21.4835 20.1335 21.6168C20.4801 21.7467 20.8654 21.5787 21.0078 21.2407C21.0094 21.2379 21.0121 21.2332 21.0162 21.227C21.031 21.2043 21.0619 21.1633 21.1159 21.1193C21.2109 21.0418 21.437 20.9053 21.9189 20.9238C22.2176 20.9353 22.3395 21.0567 22.6182 21.4143C22.624 21.4217 22.6298 21.4292 22.6358 21.4368C22.6406 21.4431 22.6456 21.4494 22.6505 21.4559C22.9207 21.8046 23.3796 22.3967 24.3012 22.3967C25.1264 22.3967 25.6134 21.9868 25.9417 21.7106C25.9573 21.6975 25.9725 21.6847 25.9874 21.6722C26.2968 21.4135 26.4925 21.2679 26.9024 21.2679C27.1278 21.2679 27.2672 21.3139 27.3697 21.3671C27.4851 21.4269 27.5863 21.5114 27.7378 21.6508C27.7535 21.6652 27.7696 21.6802 27.7863 21.6957L27.7867 21.6961C28.0824 21.9708 28.541 22.3967 29.3564 22.3967C30.1339 22.3967 30.7052 22.0093 31.1001 21.7414C31.1136 21.7322 31.127 21.7232 31.1402 21.7143C31.5785 21.4178 31.8293 21.2679 32.1539 21.2679C32.439 21.2679 32.5997 21.3824 32.9024 21.6554C32.9194 21.6708 32.9372 21.687 32.9558 21.7039L32.956 21.7041C33.2417 21.965 33.7146 22.3967 34.4608 22.3967C35.2268 22.3967 35.7511 21.9068 36.0619 21.6163C36.0772 21.602 36.0919 21.5883 36.1061 21.5751C36.4891 21.2195 36.6387 21.1206 36.8165 21.1206C37.0653 21.1206 37.2844 21.2437 37.4714 21.4219C37.562 21.5081 37.6325 21.596 37.6798 21.662C37.7031 21.6944 37.7197 21.7201 37.7293 21.7356C37.7334 21.7423 37.7362 21.747 37.7376 21.7494C37.9215 22.0795 38.3376 22.1995 38.6691 22.0172C39.0016 21.8343 39.123 21.4165 38.94 21.084C38.94 21.084 38.9399 21.0837 38.9398 21.0835L38.9395 21.083L38.9389 21.082L38.9383 21.0807C38.9381 21.0804 38.9379 21.08 38.9376 21.0796C38.9367 21.0779 38.9356 21.076 38.9343 21.0738C38.9319 21.0694 38.9288 21.0641 38.9252 21.0579C38.9179 21.0454 38.9084 21.0294 38.8965 21.0103C38.8728 20.9721 38.8395 20.921 38.7968 20.8615C38.7122 20.7434 38.5863 20.5859 38.4193 20.4267C38.0909 20.1141 37.5494 19.7464 36.8165 19.7464C36.0503 19.7464 35.526 20.2365 35.2151 20.5269L35.2147 20.5274C35.1996 20.5414 35.1851 20.555 35.1711 20.568C34.7881 20.9236 34.6387 21.0225 34.4608 21.0225C34.2741 21.0225 34.1698 20.9479 33.8227 20.6349C33.4997 20.3435 32.9977 19.8936 32.1539 19.8936C31.3766 19.8936 30.8055 20.2809 30.4105 20.5487C30.3969 20.5579 30.3834 20.5671 30.3702 20.576C29.9319 20.8725 29.681 21.0225 29.3564 21.0225C29.0893 21.0225 28.9881 20.9338 28.6682 20.6395C28.513 20.4967 28.2952 20.299 28.0026 20.1472C27.6971 19.9887 27.3396 19.8936 26.9024 19.8936C25.9872 19.8936 25.4712 20.3124 25.1058 20.6181C24.7594 20.9078 24.6147 21.0225 24.3012 21.0225C24.0827 21.0225 24.0007 20.9525 23.7019 20.5693L23.6912 20.5555C23.4046 20.1878 22.937 19.5877 21.9718 19.5506C21.1776 19.52 20.6184 19.7517 20.2472 20.0545C20.0681 20.2006 19.9456 20.3529 19.8654 20.4759C19.8252 20.5374 19.7953 20.5921 19.7737 20.6358C19.7629 20.6577 19.7541 20.6769 19.7472 20.6931C19.7437 20.7012 19.7407 20.7085 19.738 20.7151L19.7366 20.7189C19.7358 20.7207 19.7351 20.7225 19.7344 20.7242C19.7341 20.7251 19.7338 20.7259 19.7335 20.7267L19.7328 20.7283C19.7328 20.7286 19.7327 20.7288 19.7326 20.729L19.7325 20.7294C19.7324 20.7297 19.7322 20.73 19.7322 20.7303L19.732 20.7307L19.7318 20.7312L19.7315 20.7321ZM21.0133 21.2272L21.0122 21.23C21.0139 21.2256 21.0157 21.2212 21.0173 21.2168L21.0169 21.2182C21.0164 21.2193 21.016 21.2204 21.0156 21.2214C21.0151 21.2227 21.0146 21.2239 21.0142 21.2251L21.0133 21.2272ZM21.0066 21.2429C21.0064 21.2433 21.0062 21.2437 21.0062 21.2437C21.006 21.244 21.0062 21.2437 21.0066 21.2429ZM37.7386 21.7511C37.7387 21.7513 37.7387 21.7512 37.7384 21.7508L37.7386 21.7511Z" fill="#E65C28"/>
<path d="M44.4787 0H22.0984C21.2852 0 20.626 0.659213 20.626 1.47239V21.1043C20.626 21.9175 21.2852 22.5767 22.0984 22.5767H44.4787C45.2919 22.5767 45.9511 21.9175 45.9511 21.1043V1.47239C45.9511 0.659213 45.2919 0 44.4787 0Z" fill="#FECE12"/>
<path d="M44.4783 0H24.7483C23.9351 0 23.2759 0.659213 23.2759 1.47239V21.1043C23.2759 21.9175 23.9351 22.5767 24.7483 22.5767H44.4783C45.2915 22.5767 45.9507 21.9175 45.9507 21.1043V1.47239C45.9507 0.659213 45.2915 0 44.4783 0Z" fill="#FD9115"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.3835 4.22513C25.0282 4.09188 24.8482 3.69581 24.9815 3.34049C24.9815 3.34049 24.9816 3.34003 24.9818 3.33957L24.9819 3.33922C24.982 3.33903 24.9822 3.33864 24.9822 3.33864L24.9823 3.3381L24.9825 3.33771C24.9826 3.33738 24.9827 3.33705 24.9828 3.33671L24.9835 3.33508C24.9838 3.33427 24.9841 3.33344 24.9844 3.33259C24.9853 3.33032 24.9863 3.32791 24.9873 3.32537C24.9875 3.32473 24.9878 3.32408 24.988 3.32342C24.9907 3.31692 24.9937 3.30958 24.9972 3.30149C25.0041 3.28531 25.0129 3.26603 25.0237 3.24414C25.0453 3.20043 25.0752 3.14581 25.1154 3.08429C25.1956 2.96128 25.3181 2.80902 25.4972 2.66284C25.8684 2.36003 26.4276 2.12841 27.2218 2.15896C28.187 2.19609 28.6546 2.79613 28.9412 3.16391L28.9519 3.17769C29.2507 3.56091 29.3327 3.63084 29.5512 3.63084C29.8647 3.63084 30.0094 3.51613 30.3558 3.22647C30.7212 2.92079 31.2372 2.50202 32.1524 2.50201C32.5896 2.50201 32.9471 2.59711 33.2526 2.75558C33.5452 2.90741 33.763 3.10506 33.9182 3.24786C34.2381 3.54216 34.3393 3.63083 34.6064 3.63083C34.931 3.63083 35.1819 3.48091 35.6202 3.1844L35.6606 3.15706C36.0555 2.88923 36.6266 2.50199 37.4039 2.502C38.2477 2.50201 38.7497 2.95191 39.0728 3.24329C39.4198 3.55629 39.5241 3.63084 39.7108 3.63083C39.8887 3.63083 40.0382 3.53196 40.4211 3.17641C40.4352 3.16324 40.4499 3.14952 40.4651 3.13532C40.776 2.84483 41.3003 2.35477 42.0665 2.35477C42.7994 2.35477 43.3409 2.72247 43.6693 3.03511C43.8363 3.19427 43.9622 3.35177 44.0468 3.46984C44.0895 3.52942 44.1228 3.58044 44.1465 3.61863C44.1584 3.63776 44.1679 3.65381 44.1752 3.66624C44.1788 3.67245 44.1819 3.67778 44.1843 3.68215C44.185 3.68327 44.1856 3.68433 44.1861 3.68533L44.1876 3.68798C44.1881 3.68883 44.1885 3.68962 44.1889 3.69035L44.1895 3.6914L44.1898 3.69188C44.1899 3.69208 44.19 3.69234 44.19 3.69234C44.373 4.02485 44.2516 4.44266 43.9191 4.62554C43.5876 4.80787 43.1714 4.68786 42.9875 4.35763C42.9861 4.3552 42.9833 4.35056 42.9793 4.34397C42.9697 4.32848 42.9531 4.30281 42.9298 4.27036C42.8825 4.20439 42.812 4.11649 42.7214 4.03024C42.5344 3.85209 42.3153 3.729 42.0665 3.729C41.8887 3.729 41.7391 3.82789 41.3561 4.18343C41.3419 4.19664 41.3272 4.2104 41.3119 4.22465C41.0011 4.51514 40.4769 5.00506 39.7108 5.00506C38.9646 5.00507 38.4917 4.57338 38.206 4.3125L38.2059 4.3124C38.1873 4.29542 38.1694 4.27916 38.1524 4.26379C37.8497 3.99074 37.689 3.87623 37.4039 3.87623C37.0793 3.87622 36.8285 4.02614 36.3902 4.32265C36.377 4.33154 36.3637 4.34059 36.3501 4.34978C35.9552 4.61761 35.3839 5.00506 34.6064 5.00506C33.791 5.00506 33.3324 4.57912 33.0367 4.30447C33.0199 4.28887 33.0036 4.27373 32.9878 4.25921C32.8363 4.11981 32.7351 4.03525 32.6197 3.97543C32.5172 3.92225 32.3778 3.87624 32.1524 3.87624C31.7425 3.87625 31.5468 4.02188 31.2374 4.28062C31.2225 4.29304 31.2073 4.30581 31.1918 4.31889L31.1917 4.31899C30.8635 4.5952 30.3764 5.00507 29.5512 5.00507C28.6296 5.00507 28.1707 4.41292 27.9005 4.06426C27.8895 4.04997 27.8787 4.03608 27.8682 4.02265C27.5895 3.6651 27.4676 3.54367 27.1689 3.53218C26.687 3.51364 26.4609 3.65013 26.3659 3.72769C26.3119 3.77169 26.281 3.81269 26.2662 3.83538C26.2621 3.84154 26.2594 3.84624 26.2578 3.84907C26.1154 4.18707 25.7301 4.35508 25.3835 4.22513ZM26.2633 3.8356L26.2641 3.83358C26.2646 3.83238 26.2651 3.83112 26.2656 3.8298C26.2657 3.82961 26.2657 3.82942 26.2658 3.82923C26.2661 3.82836 26.2665 3.82747 26.2669 3.82654L26.2673 3.82524C26.2656 3.82963 26.2639 3.83399 26.2622 3.83833L26.2633 3.8356ZM42.9882 4.35881C42.9887 4.35966 42.9888 4.3598 42.9884 4.35917L42.9882 4.35881Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.3835 7.53042C25.0282 7.39718 24.8482 7.00111 24.9815 6.64579C24.9815 6.64579 24.9816 6.64531 24.9818 6.64488L24.982 6.64436L24.9822 6.64394C24.9822 6.64364 24.9824 6.64334 24.9825 6.64304C24.9826 6.6427 24.9827 6.64235 24.9828 6.642L24.9834 6.64044C24.9838 6.63962 24.9841 6.63875 24.9844 6.63789C24.9852 6.63589 24.9861 6.63379 24.9869 6.63159L24.988 6.62873C24.9907 6.62221 24.9937 6.61488 24.9972 6.60678C25.0041 6.59061 25.0129 6.57134 25.0237 6.54945C25.0453 6.50573 25.0752 6.4511 25.1154 6.38959C25.1956 6.26657 25.3181 6.11432 25.4972 5.96814C25.8684 5.66532 26.4276 5.43372 27.2218 5.46425C28.187 5.50138 28.6546 6.10143 28.9412 6.46921L28.9519 6.48298C29.2507 6.86621 29.3327 6.93615 29.5512 6.93615C29.8647 6.93615 30.0094 6.82143 30.3558 6.53177C30.7212 6.2261 31.2372 5.80731 32.1524 5.80731C32.5896 5.8073 32.9471 5.90241 33.2526 6.06088C33.5452 6.21271 33.763 6.41036 33.9182 6.55317C34.2381 6.84746 34.3393 6.93614 34.6064 6.93614C34.931 6.93614 35.1819 6.78621 35.6202 6.4897C35.6322 6.48157 35.6444 6.4733 35.6568 6.46491L35.6605 6.46235C36.0555 6.19453 36.6266 5.80728 37.4039 5.80729C38.2477 5.8073 38.7497 6.25722 39.0728 6.54858C39.4198 6.86158 39.5241 6.93614 39.7108 6.93614C39.8887 6.93614 40.0382 6.83726 40.4211 6.48171C40.4352 6.46857 40.4499 6.45488 40.465 6.44072L40.4651 6.44062C40.776 6.15013 41.3003 5.66006 42.0665 5.66006C42.7994 5.66006 43.3409 6.02777 43.6693 6.34041C43.8363 6.49957 43.9622 6.65707 44.0468 6.77515C44.0895 6.83472 44.1228 6.88573 44.1465 6.92393C44.1584 6.94307 44.1679 6.95911 44.1752 6.97153C44.1765 6.97381 44.1778 6.97598 44.1789 6.97801C44.181 6.98153 44.1828 6.98468 44.1843 6.98744C44.1851 6.98873 44.1857 6.98992 44.1864 6.99103C44.1868 6.99182 44.1872 6.99257 44.1876 6.99328C44.188 6.99389 44.1883 6.99446 44.1886 6.99501L44.1889 6.99565L44.1895 6.99669L44.1898 6.99718C44.1899 6.99738 44.1465 6.92393 44.1465 6.92393L44.19 6.99764C44.373 7.33015 44.2516 7.74795 43.9191 7.93084C43.5876 8.11315 43.1714 7.99317 42.9876 7.66301C42.9862 7.66061 42.9834 7.65593 42.9793 7.64928C42.9697 7.63379 42.9531 7.60812 42.9298 7.57567C42.8825 7.50969 42.812 7.42179 42.7214 7.33555C42.5344 7.15739 42.3153 7.0343 42.0665 7.0343C41.8887 7.0343 41.7391 7.13318 41.3561 7.48873C41.3419 7.50193 41.3272 7.5157 41.3119 7.52995C41.0011 7.82045 40.4768 8.31037 39.7108 8.31037C38.9646 8.31037 38.4917 7.87867 38.206 7.6178L38.2058 7.6176C38.1872 7.60066 38.1694 7.58443 38.1524 7.56909C37.8497 7.29604 37.689 7.18153 37.4039 7.18153C37.0793 7.18153 36.8285 7.33144 36.3902 7.62795C36.377 7.63685 36.3636 7.64591 36.3501 7.65511C35.9552 7.92294 35.3839 8.31037 34.6064 8.31037C33.791 8.31037 33.3324 7.88442 33.0367 7.60977C33.0199 7.59416 33.0036 7.57903 32.9878 7.56451C32.8363 7.42511 32.7351 7.34055 32.6197 7.28073C32.5172 7.22754 32.3778 7.18155 32.1524 7.18155C31.7425 7.18155 31.5468 7.32717 31.2374 7.58591L31.2238 7.5973C31.2191 7.60126 31.2143 7.60524 31.2095 7.60926C31.2036 7.61422 31.1977 7.61923 31.1917 7.62429C30.8634 7.90051 30.3764 8.31038 29.5512 8.31038C28.6296 8.31038 28.1707 7.71822 27.9005 7.36957C27.8895 7.35527 27.8787 7.34137 27.8682 7.32795C27.5895 6.97039 27.4676 6.84896 27.1689 6.83748C26.687 6.81893 26.4609 6.95543 26.3659 7.03298C26.3119 7.07699 26.281 7.11799 26.2662 7.14067C26.2621 7.14685 26.2594 7.15154 26.2578 7.15438C26.1154 7.49238 25.7301 7.66038 25.3835 7.53042ZM26.2622 7.14363L26.2633 7.1409L26.2646 7.1376L26.2656 7.13511L26.2658 7.13465C26.2661 7.13374 26.2664 7.1328 26.2669 7.13185L26.2673 7.13052C26.2657 7.13491 26.2639 7.13929 26.2622 7.14363ZM42.9886 7.66476C42.9887 7.66496 42.9887 7.66486 42.9884 7.66448L42.9886 7.66476Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.3835 10.7697C25.0282 10.6365 24.8482 10.2404 24.9815 9.88507C24.9815 9.88507 24.9816 9.88458 24.9818 9.88409C24.9818 9.88409 24.9821 9.8835 24.9822 9.88321C24.9822 9.88287 24.9824 9.88255 24.9825 9.88223L24.9826 9.88189C24.9827 9.88168 24.9828 9.88147 24.9828 9.88125C24.983 9.88087 24.9831 9.88047 24.9833 9.88008C24.9837 9.87914 24.9841 9.87816 24.9844 9.87712C24.9849 9.87598 24.9854 9.87481 24.9858 9.8736L24.9872 9.87003L24.988 9.868C24.9907 9.86152 24.9937 9.85415 24.9972 9.84601C25.0041 9.82991 25.0129 9.8106 25.0237 9.78871C25.0453 9.74499 25.0752 9.69037 25.1154 9.62886C25.1956 9.50584 25.3181 9.35358 25.4972 9.2074C25.8684 8.90459 26.4276 8.67298 27.2218 8.70352C28.187 8.74065 28.6546 9.34069 28.9412 9.70847L28.9519 9.72225C29.2507 10.1054 29.3327 10.1754 29.5512 10.1754C29.8647 10.1754 30.0094 10.0607 30.3558 9.77103C30.7212 9.46536 31.2372 9.04658 32.1524 9.04658C32.5896 9.04657 32.9471 9.14167 33.2526 9.30014C33.5452 9.45197 33.763 9.64962 33.9182 9.79243C34.2381 10.0867 34.3393 10.1754 34.6064 10.1754C34.931 10.1754 35.1819 10.0254 35.6202 9.72896L35.6606 9.70162C36.0555 9.43379 36.6266 9.04655 37.4039 9.04656C38.2477 9.04657 38.7497 9.49648 39.0728 9.78785C39.4198 10.1008 39.5241 10.1754 39.7108 10.1754C39.8887 10.1754 40.0382 10.0765 40.4211 9.72097C40.4352 9.7078 40.4499 9.69408 40.4651 9.67988C40.776 9.38939 41.3003 8.89933 42.0665 8.89933C42.7994 8.89933 43.3409 9.26703 43.6693 9.57967C43.8363 9.73884 43.9622 9.89636 44.0468 10.0144C44.0895 10.0739 44.1228 10.125 44.1465 10.1632C44.1584 10.1823 44.1679 10.1984 44.1752 10.2108L44.1811 10.221L44.1843 10.2267L44.1857 10.2292L44.1876 10.2326C44.1879 10.233 44.1882 10.2335 44.1884 10.234C44.1886 10.2343 44.1888 10.2346 44.1889 10.2349L44.1892 10.2354L44.1895 10.236L44.1898 10.2365L44.19 10.2369C44.373 10.5694 44.2516 10.9872 43.9191 11.1701C43.5882 11.3521 43.1728 11.2329 42.9885 10.9039C42.9887 10.9041 42.9886 10.9041 42.9886 10.9041L42.9885 10.9039L42.9884 10.9038L42.9883 10.9035L42.9881 10.9033C42.9876 10.9023 42.9866 10.9007 42.9852 10.8983C42.9837 10.8958 42.9817 10.8925 42.9793 10.8886C42.9697 10.8731 42.9531 10.8473 42.9298 10.8149C42.8825 10.749 42.812 10.661 42.7214 10.5748C42.5344 10.3967 42.3153 10.2736 42.0665 10.2736C41.8887 10.2736 41.7391 10.3724 41.3561 10.728C41.3419 10.7412 41.3272 10.7549 41.312 10.7692C41.0011 11.0597 40.4769 11.5497 39.7108 11.5497C38.9647 11.5497 38.4918 11.118 38.2061 10.8572C38.1874 10.8401 38.1695 10.8238 38.1524 10.8084C37.8497 10.5353 37.689 10.4208 37.4039 10.4208C37.0793 10.4208 36.8285 10.5707 36.3902 10.8673C36.377 10.8762 36.3636 10.8853 36.35 10.8945C35.955 11.1623 35.3838 11.5497 34.6064 11.5497C33.791 11.5497 33.3324 11.1237 33.0367 10.849L33.0366 10.8489C33.0198 10.8333 33.0036 10.8182 32.9878 10.8037C32.8363 10.6644 32.7351 10.5798 32.6197 10.52C32.5172 10.4668 32.3778 10.4208 32.1524 10.4208C31.7425 10.4208 31.5468 10.5664 31.2374 10.8251C31.2225 10.8376 31.2072 10.8505 31.1916 10.8636C30.8634 11.1398 30.3763 11.5497 29.5512 11.5497C28.6296 11.5497 28.1707 10.9575 27.9006 10.6088L27.8974 10.6047C27.8874 10.5919 27.8777 10.5793 27.8682 10.5672C27.5895 10.2097 27.4676 10.0883 27.1689 10.0768C26.687 10.0582 26.4609 10.1947 26.3659 10.2722C26.3119 10.3163 26.281 10.3572 26.2662 10.3799C26.2621 10.3861 26.2594 10.3908 26.2578 10.3936C26.1154 10.7317 25.7301 10.8997 25.3835 10.7697ZM26.2623 10.3828L26.2633 10.3802L26.2641 10.3783C26.2646 10.377 26.2651 10.3757 26.2656 10.3744L26.2662 10.3728C26.2649 10.3762 26.2636 10.3795 26.2623 10.3828ZM26.2566 10.3958C26.2564 10.3962 26.2562 10.3967 26.2562 10.3967C26.256 10.397 26.2562 10.3966 26.2566 10.3958ZM26.2673 10.3699L26.2664 10.3721L26.2669 10.3711C26.267 10.3707 26.2671 10.3703 26.2673 10.3699Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.9815 13.3707C24.8482 13.726 25.0282 14.1221 25.3835 14.2553C25.7301 14.3853 26.1154 14.2172 26.2578 13.8792C26.2594 13.8764 26.2621 13.8717 26.2662 13.8656C26.281 13.8429 26.3119 13.8019 26.3659 13.7579C26.4609 13.6803 26.687 13.5438 27.1689 13.5624C27.4676 13.5738 27.5895 13.6953 27.8682 14.0528C27.8786 14.0661 27.8893 14.0799 27.9003 14.0941L27.9005 14.0944C28.1707 14.4431 28.6296 15.0352 29.5512 15.0352C30.3764 15.0352 30.8635 14.6254 31.1917 14.3492C31.2073 14.336 31.2225 14.3232 31.2374 14.3108C31.5468 14.0521 31.7425 13.9064 32.1524 13.9064C32.3778 13.9064 32.5172 13.9524 32.6197 14.0056C32.7351 14.0654 32.8363 14.15 32.9878 14.2894C32.996 14.2969 33.0042 14.3045 33.0126 14.3123C33.0205 14.3196 33.0286 14.3271 33.0367 14.3346C33.3324 14.6093 33.791 15.0352 34.6064 15.0352C35.3839 15.0352 35.9552 14.6478 36.3501 14.38L36.351 14.3793C36.3643 14.3704 36.3773 14.3615 36.3902 14.3528C36.8285 14.0563 37.0793 13.9064 37.4039 13.9064C37.689 13.9064 37.8497 14.0209 38.1524 14.294C38.1695 14.3094 38.1873 14.3257 38.206 14.3427C38.4917 14.6036 38.9646 15.0352 39.7108 15.0352C40.4768 15.0352 41.0011 14.5453 41.3119 14.2548L41.3123 14.2545C41.3274 14.2404 41.342 14.2267 41.3561 14.2136C41.7391 13.8581 41.8887 13.7592 42.0665 13.7592C42.3153 13.7592 42.5344 13.8823 42.7214 14.0604C42.812 14.1467 42.8825 14.2346 42.9298 14.3005C42.9531 14.333 42.9697 14.3587 42.9793 14.3741C42.9833 14.3807 42.9861 14.3854 42.9875 14.3878C43.1714 14.718 43.5876 14.838 43.9191 14.6557C44.2516 14.4728 44.373 14.055 44.19 13.7225L44.1898 13.7221L44.1895 13.7216L44.1889 13.7205L44.1884 13.7195C44.1882 13.7192 44.1881 13.7189 44.1879 13.7186L44.1876 13.7182L44.1864 13.716C44.1858 13.7148 44.1851 13.7136 44.1843 13.7123C44.1819 13.708 44.1788 13.7026 44.1752 13.6964C44.1679 13.684 44.1584 13.6679 44.1465 13.6488C44.1228 13.6106 44.0895 13.5596 44.0468 13.5C43.9622 13.3819 43.8363 13.2244 43.6693 13.0653C43.3409 12.7526 42.7994 12.3849 42.0665 12.3849C41.3003 12.3849 40.776 12.875 40.4651 13.1655C40.4499 13.1797 40.4352 13.1934 40.4211 13.2066C40.0382 13.5621 39.8887 13.661 39.7108 13.661C39.5241 13.661 39.4198 13.5865 39.0728 13.2735C38.7497 12.9821 38.2477 12.5322 37.4039 12.5322C36.6266 12.5322 36.0555 12.9194 35.6606 13.1872C35.6469 13.1965 35.6334 13.2056 35.6202 13.2146C35.1819 13.5111 34.931 13.661 34.6064 13.661C34.3393 13.661 34.2381 13.5723 33.9182 13.278C33.763 13.1352 33.5452 12.9376 33.2526 12.7858C32.9471 12.6273 32.5896 12.5322 32.1524 12.5322C31.2372 12.5322 30.7212 12.951 30.3558 13.2566C30.0094 13.5463 29.8647 13.661 29.5512 13.661C29.3327 13.661 29.2507 13.5911 28.9519 13.2079L28.9412 13.1941C28.6546 12.8263 28.187 12.2263 27.2218 12.1891C26.4276 12.1586 25.8684 12.3902 25.4972 12.693C25.3181 12.8392 25.1956 12.9914 25.1154 13.1145C25.0752 13.176 25.0453 13.2306 25.0237 13.2743C25.0129 13.2962 25.0041 13.3155 24.9972 13.3317C24.9937 13.3398 24.9907 13.3471 24.988 13.3536L24.9873 13.3556C24.9863 13.3581 24.9853 13.3605 24.9844 13.3628C24.9841 13.3636 24.9838 13.3643 24.9835 13.3651L24.9835 13.3653C24.9832 13.3658 24.983 13.3664 24.9828 13.3669C24.9827 13.3672 24.9826 13.3675 24.9825 13.3679L24.9825 13.368C24.9823 13.3682 24.9822 13.3685 24.9822 13.3688C24.9822 13.3688 24.982 13.3691 24.982 13.3693L24.9818 13.3697C24.9816 13.3702 24.9815 13.3707 24.9815 13.3707ZM26.2633 13.8658L26.2622 13.8685C26.2639 13.8642 26.2656 13.8598 26.2673 13.8554L26.2669 13.8567C26.2664 13.8578 26.266 13.8589 26.2656 13.86C26.2651 13.8613 26.2646 13.8625 26.2642 13.8637L26.2633 13.8658ZM26.2566 13.8814C26.2564 13.8819 26.2562 13.8823 26.2562 13.8823C26.256 13.8825 26.2562 13.8822 26.2566 13.8814ZM42.9882 14.389C42.9887 14.3898 42.9888 14.39 42.9884 14.3893L42.9882 14.389Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.9815 16.676C24.8482 17.0313 25.0282 17.4274 25.3835 17.5606C25.7301 17.6906 26.1154 17.5225 26.2578 17.1846C26.2594 17.1817 26.2621 17.177 26.2662 17.1708C26.281 17.1482 26.3119 17.1072 26.3659 17.0632C26.4609 16.9856 26.687 16.8491 27.1689 16.8677C27.4676 16.8791 27.5895 17.0006 27.8682 17.3581C27.874 17.3655 27.8798 17.373 27.8858 17.3807C27.8906 17.3869 27.8956 17.3933 27.9005 17.3997C28.1707 17.7484 28.6296 18.3406 29.5512 18.3406C30.3764 18.3406 30.8634 17.9307 31.1917 17.6545C31.2073 17.6414 31.2225 17.6285 31.2374 17.6161C31.5468 17.3573 31.7425 17.2117 32.1524 17.2117C32.3778 17.2117 32.5172 17.2577 32.6197 17.3109C32.7351 17.3707 32.8363 17.4553 32.9878 17.5947C33.0035 17.6091 33.0197 17.6241 33.0363 17.6396L33.0367 17.6399C33.3324 17.9146 33.791 18.3405 34.6064 18.3405C35.3839 18.3405 35.9552 17.9531 36.3501 17.6853C36.3636 17.6761 36.377 17.667 36.3902 17.6581C36.8285 17.3616 37.0793 17.2117 37.4039 17.2117C37.689 17.2117 37.8497 17.3262 38.1524 17.5993C38.1694 17.6146 38.1872 17.6308 38.2058 17.6478L38.206 17.648C38.4917 17.9088 38.9646 18.3405 39.7108 18.3405C40.4768 18.3405 41.0011 17.8506 41.3119 17.5601C41.3272 17.5459 41.3419 17.5321 41.3561 17.5189C41.7391 17.1634 41.8887 17.0645 42.0665 17.0645C42.3153 17.0645 42.5344 17.1876 42.7214 17.3657C42.812 17.452 42.8825 17.5399 42.9298 17.6058C42.9531 17.6383 42.9697 17.664 42.9793 17.6794C42.9834 17.6861 42.9862 17.6908 42.9876 17.6932C43.1715 18.0234 43.5877 18.1433 43.9191 17.961C44.2516 17.7781 44.373 17.3603 44.19 17.0278C44.19 17.0278 44.1899 17.0276 44.1898 17.0274L44.1895 17.0269L44.1889 17.0258L44.1883 17.0246C44.1881 17.0242 44.1879 17.0238 44.1876 17.0234C44.1867 17.0218 44.1856 17.0198 44.1843 17.0176C44.1819 17.0133 44.1788 17.0079 44.1752 17.0017C44.1679 16.9893 44.1584 16.9732 44.1465 16.9541C44.1228 16.9159 44.0895 16.8649 44.0468 16.8053C43.9622 16.6872 43.8363 16.5297 43.6693 16.3706C43.3409 16.0579 42.7994 15.6902 42.0665 15.6902C41.3003 15.6902 40.776 16.1803 40.4651 16.4708L40.4647 16.4712C40.4496 16.4853 40.4351 16.4989 40.4211 16.5119C40.0382 16.8674 39.8887 16.9663 39.7108 16.9663C39.5241 16.9663 39.4198 16.8918 39.0728 16.5788C38.7497 16.2874 38.2477 15.8375 37.4039 15.8375C36.6266 15.8375 36.0555 16.2247 35.6605 16.4925C35.6469 16.5018 35.6334 16.5109 35.6202 16.5199C35.1819 16.8164 34.931 16.9663 34.6064 16.9663C34.3393 16.9663 34.2381 16.8776 33.9182 16.5833C33.763 16.4405 33.5452 16.2429 33.2526 16.0911C32.9471 15.9326 32.5896 15.8375 32.1524 15.8375C31.2372 15.8375 30.7212 16.2563 30.3558 16.5619C30.0094 16.8516 29.8647 16.9663 29.5512 16.9663C29.3327 16.9663 29.2507 16.8964 28.9519 16.5132L28.9412 16.4994C28.6546 16.1316 28.187 15.5316 27.2218 15.4944C26.4276 15.4639 25.8684 15.6955 25.4972 15.9983C25.3181 16.1445 25.1956 16.2967 25.1154 16.4198C25.0752 16.4813 25.0453 16.5359 25.0237 16.5796C25.0129 16.6015 25.0041 16.6208 24.9972 16.637C24.9937 16.6451 24.9907 16.6524 24.988 16.6589L24.9866 16.6627C24.9858 16.6646 24.9851 16.6664 24.9844 16.6681C24.9841 16.6689 24.9838 16.6698 24.9835 16.6706L24.9828 16.6722C24.9828 16.6724 24.9827 16.6727 24.9826 16.6729L24.9825 16.6732C24.9824 16.6735 24.9822 16.6738 24.9822 16.6741L24.982 16.6746L24.9818 16.6751L24.9815 16.676ZM26.2633 17.1711L26.2622 17.1738C26.2639 17.1695 26.2657 17.1651 26.2673 17.1607L26.2669 17.162C26.2664 17.1631 26.266 17.1642 26.2656 17.1653C26.2651 17.1666 26.2646 17.1678 26.2642 17.1689L26.2633 17.1711ZM26.2566 17.1868C26.2564 17.1872 26.2562 17.1876 26.2562 17.1876C26.256 17.1878 26.2562 17.1875 26.2566 17.1868ZM42.9886 17.6949C42.9887 17.6951 42.9887 17.695 42.9884 17.6947L42.9886 17.6949Z" fill="#E65C28"/>
<path d="M6 18.0614C6 14.0497 9.25211 10.7976 13.2638 10.7976H46.7362C50.7479 10.7976 54 14.0497 54 18.0614V43.9755C54 44.7887 53.3408 45.4479 52.5276 45.4479H7.27607C6.57132 45.4479 6 44.8766 6 44.1718V18.0614Z" fill="#B4B4B4"/>
<path d="M22 18.0614C22 14.0497 25.2521 10.7976 29.2638 10.7976H46.7362C50.7479 10.7976 54 14.0497 54 18.0614V43.9755C54 44.7887 53.3408 45.4479 52.5276 45.4479H22V18.0614Z" fill="#C4C4C4"/>
<path d="M6 43.7793H22V45.448H6.83436C6.37355 45.448 6 45.0744 6 44.6137V43.7793Z" fill="#C4C4C4"/>
<path d="M13.2637 36.6135H15.1288C15.6709 36.6135 16.1104 36.1741 16.1104 35.6319L16.1104 20.5154C16.1104 19.9732 15.6709 19.5338 15.1288 19.5338H13.2637C12.7216 19.5338 12.2821 19.9732 12.2821 20.5154L12.2821 35.6319C12.2821 36.1741 12.7216 36.6135 13.2637 36.6135Z" fill="#2F2F2F"/>
<path d="M15.5217 23.2668C16.3891 23.2668 17.0923 22.5637 17.0923 21.6963C17.0923 20.8289 16.3891 20.1257 15.5217 20.1257H9.14137C8.27397 20.1257 7.57081 20.8289 7.57081 21.6963C7.57081 22.5637 8.27397 23.2668 9.14137 23.2668H15.5217Z" fill="#4A4A4A"/>
<path d="M12.4782 23.2668C13.3455 23.2668 14.0487 22.5637 14.0487 21.6963C14.0487 20.8289 13.3455 20.1257 12.4782 20.1257H9.14073C8.27334 20.1257 7.57018 20.8289 7.57018 21.6963C7.57018 22.5637 8.27334 23.2668 9.14073 23.2668H12.4782Z" fill="#808080"/>
<path d="M39.4829 35.0918C32.8878 35.0918 29.1261 29.915 28.9694 21.3005H32.2729C32.3815 27.6233 34.8169 30.3015 36.746 30.8537V21.3005H39.8568V26.7536C41.7618 26.5189 43.7631 24.034 44.4382 21.3005H47.5489C47.0305 24.669 44.8603 27.1539 43.317 28.1755C44.8603 29.0038 47.3321 31.1713 48.2724 35.0918H44.8482C44.1127 32.4689 42.2802 30.4395 39.8568 30.1635V35.0918H39.4829Z" fill="#2F2F2F"/>
</g>
<path d="M280.512 16.7987V14.5839H273.476V2.60403H271V16.7987H280.512Z" fill="white"/>
<path d="M283.458 4.83893C284.304 4.83893 284.923 4.25503 284.923 3.42953C284.923 2.60403 284.304 2 283.458 2C282.591 2 281.972 2.60403 281.972 3.42953C281.972 4.25503 282.591 4.83893 283.458 4.83893ZM284.634 16.7987V6.32886H282.261V16.7987H284.634Z" fill="white"/>
<path d="M291.606 14.7852C290.801 14.7852 290.409 14.4027 290.409 13.6174V8.34228H293.607V6.32886H290.409V3.30872H288.635L288.036 6.32886H286.282V8.34228H288.036V13.6174C288.036 15.6711 289.254 16.7987 291.606 16.7987H293.607L293.813 14.7852H291.606Z" fill="white"/>
<path d="M306 11.443C306 8.42282 303.689 6.12752 300.429 6.12752C297.169 6.12752 294.858 8.40268 294.858 11.5638C294.858 14.7248 297.169 17 300.429 17C302.657 17 304.762 15.9732 305.567 13.9799L303.338 13.6174C302.822 14.3624 301.832 14.8859 300.573 14.8859C298.758 14.8859 297.561 13.7987 297.334 12.1879H305.959C305.979 11.9664 306 11.7248 306 11.443ZM300.429 8.14094C301.915 8.14094 303.029 9.06711 303.421 10.3758H297.478C297.87 9.02684 298.985 8.14094 300.429 8.14094Z" fill="white"/>
<defs>
<clipPath id="clip0_428_625">
<rect width="48" height="48" fill="white" transform="translate(6)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 44 KiB

+39
View File
@@ -0,0 +1,39 @@
<svg width="306" height="48" viewBox="0 0 306 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M85.5063 24.1875C87.475 23.2688 88.7437 21.7375 88.7437 19.375C88.7437 15.7875 85.4625 13.25 80.7375 13.25H69.8438V36H81.2188C86.1188 36 89.5313 33.3313 89.5313 29.7C89.5313 26.9438 87.7375 24.8875 85.5063 24.1875ZM80.7375 17.4063C82.4875 17.4063 83.7125 18.4563 83.7125 19.9C83.7125 21.3438 82.4875 22.35 80.7375 22.35H74.875V17.4063H80.7375ZM74.875 31.8438V26.2875H81.2188C83.1875 26.2875 84.5 27.425 84.5 29.0875C84.5 30.75 83.1875 31.8438 81.2188 31.8438H74.875Z" fill="black"/>
<path d="M104.403 36V17.8438H112.278V13.25H91.4966V17.8438H99.3716V36H104.403Z" fill="black"/>
<path d="M125.768 36.4375C132.899 36.4375 137.931 31.5375 137.931 24.625C137.931 17.7125 132.899 12.8125 125.768 12.8125C118.637 12.8125 113.606 17.7125 113.606 24.625C113.606 31.5375 118.637 36.4375 125.768 36.4375ZM125.768 31.8438C121.656 31.8438 118.856 28.9125 118.856 24.625C118.856 20.3375 121.656 17.4063 125.768 17.4063C129.881 17.4063 132.681 20.3375 132.681 24.625C132.681 28.9125 129.881 31.8438 125.768 31.8438Z" fill="black"/>
<path d="M152.848 36.4375C157.617 36.4375 162.123 33.9875 163.83 29.2188L159.105 28.4313C158.098 30.4438 155.867 31.8438 153.155 31.8438C149.086 31.8438 146.242 28.8688 146.242 24.625C146.242 20.3813 149.086 17.4063 153.155 17.4063C155.78 17.4063 157.967 18.7625 158.93 20.7313L163.655 19.9438C161.992 15.2625 157.705 12.8125 152.848 12.8125C145.892 12.8125 140.992 17.7563 140.992 24.625C140.992 31.4938 145.892 36.4375 152.848 36.4375Z" fill="black"/>
<path d="M177.633 36V17.8438H185.508V13.25H164.727V17.8438H172.602V36H177.633Z" fill="black"/>
<path d="M210.461 24.3625C210.461 17.8 205.561 12.8125 198.648 12.8125C191.736 12.8125 186.836 17.7563 186.836 24.625C186.836 31.4938 191.736 36.4375 198.648 36.4375C203.373 36.4375 207.836 34.2063 209.542 29.875L204.817 29.0875C203.723 30.7063 201.623 31.8438 198.954 31.8438C195.104 31.8438 192.567 29.4813 192.086 25.9813H210.373C210.417 25.5 210.461 24.975 210.461 24.3625ZM198.648 17.1875C201.798 17.1875 204.161 19.2 204.992 22.0438H192.392C193.223 19.1125 195.586 17.1875 198.648 17.1875Z" fill="black"/>
<path d="M219.412 44.9688V32.5438C220.987 34.425 223.831 36.4375 227.812 36.4375C234.331 36.4375 238.925 31.4938 238.925 24.625C238.925 17.7563 234.331 12.8125 227.812 12.8125C223.656 12.8125 220.769 15 219.194 16.925L218.144 13.25H214.381V44.9688H219.412ZM226.587 31.9313C222.344 31.9313 219.412 28.9125 219.412 24.625C219.412 20.3375 222.344 17.3188 226.587 17.3188C230.787 17.3188 233.675 20.3375 233.675 24.625C233.675 28.9125 230.787 31.9313 226.587 31.9313Z" fill="black"/>
<path d="M253.849 36.4375C258.618 36.4375 263.124 33.9875 264.831 29.2188L260.106 28.4313C259.099 30.4438 256.868 31.8438 254.156 31.8438C250.087 31.8438 247.243 28.8688 247.243 24.625C247.243 20.3813 250.087 17.4063 254.156 17.4063C256.781 17.4063 258.968 18.7625 259.931 20.7313L264.656 19.9438C262.993 15.2625 258.706 12.8125 253.849 12.8125C246.893 12.8125 241.993 17.7563 241.993 24.625C241.993 31.4938 246.893 36.4375 253.849 36.4375Z" fill="black"/>
<path d="M12.6749 41.8159H9.53384C8.99172 41.8159 8.55225 42.2554 8.55225 42.7975V47.0184C8.55225 47.5605 8.99172 48 9.53384 48H12.6749C13.2171 48 13.6565 47.5605 13.6565 47.0184V42.7975C13.6565 42.2554 13.2171 41.8159 12.6749 41.8159Z" fill="#9C9C9C"/>
<path d="M23.8649 41.8159H20.7238C20.1817 41.8159 19.7422 42.2554 19.7422 42.7975V47.0184C19.7422 47.5605 20.1817 48 20.7238 48H23.8649C24.407 48 24.8465 47.5605 24.8465 47.0184V42.7975C24.8465 42.2554 24.407 41.8159 23.8649 41.8159Z" fill="#9C9C9C"/>
<path d="M39.6686 41.8159H36.5275C35.9854 41.8159 35.5459 42.2554 35.5459 42.7975V47.0184C35.5459 47.5605 35.9854 48 36.5275 48H39.6686C40.2107 48 40.6502 47.5605 40.6502 47.0184V42.7975C40.6502 42.2554 40.2107 41.8159 39.6686 41.8159Z" fill="#9C9C9C"/>
<path d="M50.859 41.8159H47.7179C47.1758 41.8159 46.7363 42.2554 46.7363 42.7975V47.0184C46.7363 47.5605 47.1758 48 47.7179 48H50.859C51.4012 48 51.8406 47.5605 51.8406 47.0184V42.7975C51.8406 42.2554 51.4012 41.8159 50.859 41.8159Z" fill="#9C9C9C"/>
<path d="M38.7852 4.37598H16.503C15.6899 4.37598 15.0306 5.03519 15.0306 5.84837V25.4803C15.0306 26.2935 15.6899 26.9527 16.503 26.9527H38.7852C39.5984 26.9527 40.2576 26.2935 40.2576 25.4803V5.84837C40.2576 5.03519 39.5984 4.37598 38.7852 4.37598Z" fill="#FECE12"/>
<path d="M38.7855 4.37598H19.0554C18.2422 4.37598 17.583 5.03519 17.583 5.84837V25.4803C17.583 26.2935 18.2422 26.9527 19.0554 26.9527H38.7855C39.5986 26.9527 40.2578 26.2935 40.2578 25.4803V5.84837C40.2578 5.03519 39.5986 4.37598 38.7855 4.37598Z" fill="#FD9115"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1335 8.28128C19.7782 8.14803 19.5982 7.75197 19.7315 7.39665C19.7315 7.39665 19.7316 7.39619 19.7318 7.39572L19.7319 7.39538C19.732 7.39518 19.7322 7.39479 19.7322 7.39479L19.7323 7.39425L19.7325 7.39387C19.7326 7.39353 19.7327 7.3932 19.7328 7.39286L19.7335 7.39123C19.7338 7.39043 19.7341 7.38959 19.7344 7.38875C19.7353 7.38647 19.7363 7.38406 19.7373 7.38152C19.7375 7.38088 19.7378 7.38023 19.738 7.37958C19.7407 7.37307 19.7437 7.36574 19.7472 7.35764C19.7541 7.34146 19.7629 7.32218 19.7737 7.30029C19.7953 7.25658 19.8252 7.20196 19.8654 7.14044C19.9456 7.01743 20.0681 6.86517 20.2472 6.71899C20.6184 6.41618 21.1776 6.18456 21.9718 6.21511C22.937 6.25224 23.4046 6.85229 23.6912 7.22007L23.7019 7.23384C24.0007 7.61706 24.0827 7.68699 24.3012 7.68699C24.6147 7.68699 24.7594 7.57228 25.1058 7.28263C25.4712 6.97695 25.9872 6.55817 26.9024 6.55816C27.3396 6.55816 27.6971 6.65327 28.0026 6.81173C28.2952 6.96356 28.513 7.16121 28.6682 7.30401C28.9881 7.59832 29.0893 7.68698 29.3564 7.68698C29.681 7.68698 29.9319 7.53706 30.3702 7.24055L30.4105 7.21321C30.8055 6.94538 31.3766 6.55814 32.1539 6.55815C32.9977 6.55816 33.4997 7.00806 33.8227 7.29944C34.1698 7.61244 34.2741 7.68699 34.4608 7.68698C34.6387 7.68698 34.7881 7.58812 35.1711 7.23256C35.1852 7.2194 35.1999 7.20567 35.2151 7.19147C35.526 6.90098 36.0503 6.41092 36.8165 6.41092C37.5494 6.41092 38.0909 6.77863 38.4193 7.09126C38.5863 7.25042 38.7122 7.40793 38.7968 7.52599C38.8395 7.58557 38.8728 7.63659 38.8965 7.67478C38.9084 7.69391 38.9179 7.70996 38.9252 7.72239C38.9288 7.7286 38.9319 7.73393 38.9343 7.7383C38.935 7.73942 38.9356 7.74048 38.9361 7.74148L38.9376 7.74413C38.9381 7.74499 38.9385 7.74577 38.9389 7.7465L38.9395 7.74755L38.9398 7.74803C38.9399 7.74823 38.94 7.74849 38.94 7.74849C39.123 8.08101 39.0016 8.49881 38.6691 8.68169C38.3376 8.86402 37.9214 8.74401 37.7375 8.41378C37.7361 8.41135 37.7333 8.40671 37.7293 8.40012C37.7197 8.38463 37.7031 8.35896 37.6798 8.32651C37.6325 8.26054 37.562 8.17264 37.4714 8.08639C37.2844 7.90825 37.0653 7.78515 36.8165 7.78515C36.6387 7.78515 36.4891 7.88404 36.1061 8.23958C36.0919 8.25279 36.0772 8.26656 36.0619 8.2808C35.7511 8.57129 35.2268 9.06122 34.4608 9.06122C33.7146 9.06123 33.2417 8.62953 32.956 8.36866L32.9559 8.36855C32.9372 8.35157 32.9194 8.33531 32.9024 8.31995C32.5997 8.0469 32.439 7.93238 32.1539 7.93238C31.8293 7.93237 31.5785 8.08229 31.1402 8.3788C31.127 8.38769 31.1137 8.39674 31.1001 8.40593C30.7052 8.67377 30.1339 9.06122 29.3564 9.06122C28.541 9.06122 28.0824 8.63527 27.7867 8.36062C27.7699 8.34502 27.7536 8.32988 27.7378 8.31536C27.5863 8.17597 27.4851 8.0914 27.3697 8.03158C27.2672 7.9784 27.1278 7.93239 26.9024 7.93239C26.4925 7.9324 26.2968 8.07803 25.9874 8.33677C25.9725 8.34919 25.9573 8.36196 25.9418 8.37504L25.9417 8.37514C25.6135 8.65136 25.1264 9.06123 24.3012 9.06123C23.3796 9.06123 22.9207 8.46907 22.6505 8.12042C22.6395 8.10612 22.6287 8.09223 22.6182 8.07881C22.3395 7.72125 22.2176 7.59982 21.9189 7.58833C21.437 7.56979 21.2109 7.70628 21.1159 7.78384C21.0619 7.82784 21.031 7.86884 21.0162 7.89153C21.0121 7.8977 21.0094 7.90239 21.0078 7.90523C20.8654 8.24322 20.4801 8.41124 20.1335 8.28128ZM21.0133 7.89175L21.0141 7.88973C21.0146 7.88854 21.0151 7.88728 21.0156 7.88595C21.0157 7.88576 21.0157 7.88557 21.0158 7.88538C21.0161 7.88452 21.0165 7.88362 21.0169 7.88269L21.0173 7.88139C21.0156 7.88578 21.0139 7.89015 21.0122 7.89448L21.0133 7.89175ZM37.7382 8.41496C37.7387 8.41581 37.7388 8.41595 37.7384 8.41533L37.7382 8.41496Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1335 11.5866C19.7782 11.4533 19.5982 11.0573 19.7315 10.7019C19.7315 10.7019 19.7316 10.7015 19.7318 10.701L19.732 10.7005L19.7322 10.7001C19.7322 10.6998 19.7324 10.6995 19.7325 10.6992C19.7326 10.6989 19.7327 10.6985 19.7328 10.6982L19.7334 10.6966C19.7338 10.6958 19.7341 10.6949 19.7344 10.694C19.7352 10.692 19.7361 10.6899 19.7369 10.6877L19.738 10.6849C19.7407 10.6784 19.7437 10.671 19.7472 10.6629C19.7541 10.6468 19.7629 10.6275 19.7737 10.6056C19.7953 10.5619 19.8252 10.5073 19.8654 10.4457C19.9456 10.3227 20.0681 10.1705 20.2472 10.0243C20.6184 9.72148 21.1776 9.48987 21.9718 9.52041C22.937 9.55754 23.4046 10.1576 23.6912 10.5254L23.7019 10.5391C24.0007 10.9224 24.0827 10.9923 24.3012 10.9923C24.6147 10.9923 24.7594 10.8776 25.1058 10.5879C25.4712 10.2823 25.9872 9.86347 26.9024 9.86347C27.3396 9.86346 27.6971 9.95856 28.0026 10.117C28.2952 10.2689 28.513 10.4665 28.6682 10.6093C28.9881 10.9036 29.0893 10.9923 29.3564 10.9923C29.681 10.9923 29.9319 10.8424 30.3702 10.5459C30.3822 10.5377 30.3944 10.5295 30.4068 10.5211L30.4105 10.5185C30.8055 10.2507 31.3766 9.86344 32.1539 9.86345C32.9977 9.86346 33.4997 10.3134 33.8227 10.6047C34.1698 10.9177 34.2741 10.9923 34.4608 10.9923C34.6387 10.9923 34.7881 10.8934 35.1711 10.5379C35.1852 10.5247 35.1999 10.511 35.215 10.4969L35.2151 10.4968C35.526 10.2063 36.0503 9.71622 36.8165 9.71622C37.5494 9.71622 38.0909 10.0839 38.4193 10.3966C38.5863 10.5557 38.7122 10.7132 38.7968 10.8313C38.8395 10.8909 38.8728 10.9419 38.8965 10.9801C38.9084 10.9992 38.9179 11.0153 38.9252 11.0277C38.9265 11.03 38.9278 11.0321 38.9289 11.0342C38.931 11.0377 38.9328 11.0408 38.9343 11.0436C38.9351 11.0449 38.9357 11.0461 38.9364 11.0472C38.9368 11.048 38.9372 11.0487 38.9376 11.0494C38.938 11.05 38.9383 11.0506 38.9386 11.0512L38.9389 11.0518L38.9395 11.0528L38.9398 11.0533C38.9399 11.0535 38.8965 10.9801 38.8965 10.9801L38.94 11.0538C39.123 11.3863 39.0016 11.8041 38.6691 11.987C38.3376 12.1693 37.9214 12.0493 37.7376 11.7192C37.7362 11.7168 37.7334 11.7121 37.7293 11.7054C37.7197 11.6899 37.7031 11.6643 37.6798 11.6318C37.6325 11.5658 37.562 11.4779 37.4714 11.3917C37.2844 11.2135 37.0653 11.0904 36.8165 11.0904C36.6387 11.0904 36.4891 11.1893 36.1061 11.5449C36.0919 11.5581 36.0772 11.5719 36.0619 11.5861C35.7511 11.8766 35.2268 12.3665 34.4608 12.3665C33.7146 12.3665 33.2417 11.9348 32.956 11.674L32.9558 11.6738C32.9372 11.6568 32.9194 11.6406 32.9024 11.6252C32.5997 11.3522 32.439 11.2377 32.1539 11.2377C31.8293 11.2377 31.5785 11.3876 31.1402 11.6841C31.127 11.693 31.1136 11.7021 31.1001 11.7113C30.7052 11.9791 30.1339 12.3665 29.3564 12.3665C28.541 12.3665 28.0824 11.9406 27.7867 11.6659C27.7699 11.6503 27.7536 11.6352 27.7378 11.6207C27.5863 11.4813 27.4851 11.3967 27.3697 11.3369C27.2672 11.2837 27.1278 11.2377 26.9024 11.2377C26.4925 11.2377 26.2968 11.3833 25.9874 11.6421L25.9738 11.6535C25.9691 11.6574 25.9643 11.6614 25.9595 11.6654C25.9536 11.6704 25.9477 11.6754 25.9417 11.6804C25.6134 11.9567 25.1264 12.3665 24.3012 12.3665C23.3796 12.3665 22.9207 11.7744 22.6505 11.4257C22.6395 11.4114 22.6287 11.3975 22.6182 11.3841C22.3395 11.0265 22.2176 10.9051 21.9189 10.8936C21.437 10.8751 21.2109 11.0116 21.1159 11.0891C21.0619 11.1331 21.031 11.1741 21.0162 11.1968C21.0121 11.203 21.0094 11.2077 21.0078 11.2105C20.8654 11.5485 20.4801 11.7165 20.1335 11.5866ZM21.0122 11.1998L21.0133 11.1971L21.0146 11.1938L21.0156 11.1913L21.0158 11.1908C21.0161 11.1899 21.0164 11.189 21.0169 11.188L21.0173 11.1867C21.0157 11.1911 21.0139 11.1954 21.0122 11.1998ZM37.7386 11.7209C37.7387 11.7211 37.7387 11.721 37.7384 11.7206L37.7386 11.7209Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1335 14.8258C19.7782 14.6926 19.5982 14.2966 19.7315 13.9412C19.7315 13.9412 19.7316 13.9407 19.7318 13.9402C19.7318 13.9402 19.7321 13.9397 19.7322 13.9394C19.7322 13.939 19.7324 13.9387 19.7325 13.9384L19.7326 13.938C19.7327 13.9378 19.7328 13.9376 19.7328 13.9374C19.733 13.937 19.7331 13.9366 19.7333 13.9362C19.7337 13.9353 19.7341 13.9343 19.7344 13.9333C19.7349 13.9321 19.7354 13.931 19.7358 13.9298L19.7372 13.9262L19.738 13.9241C19.7407 13.9177 19.7437 13.9103 19.7472 13.9022C19.7541 13.8861 19.7629 13.8668 19.7737 13.8449C19.7953 13.8011 19.8252 13.7465 19.8654 13.685C19.9456 13.562 20.0681 13.4097 20.2472 13.2636C20.6184 12.9607 21.1776 12.7291 21.9718 12.7597C22.937 12.7968 23.4046 13.3968 23.6912 13.7646L23.7019 13.7784C24.0007 14.1616 24.0827 14.2316 24.3012 14.2316C24.6147 14.2316 24.7594 14.1168 25.1058 13.8272C25.4712 13.5215 25.9872 13.1027 26.9024 13.1027C27.3396 13.1027 27.6971 13.1978 28.0026 13.3563C28.2952 13.5081 28.513 13.7058 28.6682 13.8486C28.9881 14.1428 29.0893 14.2316 29.3564 14.2316C29.681 14.2316 29.9319 14.0816 30.3702 13.7851L30.4105 13.7578C30.8055 13.4899 31.3766 13.1027 32.1539 13.1027C32.9977 13.1027 33.4997 13.5526 33.8227 13.844C34.1698 14.157 34.2741 14.2316 34.4608 14.2316C34.6387 14.2316 34.7881 14.1326 35.1711 13.7771C35.1852 13.764 35.1999 13.7502 35.2151 13.736C35.526 13.4455 36.0503 12.9555 36.8165 12.9555C37.5494 12.9555 38.0909 13.3232 38.4193 13.6358C38.5863 13.795 38.7122 13.9525 38.7968 14.0706C38.8395 14.1301 38.8728 14.1811 38.8965 14.2193C38.9084 14.2385 38.9179 14.2546 38.9252 14.2669L38.9311 14.2771L38.9343 14.2828L38.9357 14.2853L38.9376 14.2887C38.9379 14.2892 38.9382 14.2897 38.9384 14.2902C38.9386 14.2905 38.9388 14.2908 38.9389 14.2911L38.9392 14.2916L38.9395 14.2921L38.9398 14.2926L38.94 14.293C39.123 14.6256 39.0016 15.0434 38.6691 15.2262C38.3382 15.4082 37.9228 15.289 37.7385 14.96C37.7387 14.9603 37.7386 14.9602 37.7386 14.9602L37.7385 14.96L37.7384 14.9599L37.7383 14.9597L37.7381 14.9594C37.7376 14.9585 37.7366 14.9568 37.7352 14.9545C37.7337 14.952 37.7317 14.9487 37.7293 14.9447C37.7197 14.9292 37.7031 14.9035 37.6798 14.8711C37.6325 14.8051 37.562 14.7172 37.4714 14.631C37.2844 14.4528 37.0653 14.3297 36.8165 14.3297C36.6387 14.3297 36.4891 14.4286 36.1061 14.7841C36.0919 14.7973 36.0772 14.8111 36.062 14.8253C35.7511 15.1158 35.2269 15.6058 34.4608 15.6058C33.7147 15.6058 33.2418 15.1742 32.9561 14.9133C32.9374 14.8963 32.9195 14.8799 32.9024 14.8645C32.5997 14.5914 32.439 14.477 32.1539 14.477C31.8293 14.477 31.5785 14.6269 31.1402 14.9234C31.127 14.9323 31.1136 14.9414 31.0999 14.9507C30.705 15.2185 30.1338 15.6058 29.3564 15.6058C28.541 15.6058 28.0824 15.1798 27.7867 14.9052L27.7865 14.905C27.7698 14.8895 27.7536 14.8744 27.7378 14.8599C27.5863 14.7205 27.4851 14.636 27.3697 14.5761C27.2672 14.5229 27.1278 14.477 26.9024 14.477C26.4925 14.477 26.2968 14.6226 25.9874 14.8813C25.9725 14.8938 25.9572 14.9066 25.9416 14.9197C25.6134 15.196 25.1263 15.6058 24.3012 15.6058C23.3796 15.6058 22.9207 15.0136 22.6506 14.665L22.6474 14.6609C22.6374 14.648 22.6277 14.6355 22.6182 14.6233C22.3395 14.2658 22.2176 14.1444 21.9189 14.1329C21.437 14.1144 21.2109 14.2508 21.1159 14.3284C21.0619 14.3724 21.031 14.4134 21.0162 14.4361C21.0121 14.4422 21.0094 14.4469 21.0078 14.4498C20.8654 14.7878 20.4801 14.9559 20.1335 14.8258ZM21.0123 14.4389L21.0133 14.4363L21.0141 14.4344C21.0146 14.4332 21.0151 14.4319 21.0156 14.4306L21.0162 14.429C21.0149 14.4323 21.0136 14.4356 21.0123 14.4389ZM21.0066 14.4519C21.0064 14.4524 21.0062 14.4528 21.0062 14.4528C21.006 14.4531 21.0062 14.4528 21.0066 14.4519ZM21.0173 14.4261L21.0164 14.4283L21.0169 14.4272C21.017 14.4269 21.0171 14.4265 21.0173 14.4261Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.7315 17.4268C19.5982 17.7821 19.7782 18.1782 20.1335 18.3115C20.4801 18.4414 20.8654 18.2734 21.0078 17.9354C21.0094 17.9326 21.0121 17.9279 21.0162 17.9217C21.031 17.899 21.0619 17.858 21.1159 17.814C21.2109 17.7365 21.437 17.6 21.9189 17.6185C22.2176 17.63 22.3395 17.7514 22.6182 18.109C22.6286 18.1223 22.6393 18.1361 22.6503 18.1502L22.6505 18.1506C22.9207 18.4993 23.3796 19.0914 24.3012 19.0914C25.1264 19.0914 25.6135 18.6815 25.9417 18.4053C25.9573 18.3922 25.9725 18.3794 25.9874 18.3669C26.2968 18.1082 26.4925 17.9626 26.9024 17.9626C27.1278 17.9626 27.2672 18.0086 27.3697 18.0618C27.4851 18.1216 27.5863 18.2061 27.7378 18.3455C27.746 18.353 27.7542 18.3607 27.7626 18.3684C27.7705 18.3758 27.7786 18.3832 27.7867 18.3908C28.0824 18.6654 28.541 19.0914 29.3564 19.0914C30.1339 19.0914 30.7052 18.7039 31.1001 18.4361L31.101 18.4355C31.1143 18.4265 31.1273 18.4177 31.1402 18.409C31.5785 18.1125 31.8293 17.9625 32.1539 17.9626C32.439 17.9626 32.5997 18.0771 32.9024 18.3501C32.9195 18.3655 32.9373 18.3818 32.956 18.3988C33.2417 18.6597 33.7146 19.0914 34.4608 19.0914C35.2268 19.0914 35.7511 18.6015 36.0619 18.311L36.0623 18.3106C36.0774 18.2965 36.092 18.2829 36.1061 18.2698C36.4891 17.9142 36.6387 17.8153 36.8165 17.8153C37.0653 17.8153 37.2844 17.9384 37.4714 18.1166C37.562 18.2028 37.6325 18.2907 37.6798 18.3567C37.7031 18.3891 37.7197 18.4148 37.7293 18.4303C37.7333 18.4369 37.7361 18.4415 37.7375 18.444C37.9214 18.7742 38.3376 18.8942 38.6691 18.7119C39.0016 18.529 39.123 18.1112 38.94 17.7787L38.9398 17.7782L38.9395 17.7777L38.9389 17.7767L38.9384 17.7756C38.9382 17.7753 38.9381 17.7751 38.9379 17.7748L38.9376 17.7743L38.9364 17.7721C38.9358 17.771 38.9351 17.7698 38.9343 17.7685C38.9319 17.7641 38.9288 17.7588 38.9252 17.7526C38.9179 17.7401 38.9084 17.7241 38.8965 17.705C38.8728 17.6668 38.8395 17.6158 38.7968 17.5562C38.7122 17.4381 38.5863 17.2806 38.4193 17.1214C38.0909 16.8088 37.5494 16.4411 36.8165 16.4411C36.0503 16.4411 35.526 16.9312 35.2151 17.2216C35.1999 17.2358 35.1852 17.2496 35.1711 17.2627C34.7881 17.6183 34.6387 17.7172 34.4608 17.7172C34.2741 17.7172 34.1698 17.6426 33.8227 17.3296C33.4997 17.0382 32.9977 16.5883 32.1539 16.5883C31.3766 16.5883 30.8055 16.9756 30.4105 17.2434C30.3969 17.2527 30.3834 17.2618 30.3702 17.2707C29.9319 17.5672 29.681 17.7172 29.3564 17.7172C29.0893 17.7172 28.9881 17.6285 28.6682 17.3342C28.513 17.1914 28.2952 16.9937 28.0026 16.8419C27.6971 16.6834 27.3396 16.5883 26.9024 16.5883C25.9872 16.5883 25.4712 17.0071 25.1058 17.3128C24.7594 17.6025 24.6147 17.7172 24.3012 17.7172C24.0827 17.7172 24.0007 17.6472 23.7019 17.264L23.6912 17.2502C23.4046 16.8825 22.937 16.2824 21.9718 16.2453C21.1776 16.2147 20.6184 16.4464 20.2472 16.7492C20.0681 16.8953 19.9456 17.0476 19.8654 17.1706C19.8252 17.2321 19.7953 17.2868 19.7737 17.3305C19.7629 17.3524 19.7541 17.3716 19.7472 17.3878C19.7437 17.3959 19.7407 17.4032 19.738 17.4098L19.7373 17.4117C19.7363 17.4143 19.7353 17.4167 19.7344 17.4189C19.7341 17.4197 19.7338 17.4205 19.7335 17.4212V17.4214C19.7332 17.422 19.733 17.4225 19.7328 17.423C19.7327 17.4234 19.7326 17.4237 19.7325 17.424V17.4241C19.7323 17.4244 19.7322 17.4247 19.7322 17.425C19.7322 17.425 19.732 17.4253 19.732 17.4255L19.7318 17.4259C19.7316 17.4264 19.7315 17.4268 19.7315 17.4268ZM21.0133 17.9219L21.0122 17.9247C21.0139 17.9203 21.0156 17.916 21.0173 17.9116L21.0169 17.9129C21.0164 17.914 21.016 17.9151 21.0156 17.9161C21.0151 17.9174 21.0146 17.9187 21.0142 17.9198L21.0133 17.9219ZM21.0066 17.9376C21.0064 17.938 21.0062 17.9384 21.0062 17.9384C21.006 17.9387 21.0062 17.9384 21.0066 17.9376ZM37.7382 18.4451C37.7387 18.446 37.7388 18.4461 37.7384 18.4455L37.7382 18.4451Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.7315 20.7321C19.5982 21.0874 19.7782 21.4835 20.1335 21.6168C20.4801 21.7467 20.8654 21.5787 21.0078 21.2407C21.0094 21.2379 21.0121 21.2332 21.0162 21.227C21.031 21.2043 21.0619 21.1633 21.1159 21.1193C21.2109 21.0418 21.437 20.9053 21.9189 20.9238C22.2176 20.9353 22.3395 21.0567 22.6182 21.4143C22.624 21.4217 22.6298 21.4292 22.6358 21.4368C22.6406 21.4431 22.6456 21.4494 22.6505 21.4559C22.9207 21.8046 23.3796 22.3967 24.3012 22.3967C25.1264 22.3967 25.6134 21.9868 25.9417 21.7106C25.9573 21.6975 25.9725 21.6847 25.9874 21.6722C26.2968 21.4135 26.4925 21.2679 26.9024 21.2679C27.1278 21.2679 27.2672 21.3139 27.3697 21.3671C27.4851 21.4269 27.5863 21.5114 27.7378 21.6508C27.7535 21.6652 27.7696 21.6802 27.7863 21.6957L27.7867 21.6961C28.0824 21.9708 28.541 22.3967 29.3564 22.3967C30.1339 22.3967 30.7052 22.0093 31.1001 21.7414C31.1136 21.7322 31.127 21.7232 31.1402 21.7143C31.5785 21.4178 31.8293 21.2679 32.1539 21.2679C32.439 21.2679 32.5997 21.3824 32.9024 21.6554C32.9194 21.6708 32.9372 21.687 32.9558 21.7039L32.956 21.7041C33.2417 21.965 33.7146 22.3967 34.4608 22.3967C35.2268 22.3967 35.7511 21.9068 36.0619 21.6163C36.0772 21.602 36.0919 21.5883 36.1061 21.5751C36.4891 21.2195 36.6387 21.1206 36.8165 21.1206C37.0653 21.1206 37.2844 21.2437 37.4714 21.4219C37.562 21.5081 37.6325 21.596 37.6798 21.662C37.7031 21.6944 37.7197 21.7201 37.7293 21.7356C37.7334 21.7423 37.7362 21.747 37.7376 21.7494C37.9215 22.0795 38.3376 22.1995 38.6691 22.0172C39.0016 21.8343 39.123 21.4165 38.94 21.084C38.94 21.084 38.9399 21.0837 38.9398 21.0835L38.9395 21.083L38.9389 21.082L38.9383 21.0807C38.9381 21.0804 38.9379 21.08 38.9376 21.0796C38.9367 21.0779 38.9356 21.076 38.9343 21.0738C38.9319 21.0694 38.9288 21.0641 38.9252 21.0579C38.9179 21.0454 38.9084 21.0294 38.8965 21.0103C38.8728 20.9721 38.8395 20.921 38.7968 20.8615C38.7122 20.7434 38.5863 20.5859 38.4193 20.4267C38.0909 20.1141 37.5494 19.7464 36.8165 19.7464C36.0503 19.7464 35.526 20.2365 35.2151 20.5269L35.2147 20.5274C35.1996 20.5414 35.1851 20.555 35.1711 20.568C34.7881 20.9236 34.6387 21.0225 34.4608 21.0225C34.2741 21.0225 34.1698 20.9479 33.8227 20.6349C33.4997 20.3435 32.9977 19.8936 32.1539 19.8936C31.3766 19.8936 30.8055 20.2809 30.4105 20.5487C30.3969 20.5579 30.3834 20.5671 30.3702 20.576C29.9319 20.8725 29.681 21.0225 29.3564 21.0225C29.0893 21.0225 28.9881 20.9338 28.6682 20.6395C28.513 20.4967 28.2952 20.299 28.0026 20.1472C27.6971 19.9887 27.3396 19.8936 26.9024 19.8936C25.9872 19.8936 25.4712 20.3124 25.1058 20.6181C24.7594 20.9078 24.6147 21.0225 24.3012 21.0225C24.0827 21.0225 24.0007 20.9525 23.7019 20.5693L23.6912 20.5555C23.4046 20.1878 22.937 19.5877 21.9718 19.5506C21.1776 19.52 20.6184 19.7517 20.2472 20.0545C20.0681 20.2006 19.9456 20.3529 19.8654 20.4759C19.8252 20.5374 19.7953 20.5921 19.7737 20.6358C19.7629 20.6577 19.7541 20.6769 19.7472 20.6931C19.7437 20.7012 19.7407 20.7085 19.738 20.7151L19.7366 20.7189C19.7358 20.7207 19.7351 20.7225 19.7344 20.7242C19.7341 20.7251 19.7338 20.7259 19.7335 20.7267L19.7328 20.7283C19.7328 20.7286 19.7327 20.7288 19.7326 20.729L19.7325 20.7294C19.7324 20.7297 19.7322 20.73 19.7322 20.7303L19.732 20.7307L19.7318 20.7312L19.7315 20.7321ZM21.0133 21.2272L21.0122 21.23C21.0139 21.2256 21.0157 21.2212 21.0173 21.2168L21.0169 21.2182C21.0164 21.2193 21.016 21.2204 21.0156 21.2214C21.0151 21.2227 21.0146 21.2239 21.0142 21.2251L21.0133 21.2272ZM21.0066 21.2429C21.0064 21.2433 21.0062 21.2437 21.0062 21.2437C21.006 21.244 21.0062 21.2437 21.0066 21.2429ZM37.7386 21.7511C37.7387 21.7513 37.7387 21.7512 37.7384 21.7508L37.7386 21.7511Z" fill="#E65C28"/>
<path d="M44.4787 0H22.0984C21.2852 0 20.626 0.659213 20.626 1.47239V21.1043C20.626 21.9175 21.2852 22.5767 22.0984 22.5767H44.4787C45.2919 22.5767 45.9511 21.9175 45.9511 21.1043V1.47239C45.9511 0.659213 45.2919 0 44.4787 0Z" fill="#FECE12"/>
<path d="M44.4783 0H24.7483C23.9351 0 23.2759 0.659213 23.2759 1.47239V21.1043C23.2759 21.9175 23.9351 22.5767 24.7483 22.5767H44.4783C45.2915 22.5767 45.9507 21.9175 45.9507 21.1043V1.47239C45.9507 0.659213 45.2915 0 44.4783 0Z" fill="#FD9115"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.3835 4.22513C25.0282 4.09188 24.8482 3.69581 24.9815 3.34049C24.9815 3.34049 24.9816 3.34003 24.9818 3.33957L24.9819 3.33922C24.982 3.33903 24.9822 3.33864 24.9822 3.33864L24.9823 3.3381L24.9825 3.33771C24.9826 3.33738 24.9827 3.33705 24.9828 3.33671L24.9835 3.33508C24.9838 3.33427 24.9841 3.33344 24.9844 3.33259C24.9853 3.33032 24.9863 3.32791 24.9873 3.32537C24.9875 3.32473 24.9878 3.32408 24.988 3.32342C24.9907 3.31692 24.9937 3.30958 24.9972 3.30149C25.0041 3.28531 25.0129 3.26603 25.0237 3.24414C25.0453 3.20043 25.0752 3.14581 25.1154 3.08429C25.1956 2.96128 25.3181 2.80902 25.4972 2.66284C25.8684 2.36003 26.4276 2.12841 27.2218 2.15896C28.187 2.19609 28.6546 2.79613 28.9412 3.16391L28.9519 3.17769C29.2507 3.56091 29.3327 3.63084 29.5512 3.63084C29.8647 3.63084 30.0094 3.51613 30.3558 3.22647C30.7212 2.92079 31.2372 2.50202 32.1524 2.50201C32.5896 2.50201 32.9471 2.59711 33.2526 2.75558C33.5452 2.90741 33.763 3.10506 33.9182 3.24786C34.2381 3.54216 34.3393 3.63083 34.6064 3.63083C34.931 3.63083 35.1819 3.48091 35.6202 3.1844L35.6606 3.15706C36.0555 2.88923 36.6266 2.50199 37.4039 2.502C38.2477 2.50201 38.7497 2.95191 39.0728 3.24329C39.4198 3.55629 39.5241 3.63084 39.7108 3.63083C39.8887 3.63083 40.0382 3.53196 40.4211 3.17641C40.4352 3.16324 40.4499 3.14952 40.4651 3.13532C40.776 2.84483 41.3003 2.35477 42.0665 2.35477C42.7994 2.35477 43.3409 2.72247 43.6693 3.03511C43.8363 3.19427 43.9622 3.35177 44.0468 3.46984C44.0895 3.52942 44.1228 3.58044 44.1465 3.61863C44.1584 3.63776 44.1679 3.65381 44.1752 3.66624C44.1788 3.67245 44.1819 3.67778 44.1843 3.68215C44.185 3.68327 44.1856 3.68433 44.1861 3.68533L44.1876 3.68798C44.1881 3.68883 44.1885 3.68962 44.1889 3.69035L44.1895 3.6914L44.1898 3.69188C44.1899 3.69208 44.19 3.69234 44.19 3.69234C44.373 4.02485 44.2516 4.44266 43.9191 4.62554C43.5876 4.80787 43.1714 4.68786 42.9875 4.35763C42.9861 4.3552 42.9833 4.35056 42.9793 4.34397C42.9697 4.32848 42.9531 4.30281 42.9298 4.27036C42.8825 4.20439 42.812 4.11649 42.7214 4.03024C42.5344 3.85209 42.3153 3.729 42.0665 3.729C41.8887 3.729 41.7391 3.82789 41.3561 4.18343C41.3419 4.19664 41.3272 4.2104 41.3119 4.22465C41.0011 4.51514 40.4769 5.00506 39.7108 5.00506C38.9646 5.00507 38.4917 4.57338 38.206 4.3125L38.2059 4.3124C38.1873 4.29542 38.1694 4.27916 38.1524 4.26379C37.8497 3.99074 37.689 3.87623 37.4039 3.87623C37.0793 3.87622 36.8285 4.02614 36.3902 4.32265C36.377 4.33154 36.3637 4.34059 36.3501 4.34978C35.9552 4.61761 35.3839 5.00506 34.6064 5.00506C33.791 5.00506 33.3324 4.57912 33.0367 4.30447C33.0199 4.28887 33.0036 4.27373 32.9878 4.25921C32.8363 4.11981 32.7351 4.03525 32.6197 3.97543C32.5172 3.92225 32.3778 3.87624 32.1524 3.87624C31.7425 3.87625 31.5468 4.02188 31.2374 4.28062C31.2225 4.29304 31.2073 4.30581 31.1918 4.31889L31.1917 4.31899C30.8635 4.5952 30.3764 5.00507 29.5512 5.00507C28.6296 5.00507 28.1707 4.41292 27.9005 4.06426C27.8895 4.04997 27.8787 4.03608 27.8682 4.02265C27.5895 3.6651 27.4676 3.54367 27.1689 3.53218C26.687 3.51364 26.4609 3.65013 26.3659 3.72769C26.3119 3.77169 26.281 3.81269 26.2662 3.83538C26.2621 3.84154 26.2594 3.84624 26.2578 3.84907C26.1154 4.18707 25.7301 4.35508 25.3835 4.22513ZM26.2633 3.8356L26.2641 3.83358C26.2646 3.83238 26.2651 3.83112 26.2656 3.8298C26.2657 3.82961 26.2657 3.82942 26.2658 3.82923C26.2661 3.82836 26.2665 3.82747 26.2669 3.82654L26.2673 3.82524C26.2656 3.82963 26.2639 3.83399 26.2622 3.83833L26.2633 3.8356ZM42.9882 4.35881C42.9887 4.35966 42.9888 4.3598 42.9884 4.35917L42.9882 4.35881Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.3835 7.53042C25.0282 7.39718 24.8482 7.00111 24.9815 6.64579C24.9815 6.64579 24.9816 6.64531 24.9818 6.64488L24.982 6.64436L24.9822 6.64394C24.9822 6.64364 24.9824 6.64334 24.9825 6.64304C24.9826 6.6427 24.9827 6.64235 24.9828 6.642L24.9834 6.64044C24.9838 6.63962 24.9841 6.63875 24.9844 6.63789C24.9852 6.63589 24.9861 6.63379 24.9869 6.63159L24.988 6.62873C24.9907 6.62221 24.9937 6.61488 24.9972 6.60678C25.0041 6.59061 25.0129 6.57134 25.0237 6.54945C25.0453 6.50573 25.0752 6.4511 25.1154 6.38959C25.1956 6.26657 25.3181 6.11432 25.4972 5.96814C25.8684 5.66532 26.4276 5.43372 27.2218 5.46425C28.187 5.50138 28.6546 6.10143 28.9412 6.46921L28.9519 6.48298C29.2507 6.86621 29.3327 6.93615 29.5512 6.93615C29.8647 6.93615 30.0094 6.82143 30.3558 6.53177C30.7212 6.2261 31.2372 5.80731 32.1524 5.80731C32.5896 5.8073 32.9471 5.90241 33.2526 6.06088C33.5452 6.21271 33.763 6.41036 33.9182 6.55317C34.2381 6.84746 34.3393 6.93614 34.6064 6.93614C34.931 6.93614 35.1819 6.78621 35.6202 6.4897C35.6322 6.48157 35.6444 6.4733 35.6568 6.46491L35.6605 6.46235C36.0555 6.19453 36.6266 5.80728 37.4039 5.80729C38.2477 5.8073 38.7497 6.25722 39.0728 6.54858C39.4198 6.86158 39.5241 6.93614 39.7108 6.93614C39.8887 6.93614 40.0382 6.83726 40.4211 6.48171C40.4352 6.46857 40.4499 6.45488 40.465 6.44072L40.4651 6.44062C40.776 6.15013 41.3003 5.66006 42.0665 5.66006C42.7994 5.66006 43.3409 6.02777 43.6693 6.34041C43.8363 6.49957 43.9622 6.65707 44.0468 6.77515C44.0895 6.83472 44.1228 6.88573 44.1465 6.92393C44.1584 6.94307 44.1679 6.95911 44.1752 6.97153C44.1765 6.97381 44.1778 6.97598 44.1789 6.97801C44.181 6.98153 44.1828 6.98468 44.1843 6.98744C44.1851 6.98873 44.1857 6.98992 44.1864 6.99103C44.1868 6.99182 44.1872 6.99257 44.1876 6.99328C44.188 6.99389 44.1883 6.99446 44.1886 6.99501L44.1889 6.99565L44.1895 6.99669L44.1898 6.99718C44.1899 6.99738 44.1465 6.92393 44.1465 6.92393L44.19 6.99764C44.373 7.33015 44.2516 7.74795 43.9191 7.93084C43.5876 8.11315 43.1714 7.99317 42.9876 7.66301C42.9862 7.66061 42.9834 7.65593 42.9793 7.64928C42.9697 7.63379 42.9531 7.60812 42.9298 7.57567C42.8825 7.50969 42.812 7.42179 42.7214 7.33555C42.5344 7.15739 42.3153 7.0343 42.0665 7.0343C41.8887 7.0343 41.7391 7.13318 41.3561 7.48873C41.3419 7.50193 41.3272 7.5157 41.3119 7.52995C41.0011 7.82045 40.4768 8.31037 39.7108 8.31037C38.9646 8.31037 38.4917 7.87867 38.206 7.6178L38.2058 7.6176C38.1872 7.60066 38.1694 7.58443 38.1524 7.56909C37.8497 7.29604 37.689 7.18153 37.4039 7.18153C37.0793 7.18153 36.8285 7.33144 36.3902 7.62795C36.377 7.63685 36.3636 7.64591 36.3501 7.65511C35.9552 7.92294 35.3839 8.31037 34.6064 8.31037C33.791 8.31037 33.3324 7.88442 33.0367 7.60977C33.0199 7.59416 33.0036 7.57903 32.9878 7.56451C32.8363 7.42511 32.7351 7.34055 32.6197 7.28073C32.5172 7.22754 32.3778 7.18155 32.1524 7.18155C31.7425 7.18155 31.5468 7.32717 31.2374 7.58591L31.2238 7.5973C31.2191 7.60126 31.2143 7.60524 31.2095 7.60926C31.2036 7.61422 31.1977 7.61923 31.1917 7.62429C30.8634 7.90051 30.3764 8.31038 29.5512 8.31038C28.6296 8.31038 28.1707 7.71822 27.9005 7.36957C27.8895 7.35527 27.8787 7.34137 27.8682 7.32795C27.5895 6.97039 27.4676 6.84896 27.1689 6.83748C26.687 6.81893 26.4609 6.95543 26.3659 7.03298C26.3119 7.07699 26.281 7.11799 26.2662 7.14067C26.2621 7.14685 26.2594 7.15154 26.2578 7.15438C26.1154 7.49238 25.7301 7.66038 25.3835 7.53042ZM26.2622 7.14363L26.2633 7.1409L26.2646 7.1376L26.2656 7.13511L26.2658 7.13465C26.2661 7.13374 26.2664 7.1328 26.2669 7.13185L26.2673 7.13052C26.2657 7.13491 26.2639 7.13929 26.2622 7.14363ZM42.9886 7.66476C42.9887 7.66496 42.9887 7.66486 42.9884 7.66448L42.9886 7.66476Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.3835 10.7697C25.0282 10.6365 24.8482 10.2404 24.9815 9.88507C24.9815 9.88507 24.9816 9.88458 24.9818 9.88409C24.9818 9.88409 24.9821 9.8835 24.9822 9.88321C24.9822 9.88287 24.9824 9.88255 24.9825 9.88223L24.9826 9.88189C24.9827 9.88168 24.9828 9.88147 24.9828 9.88125C24.983 9.88087 24.9831 9.88047 24.9833 9.88008C24.9837 9.87914 24.9841 9.87816 24.9844 9.87712C24.9849 9.87598 24.9854 9.87481 24.9858 9.8736L24.9872 9.87003L24.988 9.868C24.9907 9.86152 24.9937 9.85415 24.9972 9.84601C25.0041 9.82991 25.0129 9.8106 25.0237 9.78871C25.0453 9.74499 25.0752 9.69037 25.1154 9.62886C25.1956 9.50584 25.3181 9.35358 25.4972 9.2074C25.8684 8.90459 26.4276 8.67298 27.2218 8.70352C28.187 8.74065 28.6546 9.34069 28.9412 9.70847L28.9519 9.72225C29.2507 10.1054 29.3327 10.1754 29.5512 10.1754C29.8647 10.1754 30.0094 10.0607 30.3558 9.77103C30.7212 9.46536 31.2372 9.04658 32.1524 9.04658C32.5896 9.04657 32.9471 9.14167 33.2526 9.30014C33.5452 9.45197 33.763 9.64962 33.9182 9.79243C34.2381 10.0867 34.3393 10.1754 34.6064 10.1754C34.931 10.1754 35.1819 10.0254 35.6202 9.72896L35.6606 9.70162C36.0555 9.43379 36.6266 9.04655 37.4039 9.04656C38.2477 9.04657 38.7497 9.49648 39.0728 9.78785C39.4198 10.1008 39.5241 10.1754 39.7108 10.1754C39.8887 10.1754 40.0382 10.0765 40.4211 9.72097C40.4352 9.7078 40.4499 9.69408 40.4651 9.67988C40.776 9.38939 41.3003 8.89933 42.0665 8.89933C42.7994 8.89933 43.3409 9.26703 43.6693 9.57967C43.8363 9.73884 43.9622 9.89636 44.0468 10.0144C44.0895 10.0739 44.1228 10.125 44.1465 10.1632C44.1584 10.1823 44.1679 10.1984 44.1752 10.2108L44.1811 10.221L44.1843 10.2267L44.1857 10.2292L44.1876 10.2326C44.1879 10.233 44.1882 10.2335 44.1884 10.234C44.1886 10.2343 44.1888 10.2346 44.1889 10.2349L44.1892 10.2354L44.1895 10.236L44.1898 10.2365L44.19 10.2369C44.373 10.5694 44.2516 10.9872 43.9191 11.1701C43.5882 11.3521 43.1728 11.2329 42.9885 10.9039C42.9887 10.9041 42.9886 10.9041 42.9886 10.9041L42.9885 10.9039L42.9884 10.9038L42.9883 10.9035L42.9881 10.9033C42.9876 10.9023 42.9866 10.9007 42.9852 10.8983C42.9837 10.8958 42.9817 10.8925 42.9793 10.8886C42.9697 10.8731 42.9531 10.8473 42.9298 10.8149C42.8825 10.749 42.812 10.661 42.7214 10.5748C42.5344 10.3967 42.3153 10.2736 42.0665 10.2736C41.8887 10.2736 41.7391 10.3724 41.3561 10.728C41.3419 10.7412 41.3272 10.7549 41.312 10.7692C41.0011 11.0597 40.4769 11.5497 39.7108 11.5497C38.9647 11.5497 38.4918 11.118 38.2061 10.8572C38.1874 10.8401 38.1695 10.8238 38.1524 10.8084C37.8497 10.5353 37.689 10.4208 37.4039 10.4208C37.0793 10.4208 36.8285 10.5707 36.3902 10.8673C36.377 10.8762 36.3636 10.8853 36.35 10.8945C35.955 11.1623 35.3838 11.5497 34.6064 11.5497C33.791 11.5497 33.3324 11.1237 33.0367 10.849L33.0366 10.8489C33.0198 10.8333 33.0036 10.8182 32.9878 10.8037C32.8363 10.6644 32.7351 10.5798 32.6197 10.52C32.5172 10.4668 32.3778 10.4208 32.1524 10.4208C31.7425 10.4208 31.5468 10.5664 31.2374 10.8251C31.2225 10.8376 31.2072 10.8505 31.1916 10.8636C30.8634 11.1398 30.3763 11.5497 29.5512 11.5497C28.6296 11.5497 28.1707 10.9575 27.9006 10.6088L27.8974 10.6047C27.8874 10.5919 27.8777 10.5793 27.8682 10.5672C27.5895 10.2097 27.4676 10.0883 27.1689 10.0768C26.687 10.0582 26.4609 10.1947 26.3659 10.2722C26.3119 10.3163 26.281 10.3572 26.2662 10.3799C26.2621 10.3861 26.2594 10.3908 26.2578 10.3936C26.1154 10.7317 25.7301 10.8997 25.3835 10.7697ZM26.2623 10.3828L26.2633 10.3802L26.2641 10.3783C26.2646 10.377 26.2651 10.3757 26.2656 10.3744L26.2662 10.3728C26.2649 10.3762 26.2636 10.3795 26.2623 10.3828ZM26.2566 10.3958C26.2564 10.3962 26.2562 10.3967 26.2562 10.3967C26.256 10.397 26.2562 10.3966 26.2566 10.3958ZM26.2673 10.3699L26.2664 10.3721L26.2669 10.3711C26.267 10.3707 26.2671 10.3703 26.2673 10.3699Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.9815 13.3707C24.8482 13.726 25.0282 14.1221 25.3835 14.2553C25.7301 14.3853 26.1154 14.2172 26.2578 13.8792C26.2594 13.8764 26.2621 13.8717 26.2662 13.8656C26.281 13.8429 26.3119 13.8019 26.3659 13.7579C26.4609 13.6803 26.687 13.5438 27.1689 13.5624C27.4676 13.5738 27.5895 13.6953 27.8682 14.0528C27.8786 14.0661 27.8893 14.0799 27.9003 14.0941L27.9005 14.0944C28.1707 14.4431 28.6296 15.0352 29.5512 15.0352C30.3764 15.0352 30.8635 14.6254 31.1917 14.3492C31.2073 14.336 31.2225 14.3232 31.2374 14.3108C31.5468 14.0521 31.7425 13.9064 32.1524 13.9064C32.3778 13.9064 32.5172 13.9524 32.6197 14.0056C32.7351 14.0654 32.8363 14.15 32.9878 14.2894C32.996 14.2969 33.0042 14.3045 33.0126 14.3123C33.0205 14.3196 33.0286 14.3271 33.0367 14.3346C33.3324 14.6093 33.791 15.0352 34.6064 15.0352C35.3839 15.0352 35.9552 14.6478 36.3501 14.38L36.351 14.3793C36.3643 14.3704 36.3773 14.3615 36.3902 14.3528C36.8285 14.0563 37.0793 13.9064 37.4039 13.9064C37.689 13.9064 37.8497 14.0209 38.1524 14.294C38.1695 14.3094 38.1873 14.3257 38.206 14.3427C38.4917 14.6036 38.9646 15.0352 39.7108 15.0352C40.4768 15.0352 41.0011 14.5453 41.3119 14.2548L41.3123 14.2545C41.3274 14.2404 41.342 14.2267 41.3561 14.2136C41.7391 13.8581 41.8887 13.7592 42.0665 13.7592C42.3153 13.7592 42.5344 13.8823 42.7214 14.0604C42.812 14.1467 42.8825 14.2346 42.9298 14.3005C42.9531 14.333 42.9697 14.3587 42.9793 14.3741C42.9833 14.3807 42.9861 14.3854 42.9875 14.3878C43.1714 14.718 43.5876 14.838 43.9191 14.6557C44.2516 14.4728 44.373 14.055 44.19 13.7225L44.1898 13.7221L44.1895 13.7216L44.1889 13.7205L44.1884 13.7195C44.1882 13.7192 44.1881 13.7189 44.1879 13.7186L44.1876 13.7182L44.1864 13.716C44.1858 13.7148 44.1851 13.7136 44.1843 13.7123C44.1819 13.708 44.1788 13.7026 44.1752 13.6964C44.1679 13.684 44.1584 13.6679 44.1465 13.6488C44.1228 13.6106 44.0895 13.5596 44.0468 13.5C43.9622 13.3819 43.8363 13.2244 43.6693 13.0653C43.3409 12.7526 42.7994 12.3849 42.0665 12.3849C41.3003 12.3849 40.776 12.875 40.4651 13.1655C40.4499 13.1797 40.4352 13.1934 40.4211 13.2066C40.0382 13.5621 39.8887 13.661 39.7108 13.661C39.5241 13.661 39.4198 13.5865 39.0728 13.2735C38.7497 12.9821 38.2477 12.5322 37.4039 12.5322C36.6266 12.5322 36.0555 12.9194 35.6606 13.1872C35.6469 13.1965 35.6334 13.2056 35.6202 13.2146C35.1819 13.5111 34.931 13.661 34.6064 13.661C34.3393 13.661 34.2381 13.5723 33.9182 13.278C33.763 13.1352 33.5452 12.9376 33.2526 12.7858C32.9471 12.6273 32.5896 12.5322 32.1524 12.5322C31.2372 12.5322 30.7212 12.951 30.3558 13.2566C30.0094 13.5463 29.8647 13.661 29.5512 13.661C29.3327 13.661 29.2507 13.5911 28.9519 13.2079L28.9412 13.1941C28.6546 12.8263 28.187 12.2263 27.2218 12.1891C26.4276 12.1586 25.8684 12.3902 25.4972 12.693C25.3181 12.8392 25.1956 12.9914 25.1154 13.1145C25.0752 13.176 25.0453 13.2306 25.0237 13.2743C25.0129 13.2962 25.0041 13.3155 24.9972 13.3317C24.9937 13.3398 24.9907 13.3471 24.988 13.3536L24.9873 13.3556C24.9863 13.3581 24.9853 13.3605 24.9844 13.3628C24.9841 13.3636 24.9838 13.3643 24.9835 13.3651V13.3653C24.9832 13.3658 24.983 13.3664 24.9828 13.3669C24.9827 13.3672 24.9826 13.3675 24.9825 13.3679V13.368C24.9823 13.3682 24.9822 13.3685 24.9822 13.3688C24.9822 13.3688 24.982 13.3691 24.982 13.3693L24.9818 13.3697C24.9816 13.3702 24.9815 13.3707 24.9815 13.3707ZM26.2633 13.8658L26.2622 13.8685C26.2639 13.8642 26.2656 13.8598 26.2673 13.8554L26.2669 13.8567C26.2664 13.8578 26.266 13.8589 26.2656 13.86C26.2651 13.8613 26.2646 13.8625 26.2642 13.8637L26.2633 13.8658ZM26.2566 13.8814C26.2564 13.8819 26.2562 13.8823 26.2562 13.8823C26.256 13.8825 26.2562 13.8822 26.2566 13.8814ZM42.9882 14.389C42.9887 14.3898 42.9888 14.39 42.9884 14.3893L42.9882 14.389Z" fill="#E65C28"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.9815 16.676C24.8482 17.0313 25.0282 17.4274 25.3835 17.5606C25.7301 17.6906 26.1154 17.5225 26.2578 17.1846C26.2594 17.1817 26.2621 17.177 26.2662 17.1708C26.281 17.1482 26.3119 17.1072 26.3659 17.0632C26.4609 16.9856 26.687 16.8491 27.1689 16.8677C27.4676 16.8791 27.5895 17.0006 27.8682 17.3581C27.874 17.3655 27.8798 17.373 27.8858 17.3807C27.8906 17.3869 27.8956 17.3933 27.9005 17.3997C28.1707 17.7484 28.6296 18.3406 29.5512 18.3406C30.3764 18.3406 30.8634 17.9307 31.1917 17.6545C31.2073 17.6414 31.2225 17.6285 31.2374 17.6161C31.5468 17.3573 31.7425 17.2117 32.1524 17.2117C32.3778 17.2117 32.5172 17.2577 32.6197 17.3109C32.7351 17.3707 32.8363 17.4553 32.9878 17.5947C33.0035 17.6091 33.0197 17.6241 33.0363 17.6396L33.0367 17.6399C33.3324 17.9146 33.791 18.3405 34.6064 18.3405C35.3839 18.3405 35.9552 17.9531 36.3501 17.6853C36.3636 17.6761 36.377 17.667 36.3902 17.6581C36.8285 17.3616 37.0793 17.2117 37.4039 17.2117C37.689 17.2117 37.8497 17.3262 38.1524 17.5993C38.1694 17.6146 38.1872 17.6308 38.2058 17.6478L38.206 17.648C38.4917 17.9088 38.9646 18.3405 39.7108 18.3405C40.4768 18.3405 41.0011 17.8506 41.3119 17.5601C41.3272 17.5459 41.3419 17.5321 41.3561 17.5189C41.7391 17.1634 41.8887 17.0645 42.0665 17.0645C42.3153 17.0645 42.5344 17.1876 42.7214 17.3657C42.812 17.452 42.8825 17.5399 42.9298 17.6058C42.9531 17.6383 42.9697 17.664 42.9793 17.6794C42.9834 17.6861 42.9862 17.6908 42.9876 17.6932C43.1715 18.0234 43.5877 18.1433 43.9191 17.961C44.2516 17.7781 44.373 17.3603 44.19 17.0278C44.19 17.0278 44.1899 17.0276 44.1898 17.0274L44.1895 17.0269L44.1889 17.0258L44.1883 17.0246C44.1881 17.0242 44.1879 17.0238 44.1876 17.0234C44.1867 17.0218 44.1856 17.0198 44.1843 17.0176C44.1819 17.0133 44.1788 17.0079 44.1752 17.0017C44.1679 16.9893 44.1584 16.9732 44.1465 16.9541C44.1228 16.9159 44.0895 16.8649 44.0468 16.8053C43.9622 16.6872 43.8363 16.5297 43.6693 16.3706C43.3409 16.0579 42.7994 15.6902 42.0665 15.6902C41.3003 15.6902 40.776 16.1803 40.4651 16.4708L40.4647 16.4712C40.4496 16.4853 40.4351 16.4989 40.4211 16.5119C40.0382 16.8674 39.8887 16.9663 39.7108 16.9663C39.5241 16.9663 39.4198 16.8918 39.0728 16.5788C38.7497 16.2874 38.2477 15.8375 37.4039 15.8375C36.6266 15.8375 36.0555 16.2247 35.6605 16.4925C35.6469 16.5018 35.6334 16.5109 35.6202 16.5199C35.1819 16.8164 34.931 16.9663 34.6064 16.9663C34.3393 16.9663 34.2381 16.8776 33.9182 16.5833C33.763 16.4405 33.5452 16.2429 33.2526 16.0911C32.9471 15.9326 32.5896 15.8375 32.1524 15.8375C31.2372 15.8375 30.7212 16.2563 30.3558 16.5619C30.0094 16.8516 29.8647 16.9663 29.5512 16.9663C29.3327 16.9663 29.2507 16.8964 28.9519 16.5132L28.9412 16.4994C28.6546 16.1316 28.187 15.5316 27.2218 15.4944C26.4276 15.4639 25.8684 15.6955 25.4972 15.9983C25.3181 16.1445 25.1956 16.2967 25.1154 16.4198C25.0752 16.4813 25.0453 16.5359 25.0237 16.5796C25.0129 16.6015 25.0041 16.6208 24.9972 16.637C24.9937 16.6451 24.9907 16.6524 24.988 16.6589L24.9866 16.6627C24.9858 16.6646 24.9851 16.6664 24.9844 16.6681C24.9841 16.6689 24.9838 16.6698 24.9835 16.6706L24.9828 16.6722C24.9828 16.6724 24.9827 16.6727 24.9826 16.6729L24.9825 16.6732C24.9824 16.6735 24.9822 16.6738 24.9822 16.6741L24.982 16.6746L24.9818 16.6751L24.9815 16.676ZM26.2633 17.1711L26.2622 17.1738C26.2639 17.1695 26.2657 17.1651 26.2673 17.1607L26.2669 17.162C26.2664 17.1631 26.266 17.1642 26.2656 17.1653C26.2651 17.1666 26.2646 17.1678 26.2642 17.1689L26.2633 17.1711ZM26.2566 17.1868C26.2564 17.1872 26.2562 17.1876 26.2562 17.1876C26.256 17.1878 26.2562 17.1875 26.2566 17.1868ZM42.9886 17.6949C42.9887 17.6951 42.9887 17.695 42.9884 17.6947L42.9886 17.6949Z" fill="#E65C28"/>
<path d="M6 18.0614C6 14.0497 9.25211 10.7976 13.2638 10.7976H46.7362C50.7479 10.7976 54 14.0497 54 18.0614V43.9755C54 44.7887 53.3408 45.4479 52.5276 45.4479H7.27607C6.57132 45.4479 6 44.8766 6 44.1718V18.0614Z" fill="#B4B4B4"/>
<path d="M22 18.0614C22 14.0497 25.2521 10.7976 29.2638 10.7976H46.7362C50.7479 10.7976 54 14.0497 54 18.0614V43.9755C54 44.7887 53.3408 45.4479 52.5276 45.4479H22V18.0614Z" fill="#C4C4C4"/>
<path d="M6 43.7793H22V45.448H6.83436C6.37355 45.448 6 45.0744 6 44.6137V43.7793Z" fill="#C4C4C4"/>
<path d="M13.2637 36.6135H15.1288C15.6709 36.6135 16.1104 36.1741 16.1104 35.6319V20.5154C16.1104 19.9732 15.6709 19.5338 15.1288 19.5338H13.2637C12.7216 19.5338 12.2821 19.9732 12.2821 20.5154V35.6319C12.2821 36.1741 12.7216 36.6135 13.2637 36.6135Z" fill="#2F2F2F"/>
<path d="M15.5217 23.2668C16.3891 23.2668 17.0923 22.5637 17.0923 21.6963C17.0923 20.8289 16.3891 20.1257 15.5217 20.1257H9.14138C8.27398 20.1257 7.57082 20.8289 7.57082 21.6963C7.57082 22.5637 8.27398 23.2668 9.14138 23.2668H15.5217Z" fill="#4A4A4A"/>
<path d="M12.4782 23.2668C13.3455 23.2668 14.0487 22.5637 14.0487 21.6963C14.0487 20.8289 13.3455 20.1257 12.4782 20.1257H9.14073C8.27334 20.1257 7.57018 20.8289 7.57018 21.6963C7.57018 22.5637 8.27334 23.2668 9.14073 23.2668H12.4782Z" fill="#808080"/>
<path d="M39.4829 35.0918C32.8878 35.0918 29.1261 29.915 28.9694 21.3005H32.2729C32.3815 27.6233 34.8169 30.3015 36.746 30.8537V21.3005H39.8568V26.7536C41.7618 26.5189 43.7631 24.034 44.4382 21.3005H47.5489C47.0305 24.669 44.8603 27.1539 43.317 28.1755C44.8603 29.0038 47.3321 31.1713 48.2724 35.0918H44.8482C44.1127 32.4689 42.2802 30.4395 39.8568 30.1635V35.0918H39.4829Z" fill="#2F2F2F"/>
<path d="M280.512 16.7987V14.5839H273.476V2.60403H271V16.7987H280.512Z" fill="black"/>
<path d="M283.458 4.83893C284.304 4.83893 284.923 4.25503 284.923 3.42953C284.923 2.60403 284.304 2 283.458 2C282.591 2 281.972 2.60403 281.972 3.42953C281.972 4.25503 282.591 4.83893 283.458 4.83893ZM284.634 16.7987V6.32886H282.261V16.7987H284.634Z" fill="black"/>
<path d="M291.606 14.7852C290.801 14.7852 290.409 14.4027 290.409 13.6174V8.34228H293.607V6.32886H290.409V3.30872H288.635L288.036 6.32886H286.282V8.34228H288.036V13.6174C288.036 15.6711 289.254 16.7987 291.606 16.7987H293.607L293.813 14.7852H291.606Z" fill="black"/>
<path d="M306 11.443C306 8.42282 303.689 6.12752 300.429 6.12752C297.169 6.12752 294.858 8.40268 294.858 11.5638C294.858 14.7248 297.169 17 300.429 17C302.657 17 304.762 15.9732 305.567 13.9799L303.338 13.6174C302.822 14.3624 301.832 14.8859 300.573 14.8859C298.758 14.8859 297.561 13.7987 297.334 12.1879H305.959C305.979 11.9664 306 11.7248 306 11.443ZM300.429 8.14094C301.915 8.14094 303.029 9.06711 303.421 10.3758H297.478C297.87 9.02684 298.985 8.14094 300.429 8.14094Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

+1
View File
@@ -29,3 +29,4 @@ smali2/build/resources.zip
smali/build/resources.zip
smali/assets/version.properties
*.keystore
gradle.properties
+24 -80
View File
@@ -1,8 +1,8 @@
<p align="center">
<a href="https://vtosters.app/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.discordapp.com/attachments/918864618116481029/1002916719595106344/VT_Fill_Logo_Dark.svg">
<img src="https://cdn.discordapp.com/attachments/918864618116481029/1002916719381201036/VT_Fill_Logo_Light.svg">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/vtosters/lite/main/.github/images/VT_Fill_Logo_Dark.svg">
<img src="https://raw.githubusercontent.com/vtosters/lite/main/.github/images/VT_Fill_Logo_Light.svg">
</picture>
</a>
<br>
@@ -41,87 +41,31 @@
### Быстрая навигация
* [Функционал](#функционал)
* [Отладка приложения](#отладка-приложения)
* [Разработка](#разработка)
* [Всё необходимое для сборки и компиляции](#всё-необходимое-для-сборки-и-компиляции)
* [Необходимые зависимости](#необходимые-зависимости)
* [Linux/macOS](#linuxmacos)
* [Windows](#windows)
- [Функциональность](#функциональность)
- [Отладка приложения](#отладка-приложения)
- [Разработка](#разработка)
- [Всё необходимое для сборки и компиляции](#всё-необходимое-для-сборки-и-компиляции)
- [Необходимые зависимости](#необходимые-зависимости)
- [Linux/macOS](#linuxmacos)
- [Windows](#windows)
## Функционал
## Функциональность
* Лента
* Блокировка рекламы в ленте
* Блокировка постов через фильтры
* Возможность отключить рекомендации от ВК
* Редактор докбара
* Редактор элементов Superapp
* Медиа контент
* Округление дат
* 1 января в 4:20
* 1 января в 4:20:00
* 1 января 2000 в 4:20:00
* Округление чисел
* Сокращение постов **(Показать полностью)**
* Результаты опросов без участия
* Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга)
* Новый раздел музыки
* Возможность скачивать видео
* Возможность найти фотографию через поисковые системы
* Интеграция с <a href="https://vkx.app/">VK X</a>
* Сообщения
* Обои в сообщениях
* Возможность выключения кнопки записи голосовых сообщений
* Возможность скрыть блок рекомендаций в сообщениях
* Режим **VK Me**
* Возможность вернуть вкладку уведомлений
* Встроенный переводчик текста для сообщений
* Возможность выбрать язык перевода
* Автоматический перевод ваших сообщений на выбранный язык
* Альтернативный дизайн эмодзи меню
* Возможность использовать системные эмодзи
* Активность
* Возможность видеть удаленные сообщения
* Функционал, позволяющий оставаться в «оффлайне» (принудительный оффлайн/не отправлять статус онлайна и т.п.)
* Нечиталка/неписалка для ЛС/бесед/ботов/групп
* Возможность отключить информацию о том, что вы просмотрели историю/прослушали голосовое сообщение
* Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger
* Отключить уведомление о том, что вы сделали скриншот в беседе
* Отключение редиректа через away.php
* Внешний вид
* **Milkshake** тема (дизайн новых версий ВК)
* Название заголовков в докбаре
* Возможность использовать акцент для иконок
* Возможность отключить счётчики в докбаре
* Смена иконки приложения (содержит много уникальных иконок для донатеров)
* Возможность покрасить панель навигации, веб-страницы
* Telegram Стикеры
* Возможность загружать свои стикерпаки из Telegram во ВКонтакте
* Интерфейс
* Возможность отключить блок историй наверху ленты
* Возможность отключить боковую камеру в разделе «Новости»
* Возможность отключить блок «Что у вас нового?» в разделе «Новости»
* Возможность менять раздел, который запускается при запуске
* Анимации фрагментов
* Возможность отключить редизайн видеопостов
* Возможность отключить блок миниаппов/VK Pay/Superapp
* Возможность отключить сокращение названий разделов в меню
* Возможность скрыть блок рекомендаций друзей в разделе «Друзья»
* Возможность скрыть подписи в настройках
* Прокси
* Возможность использовать **HTTP/HTTPS/SOCKS** прокси, менять домены **API/OAuth/Static**
* Другое
* Очистка кеша приложения (**всё/стикеры/изображения/видео/сообщения/WebView**)
* Автоочистка кеша при достижении указанного вами значения (**100/500 MB, 1/2/5 GB**)
* Функционал для **дебага приложения/бэкап возможности/верификации VTosters**
* Возможность вернуть старый дизайн ВКонтакте
* Нет рекламы и ограничений музыки
* Интеграция с <a href="https://vkx.app/">VKX</a> и <a href="https://www.last.fm/">Last.FM</a>
* Самая большая кастомизация и фильтрация ленты новостей
* Кеширование и скачивание треков
* Редактор нижней панели
* Скрытие активности в сообщениях и офлайн-режим
* Возможность отправлять стикеры из Telegram
* Отключение редиректа через away.php
* Поддержка сторонних прокси для пользователей из Украины
* Эксклюзивные функции и галочки для тех кто поддержал разработку. <a href="https://vtosters.app/donate">Подробнее</a>
* Глобальная оптимизация приложения VK (Удалены сторонние библиотеки рекламы, аналитики и метрики, заглушки для рекламных запросов)
А также:
* Галочки, которые видны только пользователям приложения **ВТостерс Lite** (подробнее тут: [vtosters.app](https://vtosters.app) ➝ Пожертвования)
* Оптимизация приложения VK (удаление ненужных библиотек, которые встроены в оригинальный VK)
И многое другое!
Все функции модификации описаны [здесь](https://github.com/vtosters/lite/blob/main/.github/features.md)
## Отладка приложения
@@ -149,7 +93,7 @@
При нахождении решения каких-либо проблем ждем вас в [Pull Requests](https://github.com/vtosters/lite/pulls)
* Рекомендуется установка **ADB** в систему ([гайд](https://technastic.com/system-wide-adb-fastboot-windows-10))
* Рекомендуется установка **ADB** в систему ([Как это сделать](https://technastic.com/system-wide-adb-fastboot-windows-10))
* Для индексации декомпилированного кода в Studio используется [dex2jar](https://github.com/pxb1988/dex2jar)
+5 -5
View File
@@ -69,19 +69,19 @@ task exportDex {
android {
compileSdkVersion 32
buildToolsVersion '32.0.0'
buildToolsVersion '33.0.0'
defaultConfig {
applicationId "ru.vtosters.lite.utils.lite"
minSdkVersion 21
minSdk 22
targetSdkVersion 32
versionCode 1
versionName "1.0"
multiDexEnabled true
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
@@ -89,9 +89,9 @@ android {
}
dependencies {
implementation "androidx.multidex:multidex:2.0.1"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.exifinterface:exifinterface:1.3.3'
implementation 'androidx.preference:preference:1.2.0'
implementation fileTree(dir: 'libs', include: ['*.aar'])
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,33 @@
// IVKExternalMusic.aidl
package bruhcollective.itaysonlab.libvkx;
interface ILibVkxService {
// Starts playback. playbackContext can be "other" if you don't sure what it is
void play(in List<String> audio_ids, in int index, in String playbackContext) = 1;
// A UserID. CHECK FOR THIS TO BE EQUAL BEFORE SENDING ANYTHING TO SERVICE!
int getUserId() = 2;
// Cache add/remove
void addTrackToCache(in int track_id, in int owner_id, in String access_key) = 3;
void deleteTrackFromCache(in int track_id, in int owner_id) = 4;
boolean isTrackCached(in int track_id, in int owner_id) = 5;
// 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.
List<String> getCache() = 6;
// [ver 1.1]
void downloadTrack(in int track_id, in int owner_id, in String access_key) = 7;
void downloadPlaylist(in int playlist_id, in int owner_id, in String access_key) = 8;
void addPlaylistToCache(in int playlist_id, in int owner_id, in String access_key) = 9;
void deletePlaylistFromCache(in int playlist_id, in int owner_id) = 10;
// [ver 1.2]
String getCacheCatalog() = 11;
List<String> getTracksInPlaylist(in String playlist_id, in String owner_id) = 12;
String getPlaylistDefJson(in String playlist_id, in String owner_id) = 13;
// [ver 1.3]
boolean isPlaylistCached(in int playlist_id, in int owner_id) = 14;
}
@@ -1,340 +0,0 @@
/*
* This file is auto-generated. DO NOT MODIFY.
*/
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.
*/
class Default implements ILibVkxService {
// Starts playback. playbackContext can be "other" if you don't sure what it is
@Override
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!
@Override
public int getUserId() throws android.os.RemoteException {
return 0;
}
// Cache add/remove
@Override
public void addTrackToCache(int track_id, int owner_id, String access_key) throws android.os.RemoteException {
}
@Override
public void deleteTrackFromCache(int track_id, int owner_id) throws android.os.RemoteException {
}
@Override
public boolean isTrackCached(int track_id, int owner_id) throws android.os.RemoteException {
return false;
}
// 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 {
return null;
}
@Override
public android.os.IBinder asBinder() {
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.
*/
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.
*/
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an bruhcollective.itaysonlab.libvkx.ILibVkxService interface,
* generating a proxy if needed.
*/
public static ILibVkxService asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof ILibVkxService))) {
return ((ILibVkxService) iin);
}
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;
}
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
String descriptor = DESCRIPTOR;
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(descriptor);
return true;
}
case TRANSACTION_play: {
data.enforceInterface(descriptor);
java.util.List<String> _arg0;
_arg0 = data.createStringArrayList();
int _arg1;
_arg1 = data.readInt();
String _arg2;
_arg2 = data.readString();
this.play(_arg0, _arg1, _arg2);
reply.writeNoException();
return true;
}
case TRANSACTION_getUserId: {
data.enforceInterface(descriptor);
int _result = this.getUserId();
reply.writeNoException();
reply.writeInt(_result);
return true;
}
case TRANSACTION_addTrackToCache: {
data.enforceInterface(descriptor);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
String _arg2;
_arg2 = data.readString();
this.addTrackToCache(_arg0, _arg1, _arg2);
reply.writeNoException();
return true;
}
case TRANSACTION_deleteTrackFromCache: {
data.enforceInterface(descriptor);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
this.deleteTrackFromCache(_arg0, _arg1);
reply.writeNoException();
return true;
}
case TRANSACTION_isTrackCached: {
data.enforceInterface(descriptor);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
boolean _result = this.isTrackCached(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(((_result) ? (1) : (0)));
return true;
}
case TRANSACTION_getCache: {
data.enforceInterface(descriptor);
java.util.List<String> _result = this.getCache();
reply.writeNoException();
reply.writeStringList(_result);
return true;
}
default: {
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements ILibVkxService {
public static ILibVkxService sDefaultImpl;
private final android.os.IBinder mRemote;
Proxy(android.os.IBinder remote) {
mRemote = remote;
}
@Override
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;
}
// 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 {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStringList(audio_ids);
_data.writeInt(index);
_data.writeString(playbackContext);
boolean _status = mRemote.transact(Stub.TRANSACTION_play, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().play(audio_ids, index, playbackContext);
return;
}
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
// Cache add/remove
@Override
public int getUserId() throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
boolean _status = mRemote.transact(Stub.TRANSACTION_getUserId, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
return getDefaultImpl().getUserId();
}
_reply.readException();
_result = _reply.readInt();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override
public void addTrackToCache(int track_id, int owner_id, String access_key) throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(track_id);
_data.writeInt(owner_id);
_data.writeString(access_key);
boolean _status = mRemote.transact(Stub.TRANSACTION_addTrackToCache, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().addTrackToCache(track_id, owner_id, access_key);
return;
}
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
@Override
public void deleteTrackFromCache(int track_id, int owner_id) throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(track_id);
_data.writeInt(owner_id);
boolean _status = mRemote.transact(Stub.TRANSACTION_deleteTrackFromCache, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().deleteTrackFromCache(track_id, owner_id);
return;
}
_reply.readException();
} finally {
_reply.recycle();
_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 {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(track_id);
_data.writeInt(owner_id);
boolean _status = mRemote.transact(Stub.TRANSACTION_isTrackCached, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
return getDefaultImpl().isTrackCached(track_id, owner_id);
}
_reply.readException();
_result = (0 != _reply.readInt());
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override
public java.util.List<String> getCache() throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.util.List<String> _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
boolean _status = mRemote.transact(Stub.TRANSACTION_getCache, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
return getDefaultImpl().getCache();
}
_reply.readException();
_result = _reply.createStringArrayList();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
}
}
@@ -2,6 +2,7 @@ package bruhcollective.itaysonlab.libvkx.client;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.isValidSignature;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -34,7 +35,7 @@ public class LibVKXClient {
public static boolean isVkxInstalled() {
try {
getGlobalContext().getPackageManager().getPackageInfo("ua.itaysonlab.vkx", 0);
return true;
return isValidSignature();
} catch (Exception unused) {
return false;
}
@@ -54,7 +55,13 @@ public class LibVKXClient {
return getInstance().runOnService(action);
}
public static void lambdaplay(List<MusicTrack> list, MusicTrack musicTrack, ILibVkxService iLibVkxService) {
public static void lambdaplay(List<MusicTrack> list, MusicTrack musicTrack, ILibVkxService iLibVkxService, MusicPlaybackLaunchContext playerRefer) {
var playbackContext = "";
if (playerRefer != null) {
playbackContext = playerRefer.v0();
}
int indexOf = list.indexOf(musicTrack);
var ids = new ArrayList<String>();
for (var track : list) {
@@ -65,17 +72,21 @@ public class LibVKXClient {
}
try {
iLibVkxService.play(ids, indexOf, "");
iLibVkxService.play(ids, indexOf, playbackContext);
} catch (RemoteException e) {
e.printStackTrace();
}
}
private static String asId(MusicTrack musicTrack) {
String str = musicTrack.e + "_" + musicTrack.d;
if (musicTrack.O == null || musicTrack.O.equals("")) {
return str;
public static void lambdaplay(List<MusicTrack> list, MusicTrack musicTrack, ILibVkxService iLibVkxService){
lambdaplay(list, musicTrack, iLibVkxService, null);
}
public static String asId(MusicTrack musicTrack) {
String id = musicTrack.e + "_" + musicTrack.d;
if (musicTrack.O != null && !musicTrack.O.equals("")) {
id += "_" + musicTrack.O;
}
return str + "_" + musicTrack.O;
return id;
}
}
@@ -1,7 +1,5 @@
package com.aefyr.tsg.g2;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -12,10 +10,12 @@ import androidx.annotation.Nullable;
import androidx.core.app.NotificationManagerCompat;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import com.vtosters.lite.R;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicLong;
import ru.vtosters.lite.utils.AndroidUtils;
/**
* Created by Aefyr on 20.05.2018.
@@ -39,7 +39,7 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds = new HashMap<>();
if (oreo()) {
NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Сервис стикеров Telegram в VTosters", NotificationManager.IMPORTANCE_HIGH);
NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, AndroidUtils.getString(R.string.telegram_stickers_service), NotificationManager.IMPORTANCE_HIGH);
((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChan);
}
}
@@ -49,8 +49,8 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds.put(pack, notificationId);
Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + ": загрузка" : pack.title + ": обновление");
builder.setContentText("Получение информации");
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString(R.string.telegram_stickers_downloading) : pack.title + AndroidUtils.getString(R.string.telegram_stickers_updating));
builder.setContentText(AndroidUtils.getString(R.string.telegram_stickers_gettinginfo));
builder.setOngoing(true);
manager.notify(notificationId, builder.build());
@@ -63,7 +63,7 @@ public class NotificationsHelper {
lastNotificationTime.set(System.currentTimeMillis());
Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + ": загрузка" : pack.title + ": обновление");
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString(R.string.telegram_stickers_downloading) : pack.title + AndroidUtils.getString(R.string.telegram_stickers_updating));
builder.setContentText(downloadProgress + "/" + pack.stickersCount);
builder.setProgress(pack.stickersCount, downloadProgress, false);
builder.setOngoing(true);
@@ -77,13 +77,13 @@ public class NotificationsHelper {
Notification.Builder builder = commonBuilder();
builder.setProgress(0, 0, false);
builder.setOngoing(false);
builder.setContentTitle("Сервис стикеров Telegram в VTosters");
builder.setContentTitle(AndroidUtils.getString(R.string.telegram_stickers_service));
String text;
if (success)
text = wasUpdate ? pack.title + " успешно обновлен" : pack.title + " успешно загружен";
text = pack.title + " " + AndroidUtils.getString(wasUpdate ? R.string.telegram_stickers_updated : R.string.telegram_stickers_downloaded);
else
text = wasUpdate ? pack.title + ": ошибка при обновлении" : pack.title + ": ошибка при загрузке";
text = pack.title + " " + AndroidUtils.getString(wasUpdate ? R.string.telegram_stickers_error_update : R.string.telegram_stickers_error_download);
if (e instanceof TelegramStickersGrabber.TSGException) {
text = pack.title + ": " + e.getMessage();
@@ -99,7 +99,7 @@ public class NotificationsHelper {
}
private Notification.Builder commonBuilder() {
var builder = new Notification.Builder(c).setPriority(Notification.PRIORITY_MAX).setSmallIcon(getIdentifier("ic_download_24", "drawable"));
var builder = new Notification.Builder(c).setPriority(Notification.PRIORITY_MAX).setSmallIcon(R.drawable.ic_download_24);
if (oreo()) {
builder.setChannelId(NOTIFICATION_CHANNEL_ID);
}
@@ -0,0 +1,242 @@
package com.vk.core.util;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import com.facebook.common.i.MediaUtils;
import com.facebook.x.g.EncodedImage;
import com.vk.imageloader.VKImageLoader;
import com.vk.log.L;
import com.vk.metrics.eventtracking.VkTracker;
import com.vtosters.lite.R;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.HashSet;
import b.h.g.m.CameraUtils;
import b.h.g.m.FileUtils;
import ru.vtosters.lite.concurrent.VTExecutors;
public class DownloadUtils {
public static final HashSet<Long> a = new HashSet<>();
public static void a(Context context, String str, String str2) {
a(context, str, str2, false);
}
public static void b(Context context, String str, String str2) {
a(context, str, str2, true);
}
private static void a(Context context, String str, String str2, boolean z) {
try {
b(context, str, str2, z);
} catch (Exception e2) {
L.d(e2);
ToastUtils.a(context.getString(R.string.error) + " [" + e2.getMessage() + "]");
}
}
private static void b(final Context context, String str, String uri, boolean z) {
if (TextUtils.isEmpty(uri)) {
return;
}
String fileName = a(str, uri);
File file;
Log.v("DownloadUtils", "download: filename = " + fileName + " | str = " + str + "| str2 = " + uri);
if (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".jpeg")) {
file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), fileName);
} else if (fileName.endsWith(".mp3") || fileName.endsWith(".wav") || fileName.endsWith(".ogg") || fileName.endsWith(".aac") || fileName.endsWith(".flac") || fileName.endsWith(".m4a")) {
file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath(), fileName);
} else if (fileName.endsWith(".mp4") || fileName.endsWith(".mkv") || fileName.endsWith(".avi") || fileName.endsWith(".flv") || fileName.endsWith(".wmv") || fileName.endsWith(".mov") || fileName.endsWith(".3gp")) {
file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath(), fileName);
} else {
file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), fileName);
}
boolean isImage = MediaUtils.c(FileUtils.f(file));
if (isImage) {
EncodedImage encodedImage = VKImageLoader.c(Uri.parse(uri));
final InputStream h = encodedImage == null ? null : encodedImage.h();
if (h != null) {
try {
if (file.getParentFile() != null) {
file.createNewFile();
}
if (file.exists()) {
VTExecutors.getIoExecutor().execute(() -> {
try {
FileUtils.b.a(h, new FileOutputStream(file), h.available(), null);
ToastUtils.a(context.getString(R.string.file_saved, file.getAbsoluteFile()));
} catch (IOException e) {
ToastUtils.a(context.getString(R.string.error) + " [" + e.getMessage() + "]");
e.printStackTrace();
}
});
}
} catch (Exception e2) {
L.a(e2);
}
CameraUtils.a(context, file, null);
return;
}
}
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(uri));
var mimeType = FileUtils.f(file);
request.setDestinationUri(Uri.fromFile(file));
request.setMimeType(mimeType);
request.setNotificationVisibility(1);
request.allowScanningByMediaScanner();
request.setTitle(str);
DownloadManager a2 = a(context);
if (a2 == null) {
return;
}
try {
long enqueue = a2.enqueue(request);
if (!z) {
return;
}
a.add(enqueue);
} catch (IllegalArgumentException e3) {
L.a(e3);
b(context);
}
}
private static String a(String str, String str2) {
String lastPathSegment = Uri.parse(str2).getLastPathSegment();
if (!TextUtils.isEmpty(str)) {
String replace = str.replace('/', '_');
return !replace.contains(".") ? lastPathSegment : replace;
}
return lastPathSegment;
}
@SuppressLint("Range")
public static boolean a(Context context, Uri uri) {
try {
Cursor query = a(context).query(new DownloadManager.Query().setFilterByStatus(11));
if (query != null && query.moveToFirst()) {
while (!uri.toString().equals(query.getString(query.getColumnIndex("uri")))) {
if (!query.moveToNext()) {
query.close();
return false;
}
}
@SuppressLint("Range")
int i = query.getInt(query.getColumnIndex("status"));
@SuppressLint("Range")
String string = query.getString(query.getColumnIndex("local_uri"));
query.close();
if (i == 1 || i == 2) {
ToastUtils.a(R.string.download_is_in_progress);
query.close();
return true;
} else if (i != 8) {
query.close();
return false;
} else {
boolean a2 = a(context, string);
query.close();
return a2;
}
}
return false;
} catch (SQLiteException e2) {
VkTracker.k.b(e2);
return false;
}
}
private static void b(Context context) {
if (context != null) {
try {
context.startActivity(new Intent("android.settings.APPLICATION_DETAILS_SETTINGS").setData(Uri.parse("package:com.android.providers.downloads")));
} catch (ActivityNotFoundException e2) {
L.a(e2);
context.startActivity(new Intent("android.settings.MANAGE_APPLICATIONS_SETTINGS"));
}
ToastUtils.a("Please enable download manager", true);
}
}
public static boolean a(Context context, String str) {
File file;
try {
try {
file = new File(new URI(str));
try {
if (!file.exists()) {
return false;
}
Intent intent = new Intent("android.intent.action.VIEW");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
var mimeType = FileUtils.f(file);
var uri = FileUtils.uriFromFile(file);
Log.d("DownloadUtils", "openFile: " + file.getAbsolutePath() + "| mimetype " + mimeType + "| uri " + uri);
if (!TextUtils.isEmpty(mimeType)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri, mimeType);
context.startActivity(intent);
return true;
}
throw new ActivityNotFoundException();
} catch (ActivityNotFoundException unused) {
return a(context, file);
}
} catch (ActivityNotFoundException unused2) {
unused2.printStackTrace();
}
} catch (Throwable th) {
VkTracker.k.b(th);
return false;
}
return false;
}
private static boolean a(Context context, File file) {
if (file != null && file.exists()) {
var mimeType = FileUtils.f(file);
var uri = FileUtils.uriFromFile(file);
Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(uri, mimeType);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.d("DownloadUtils", "openFile: " + file.getAbsolutePath() + "| mimetype " + mimeType + "| uri " + uri);
try {
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException e2) {
L.a(e2);
}
}
return false;
}
private static DownloadManager a(Context context) {
return (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
}
}
@@ -34,4 +34,7 @@ public enum DialogAction {
DNT_OFF,
pinmsg,
unpinmsg,
ENCRYPT_SETT,
ENCRYPT,
DOWNLOAD
}
@@ -81,6 +81,7 @@ public final class DialogActionsHelper {
CollectionExt.a(arrayList, DialogAction.NOTIFICATIONS_OFF, dialog.b(b2));
return arrayList;
}
return new ArrayList<>();
}
@@ -0,0 +1,131 @@
package com.vk.im.ui.views;
import androidx.annotation.NonNull;
public class Corners{
private int topLeft;
private int topRight;
private int bottomLeft;
private int bottomRight;
public Corners(int i, int i2, int i3, int i4){
this.topLeft = i;
this.topRight = i2;
this.bottomLeft = i3;
this.bottomRight = i4;
}
public Corners(int i, int i2, int i3, int i4, int i5) {
this((i5 & 1) != 0 ? 0 : i, (i5 & 2) != 0 ? 0 : i2, (i5 & 4) != 0 ? 0 : i3, (i5 & 8) != 0 ? 0 : i4);
}
public Corners() {
this(0, 0, 0, 0, 15);
}
public static Corners a(Corners corners, int i, int i2, int i3, int i4, int i5, Object obj){
if ((i5 & 1) != 0) {
i = corners.topLeft;
}
if ((i5 & 2) != 0) {
i2 = corners.topRight;
}
if ((i5 & 4) != 0) {
i3 = corners.bottomLeft;
}
if ((i5 & 8) != 0) {
i4 = corners.bottomRight;
}
corners.a(i, i2, i3, i4);
return corners;
}
public int a(){
return this.bottomLeft;
}
public int b(){
return this.bottomRight;
}
public int c(){
return this.topLeft;
}
public int d(){
return this.topRight;
}
public boolean e(){
int i;
int i2 = this.topLeft;
int i3 = this.topRight;
return i2 == i3 && i3 == (i = this.bottomRight) && this.bottomLeft == i;
}
public boolean equals(Object obj){
if (this != obj) {
if (!(obj instanceof Corners)) {
return false;
}
Corners corners = (Corners) obj;
return this.topLeft == corners.topLeft && this.topRight == corners.topRight && this.bottomLeft == corners.bottomLeft && this.bottomRight == corners.bottomRight;
}
return true;
}
public boolean f(){
return this.topLeft == 0 && e();
}
public void g(){
a(0, 0);
}
public int hashCode(){
return (((((this.topLeft * 31) + this.topRight) * 31) + this.bottomLeft) * 31) + this.bottomRight;
}
@NonNull
public String toString(){
return "Corners(topLeft=" + this.topLeft + ", topRight=" + this.topRight + ", bottomLeft=" + this.bottomLeft + ", bottomRight=" + this.bottomRight + ")";
}
public Corners a(int i, int i2){
if ((i2 & 1) > 0) {
this.topLeft = i;
}
if ((i2 & 2) > 0) {
this.topRight = i;
}
if ((i2 & 4) > 0) {
this.bottomLeft = i;
}
if ((i2 & 8) > 0) {
this.bottomRight = i;
}
if (i2 == 0) {
this.topLeft = 0;
this.topRight = 0;
this.bottomLeft = 0;
this.bottomRight = 0;
}
return this;
}
public Corners a(int i, int i2, int i3, int i4){
this.topLeft = i;
this.topRight = i2;
this.bottomLeft = i3;
this.bottomRight = i4;
return this;
}
public Corners a(Corners corners){
this.topLeft = corners.topLeft;
this.topRight = corners.topRight;
this.bottomLeft = corners.bottomLeft;
this.bottomRight = corners.bottomRight;
return this;
}
}
@@ -0,0 +1,137 @@
package com.vk.im.ui.views.avatars;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import com.vk.im.ui.o;
public class StoryBorderView extends View {
private boolean B;
private final Paint a;
private LinearGradient f15747b;
private int f15748c;
private int f15749d;
private int f15750e;
private int f15751f;
private final int g;
private final int h;
public StoryBorderView(Context context) {
this(context, null, 0, 6);
}
public StoryBorderView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0, 4);
}
public StoryBorderView(Context context, AttributeSet attributeSet, int i, int i2) {
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
public int getBorderColor() {
return this.f15749d;
}
public int getBorderGradientEndColor() {
return this.h;
}
public int getBorderGradientStartColor() {
return this.g;
}
public int getBorderWidth() {
return this.f15750e;
}
public int getPadding() {
return this.f15751f;
}
public int getViewSize() {
return this.f15748c;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawOval(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom(), this.a);
}
@Override
protected void onMeasure(int i, int i2) {
int i3 = this.f15748c;
setMeasuredDimension(i3, i3);
}
public void setBorderColor(int i) {
if (this.f15749d != i) {
this.f15749d = i;
this.a.setColor(i);
invalidate();
}
}
public void setBorderWidth(int i) {
if (this.f15750e != i) {
this.f15750e = i;
this.a.setStrokeWidth(i);
invalidate();
}
}
@Override
public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
super.setLayoutParams(layoutParams);
boolean z = false;
this.f15748c = Math.min(layoutParams != null ? layoutParams.width : 0, layoutParams != null ? layoutParams.height : 0);
this.f15747b = new LinearGradient(0.0f, 0.0f, 0.0f, this.f15748c, this.g, this.h, Shader.TileMode.MIRROR);
if (this.f15748c > 0) {
z = true;
}
if (z) {
return;
}
throw new IllegalArgumentException("Only exact size supported, specify avatar sizes in layout params");
}
public void setLive(boolean z) {
if (this.B != z) {
this.a.setShader(z ? this.f15747b : null);
this.a.setColor(z ? -1 : this.f15749d);
this.B = z;
invalidate();
}
}
public void setPadding(int i) {
if (this.f15751f != i) {
this.f15751f = i;
setPadding(i, i, i, i);
}
}
public void setViewSize(int i) {
this.f15748c = i;
}
public StoryBorderView(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
this.a = paint;
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, o.StoryBorderView);
setBorderColor(obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderColor, 0));
this.g = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientStartColor, 0);
this.h = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientEndColor, 0);
setBorderWidth(obtainStyledAttributes.getDimensionPixelSize(o.StoryBorderView_vkim_borderWidth, 0));
obtainStyledAttributes.recycle();
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,106 @@
package com.vk.profile.ui.community;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.util.AttributeSet;
import com.vk.core.ui.themes.Themable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.ContextExtKt;
import com.vk.dto.stories.model.StoriesContainer;
import com.vk.stories.view.BorderedCircleImageView;
import com.vtosters.lite.R;
public final class CommunityBorderedImageView extends BorderedCircleImageView implements Themable{
private boolean f0;
private int g0;
private int h0;
private PorterDuffColorFilter i0;
private PorterDuffColorFilter j0;
private int unread;
private int read;
public CommunityBorderedImageView(Context context){
this(context, null, 0, 6);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet){
this(context, attributeSet, 0, 4);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i, int i2){
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i){
super(context, attributeSet, i);
this.g0 = VKThemeHelper.d((int) R.attr.accent);
this.h0 = ContextExtKt.a(context, (int) R.color.gray_200);
this.i0 = new PorterDuffColorFilter(this.g0, PorterDuff.Mode.SRC_IN);
this.j0 = new PorterDuffColorFilter(this.h0, PorterDuff.Mode.SRC_IN);
}
public final void c(int unread, int read){ // get unread and read resid
this.unread = unread;
this.read = read;
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
}
public final int getPrimaryColor(){
return this.g0;
}
public final void setPrimaryColor(int i){
this.g0 = i;
this.i0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
}
public final int getWasViewedColor(){
return this.h0;
}
public final void setWasViewedColor(int i){
this.h0 = i;
this.j0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
}
public final void o(){
this.f0 = false;
l();
}
@Override // com.vk.stories.view.ClippedImageView, android.widget.ImageView, android.view.View
public void onDraw(Canvas canvas){
super.onDraw(canvas);
if (this.f0) {
a(canvas);
}
}
public final void setStoryContainer(StoriesContainer storiesContainer){
if (storiesContainer.L1()) {
this.f0 = true;
m();
if (storiesContainer.K1()) {
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
setBorderColorFilter(this.i0);
b(getWidth(), getHeight());
invalidate();
return;
}
this.T = BitmapFactory.decodeResource(getResources(), this.read);
setBorderColorFilter(this.j0);
b(getWidth(), getHeight());
invalidate();
return;
}
o();
}
@Override // com.vk.core.ui.themes.Themable
public void v(){
}
}
@@ -0,0 +1,301 @@
package com.vk.sharing.view;
import static b.h.z.f.roboto_medium;
import static ru.vtosters.lite.utils.Preferences.preferences;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import androidx.annotation.UiThread;
import androidx.core.content.ContextCompat;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.view.DraweeHolder;
import com.vk.core.util.ContextExtKt;
import com.vk.core.util.Screen;
import com.vk.im.ui.views.avatars.AbbreviationAvatarDrawable;
import com.vk.imageloader.view.VKMultiImageView;
import com.vk.navigation.NavigatorKeys;
import com.vtosters.lite.R;
import com.vtosters.lite.a0;
import java.util.Arrays;
@UiThread
public class TargetImageView extends VKMultiImageView {
private static final int I = Screen.a(2);
private final int B;
private final int C;
private Drawable D;
private String[] F;
private int G;
private final RectF f21629d;
private final Paint f21630e;
private Canvas f21631f;
private final RectF g;
private final Paint h;
public TargetImageView(Context context, Drawable d) {
this(context, null, 0, 6);
}
public TargetImageView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0, 4);
}
public TargetImageView(Context context, AttributeSet attributeSet, int i, int i2) {
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
private void e() {
int i = this.G;
for (int i2 = 0; i2 < i; i2++) {
a(i2, this.F[i2]);
}
}
private void f() {
int paddingLeft = getPaddingLeft();
int paddingTop = getPaddingTop();
int width = (getWidth() - paddingLeft) - getPaddingRight();
int height = (getHeight() - paddingTop) - getPaddingBottom();
int i = width / 2;
int i2 = height / 2;
int i3 = this.G;
if (i3 == 1) {
DraweeHolder<GenericDraweeHierarchy> a2 = this.a.a(0);
Drawable d2 = a2.d();
if (d2 != null) {
d2.setBounds(paddingLeft, paddingTop, width + paddingLeft, height + paddingTop);
}
} else if (i3 == 2) {
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(0);
Drawable d3 = a3.d();
if (d3 != null) {
int i4 = i + paddingLeft;
int i5 = height + paddingTop;
d3.setBounds(paddingLeft, paddingTop, i4, i5);
DraweeHolder<GenericDraweeHierarchy> a4 = this.a.a(1);
Drawable d4 = a4.d();
if (d4 != null) {
d4.setBounds(i4, paddingTop, paddingLeft + width, i5);
}
}
} else if (i3 == 3) {
DraweeHolder<GenericDraweeHierarchy> a5 = this.a.a(0);
Drawable d5 = a5.d();
if (d5 != null) {
int i6 = i + paddingLeft;
int i7 = height + paddingTop;
d5.setBounds(paddingLeft, paddingTop, i6, i7);
DraweeHolder<GenericDraweeHierarchy> a6 = this.a.a(1);
Drawable d6 = a6.d();
if (d6 != null) {
int i9 = paddingLeft + width;
int i10 = i2 + paddingTop;
d6.setBounds(i6, paddingTop, i9, i10);
DraweeHolder<GenericDraweeHierarchy> a7 = this.a.a(2);
Drawable d7 = a7.d();
if (d7 != null) {
d7.setBounds(i6, i10, i9, i7);
}
}
}
} else {
DraweeHolder<GenericDraweeHierarchy> a8 = this.a.a(0);
Drawable d8 = a8.d();
if (d8 != null) {
int i11 = i + paddingLeft;
int i13 = i2 + paddingTop;
d8.setBounds(paddingLeft, paddingTop, i11, i13);
DraweeHolder<GenericDraweeHierarchy> a9 = this.a.a(1);
Drawable d9 = a9.d();
if (d9 != null) {
int i16 = height + paddingTop;
d9.setBounds(paddingLeft, i13, i11, i16);
DraweeHolder<GenericDraweeHierarchy> a10 = this.a.a(2);
Drawable d10 = a10.d();
if (d10 != null) {
int i18 = paddingLeft + width;
d10.setBounds(i11, paddingTop, i18, i13);
DraweeHolder<GenericDraweeHierarchy> a11 = this.a.a(3);
Drawable d11 = a11.d();
if (d11 != null) {
d11.setBounds(i11, i13, i18, i16);
}
}
}
}
}
}
private void g() {
if (getWidth() == 0 || getHeight() == 0) {
return;
}
f();
}
private AbbreviationAvatarDrawable getAbbreviationDrawable() {
return a(getContext(), null, 2);
}
private AbbreviationAvatarDrawable a(Context context, Typeface typeface, int i) {
return new AbbreviationAvatarDrawable(context, (i & 2) != 0 ? ContextExtKt.e(context, roboto_medium) : typeface);
}
public void a(String str) {
Arrays.fill(this.F, null);
if (str == null) {
b();
this.G = 1;
g();
e();
return;
}
Uri uri = Uri.parse(str);
if (uri.getScheme().equals("vkchatphoto")) {
this.G = 0;
while (true) {
String queryParameter = uri.getQueryParameter("photo" + this.G);
if (queryParameter != null) {
int i = this.G;
this.G = i + 1;
this.F[i] = queryParameter;
} else {
g();
e();
return;
}
}
} else if (uri.getScheme().equals("vkchatplaceholder")) {
this.G = 1;
g();
AbbreviationAvatarDrawable abbreviationDrawable = getAbbreviationDrawable();
String queryParameter2 = uri.getQueryParameter(NavigatorKeys.Q);
int parseInt = queryParameter2 != null ? Integer.parseInt(queryParameter2) : 0;
String queryParameter3 = uri.getQueryParameter(NavigatorKeys.d);
if (queryParameter3 == null) {
queryParameter3 = "";
}
abbreviationDrawable.a(parseInt, queryParameter3);
a(0, getAbbreviationDrawable());
} else {
this.F[0] = str;
this.G = 1;
g();
e();
}
}
@Override // android.view.View
protected void onDraw(Canvas canvas) {
Canvas canvas2 = this.f21631f;
int pref = preferences.getInt("pic_rounding", 0);
if (canvas2 != null) {
canvas2.drawColor(0, PorterDuff.Mode.CLEAR);
}
int i = this.G;
for (int i2 = 0; i2 < i; i2++) {
DraweeHolder<GenericDraweeHierarchy> a2 = this.a.a(i2);
Drawable d2 = a2.d();
if (d2 != null) {
Canvas canvas3 = this.f21631f;
d2.draw(canvas3);
}
}
if (pref > 0) {
canvas.drawRoundRect(this.f21629d, pref, pref, this.f21630e);
} else {
canvas.drawOval(this.f21629d, this.f21630e);
}
if (isSelected()) {
if (pref > 0) {
canvas.drawRoundRect(this.g.left, this.g.top, this.g.right, this.g.bottom, pref, pref, this.h);
} else {
canvas.drawCircle(this.g.centerX(), this.g.centerY(), this.g.width() / 2, this.h);
}
this.D.draw(canvas);
}
}
@Override // android.view.View
protected void onSizeChanged(int i, int i2, int i3, int i4) {
super.onSizeChanged(i, i2, i3, i4);
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int paddingTop = getPaddingTop();
int i5 = i - paddingRight;
int paddingBottom = i2 - getPaddingBottom();
this.f21629d.set(paddingLeft, paddingTop, i5, paddingBottom);
Bitmap createBitmap = Bitmap.createBitmap(i5, paddingBottom, Bitmap.Config.ARGB_8888);
this.f21631f = new Canvas(createBitmap);
Shader.TileMode tileMode = Shader.TileMode.CLAMP;
this.f21630e.setShader(new BitmapShader(createBitmap, tileMode, tileMode));
float f2 = I / 2;
this.g.set(f2, f2, i - f2, (float) i2 - f2);
float f4 = i / 2;
this.h.setShader(new LinearGradient(f4, 0.0f, f4, (float) i2, this.B, this.C, Shader.TileMode.CLAMP));
Drawable drawable = this.D;
drawable.setBounds(i - drawable.getIntrinsicWidth(), i2 - this.D.getIntrinsicHeight(), i, i2);
f();
}
public TargetImageView(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
this.f21629d = new RectF();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setDither(true);
paint.setFilterBitmap(true);
this.f21630e = paint;
this.g = new RectF();
Paint paint2 = new Paint();
paint2.setAntiAlias(true);
paint2.setStrokeWidth(I);
paint2.setStyle(Paint.Style.STROKE);
this.h = paint2;
this.B = getAccentColor();
this.C = this.B;
Drawable c2 = ContextExtKt.c(context, R.drawable.ic_check_circle_composite_24_full);
if (c2 != null) {
this.D = c2;
this.F = new String[4];
int i2 = I * 2;
setPadding(i2, i2, i2, i2);
if (attributeSet != null) {
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, a0.TargetImageView);
setSelected(obtainStyledAttributes.getBoolean(0, false));
obtainStyledAttributes.recycle();
}
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.user_placeholder);
for (int i3 = 0; i3 <= 3; i3++) {
a();
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(i3);
a3.b().e(drawable);
}
setScaleType(ScalingUtils.b.o);
}
}
}
@@ -0,0 +1,442 @@
package com.vk.stories.view;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.airbnb.lottie.LottieComposition;
import com.airbnb.lottie.LottieCompositionFactory;
import com.airbnb.lottie.LottieDrawable;
import com.airbnb.lottie.LottieListener;
import com.facebook.common.internal.Supplier;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.u.b.a.PipelineDraweeControllerBuilder;
import com.facebook.x.g.CloseableImage;
import com.vk.core.ui.themes.Themable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.DrawableUtils;
import com.vk.core.util.ResUtils;
import com.vk.core.util.Screen;
import com.vk.dto.stories.d.StoriesContainerExt;
import com.vk.dto.stories.model.CommunityGroupedStoriesContainer;
import com.vk.dto.stories.model.StoriesContainer;
import com.vk.dto.stories.model.StoryEntry;
import com.vk.im.engine.models.Image;
import com.vk.im.ui.views.avatars.AvatarDataSource;
import com.vk.imageloader.FrescoWrapper;
import com.vk.stories.StoriesController;
import com.vtosters.lite.R;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
public class StoryCircleImageView extends BorderedCircleImageView implements Themable{
private static final HashSet<Integer> B0 = new HashSet<>();
private final PipelineDraweeControllerBuilder f0;
private int A0;
private Drawable g0;
private Drawable h0;
private Drawable i0;
private int j0;
private int k0;
private int l0;
private int m0;
private int n0;
private int o0;
private Bitmap p0;
private Bitmap q0;
private Bitmap r0;
private Bitmap s0;
private boolean t0;
private boolean u0;
private boolean v0;
private boolean w0;
private boolean x0;
private String y0;
private LottieDrawable z0;
public StoryCircleImageView(Context context){
this(context, null);
}
public StoryCircleImageView(Context context, AttributeSet attributeSet){
this(context, attributeSet, 0);
}
public StoryCircleImageView(Context context, AttributeSet attributeSet, int i){
super(context, attributeSet, i);
this.f0 = FrescoWrapper.c.d();
a(context, attributeSet, i);
}
private void b(Canvas canvas){
this.z0.draw(canvas);
}
private boolean o(){
return !this.u0 && !this.t0 && this.z0 == null && !this.w0 && !this.v0;
}
private void p(){
this.z0.stop();
this.z0 = null;
invalidate();
}
private void q(){
int i = this.j0;
if (i != 0 && VKThemeHelper.k.a(i)) {
this.k0 = VKThemeHelper.d(this.j0);
}
this.g0 = DrawableUtils.a(this.g0, ColorStateList.valueOf(this.k0));
Drawable drawable = this.g0;
int i2 = this.A0;
this.p0 = DrawableUtils.a(drawable, i2, i2);
int i3 = this.l0;
if (i3 != 0 && VKThemeHelper.k.a(i3)) {
this.m0 = VKThemeHelper.d(this.l0);
}
int i4 = this.m0;
if (i4 != 0) {
this.i0 = DrawableUtils.a(this.i0, ColorStateList.valueOf(i4));
}
int i5 = this.n0;
if (i5 != 0 && VKThemeHelper.k.a(i5)) {
this.o0 = VKThemeHelper.d(this.n0);
}
Drawable a2 = DrawableUtils.a(this.g0, ColorStateList.valueOf(0));
int i6 = this.A0;
DrawableUtils.a(a2, i6, i6);
Drawable a3 = DrawableUtils.a(this.h0, ColorStateList.valueOf(this.o0));
int i7 = this.A0;
this.r0 = DrawableUtils.a(a3, i7, i7);
Drawable a4 = DrawableUtils.a(this.g0, ColorStateList.valueOf(ContextCompat.getColor(getContext(), R.color.orange)));
int i8 = this.A0;
this.s0 = DrawableUtils.a(a4, i8, i8);
}
private void r(){
this.c0 = Screen.a(o() ? 0 : 2);
m();
q();
}
private void setUploadFailed(boolean z){
this.u0 = z;
invalidate();
}
@Override // com.vk.stories.view.ClippedImageView, android.widget.ImageView, android.view.View
public void onDraw(Canvas canvas){
super.onDraw(canvas);
setBorderAlpha(255);
if (this.u0) {
this.i0.draw(canvas);
} else if (this.t0) {
if (this.z0 != null) {
b(canvas);
return;
}
this.T = this.x0 ? this.s0 : this.p0;
b(getWidth(), getHeight());
a(canvas);
} else if (this.z0 != null) {
p();
} else if (!this.w0) {
} else {
this.T = this.r0;
setBorderAlpha(163);
b(getWidth(), getHeight());
a(canvas);
}
}
@Override // com.vk.stories.view.BorderedCircleImageView, android.view.View
public void onSizeChanged(int i, int i2, int i3, int i4){
super.onSizeChanged(i, i2, i3, i4);
this.i0.setBounds(0, 0, i, i2);
b(i);
}
public void setStoryContainer(@Nullable StoriesContainer storiesContainer){
boolean z = true;
boolean z2 = storiesContainer != null && storiesContainer.Q1();
this.v0 = storiesContainer != null && storiesContainer.S1() && !storiesContainer.L1();
boolean z3 = storiesContainer instanceof CommunityGroupedStoriesContainer;
this.x0 = z3;
if (storiesContainer != null) {
if (!StoriesContainerExt.c(storiesContainer) && !StoriesContainerExt.d(storiesContainer)) {
this.T = this.p0;
} else {
this.T = this.q0;
}
b(getWidth(), getHeight());
if (StoriesContainerExt.e(storiesContainer)) {
a(storiesContainer);
} else if (this.z0 != null) {
p();
}
this.w0 = !storiesContainer.K1() && storiesContainer.L1();
if (z2) {
String h = storiesContainer.h(ResUtils.c(R.dimen.story_preview_image_size));
if (h != null) {
a(h);
} else {
g();
}
if (StoriesController.a(storiesContainer)) {
setUploadFailed(true);
a(false, false);
} else {
setUploadFailed(false);
if (!storiesContainer.K1() && !StoriesContainerExt.c(storiesContainer)) {
a(false, false);
} else {
StoryEntry A1 = storiesContainer.A1();
if (A1 != null) {
a(true, !B0.contains(A1.b));
B0.add(A1.b);
} else {
a(true, false);
}
}
}
} else {
setUploadFailed(false);
if (!storiesContainer.K1() && !StoriesContainerExt.c(storiesContainer)) {
z = false;
}
a(z, false);
if (z3) {
b(((CommunityGroupedStoriesContainer) storiesContainer).j(ResUtils.c(R.dimen.story_preview_image_size)));
} else {
String h2 = storiesContainer.h(ResUtils.c(R.dimen.story_preview_image_size));
if (h2 != null) {
a(h2);
} else {
g();
}
}
}
} else {
g();
a(false, false);
setUploadFailed(false);
this.w0 = false;
}
r();
}
@Override // com.vk.core.ui.themes.Themable
public void v(){
r();
invalidate();
}
private void b(int i){
LottieDrawable lottieDrawable = this.z0;
if (lottieDrawable == null || lottieDrawable.e() == null) {
return;
}
this.z0.d(i / this.z0.e().a().width());
}
protected void a(Context context, AttributeSet attributeSet, int i){
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, com.vtosters.lite.a0.StoryCircleImageView, i, 0);
a(context, attributeSet, obtainStyledAttributes);
obtainStyledAttributes.recycle();
r();
this.T = this.p0;
}
public void b(@Nullable List<String> list){
PipelineDraweeControllerBuilder pipelineDraweeControllerBuilder = this.f0;
pipelineDraweeControllerBuilder.j();
pipelineDraweeControllerBuilder.a(getController());
setControllerListener(pipelineDraweeControllerBuilder);
a(pipelineDraweeControllerBuilder, list);
setController(pipelineDraweeControllerBuilder.k0());
}
@SuppressLint("ResourceType")
private void a(Context context, AttributeSet attributeSet, TypedArray typedArray){ // bullshit vk code is not working with custom bordered circle image
Drawable drawable;
this.A0 = typedArray.getDimensionPixelSize(0, Screen.a(64.0f));
if (typedArray.hasValue(2)) {
this.g0 = typedArray.getDrawable(2);
} else {
this.g0 = ContextCompat.getDrawable(context, R.drawable.bg_stores_unread_border_80);
}
if (typedArray.hasValue(3)) {
this.h0 = typedArray.getDrawable(3);
} else {
this.h0 = ContextCompat.getDrawable(context, R.drawable.bg_stores_read_border_80);
}
int b2 = VKThemeHelper.b(attributeSet, "vk_borderTint");
if (b2 != 0 && VKThemeHelper.k.a(b2)) {
this.j0 = b2;
} else if (typedArray.hasValue(5)) {
this.k0 = typedArray.getColor(5, 0);
} else {
this.j0 = R.attr.accent;
}
int b3 = VKThemeHelper.b(attributeSet, "vk_failBorderTint");
if (b3 != 0 && VKThemeHelper.k.a(b3)) {
this.l0 = b3;
} else if (typedArray.hasValue(7)) {
this.m0 = typedArray.getColor(7, 0);
}
int b4 = VKThemeHelper.b(attributeSet, "vk_borderSeenTint");
if (b4 != 0 && VKThemeHelper.k.a(b4)) {
this.n0 = b4;
} else if (typedArray.hasValue(4)) {
this.o0 = typedArray.getColor(4, 0);
} else {
this.o0 = 0;
}
if (typedArray.hasValue(6)) {
this.i0 = typedArray.getDrawable(6);
} else {
this.i0 = ContextCompat.getDrawable(context, R.drawable.ic_story_error_size64);
}
if (typedArray.hasValue(8)) {
drawable = typedArray.getDrawable(8);
} else {
drawable = ContextCompat.getDrawable(context, R.drawable.bg_live_unread_border);
}
if (typedArray.hasValue(9)) {
this.y0 = typedArray.getString(9);
} else {
this.y0 = "stories_animation_64.json";
}
int i = this.A0;
this.q0 = DrawableUtils.a(Objects.requireNonNull(drawable), i, i);
Drawable drawable2 = this.g0;
int i2 = this.A0;
DrawableUtils.a(drawable2, i2, i2);
Drawable drawable3 = this.h0;
int i3 = this.A0;
this.r0 = DrawableUtils.a(drawable3, i3, i3);
Drawable drawable4 = this.g0;
int i4 = this.A0;
this.s0 = DrawableUtils.a(drawable4, i4, i4);
}
public void a(StoriesContainer storiesContainer){
if (this.z0 == null) {
LottieCompositionFactory.a(getContext(), this.y0).b(new a(storiesContainer));
}
}
public void a(StoriesContainer storiesContainer, LottieComposition lottieComposition){
this.z0 = new LottieDrawable();
this.z0.a(lottieComposition);
this.z0.d(-1);
b(getWidth());
if (!StoriesContainerExt.f(storiesContainer)) {
this.z0.a(new b());
this.z0.start();
return;
}
this.z0.stop();
}
private void a(boolean z, boolean z2){
k();
this.t0 = z;
if (!z2) {
setSelectionAmount(1.0f);
} else {
n();
}
}
private void a(@NonNull PipelineDraweeControllerBuilder pipelineDraweeControllerBuilder, @Nullable final List<String> list){
pipelineDraweeControllerBuilder.b(null);
pipelineDraweeControllerBuilder.a((Supplier<DataSource<CloseableReference<com.facebook.x.g.CloseableImage>>>) null);
if (list != null && !list.isEmpty()) {
if (list.size() == 1) {
ImageRequestBuilder b2 = ImageRequestBuilder.b(Uri.parse(list.get(0)));
b2.a(ImageRequest.CacheChoice.SMALL);
pipelineDraweeControllerBuilder.b(b2.a());
return;
}
pipelineDraweeControllerBuilder.a((Supplier<DataSource<CloseableReference<CloseableImage>>>) () -> StoryCircleImageView.this.a(list));
return;
}
pipelineDraweeControllerBuilder.b(null);
}
public DataSource<CloseableReference<CloseableImage>> a(@Nullable List<String> list){
ArrayList<Image> arrayList = new ArrayList<>();
for (String o : Objects.requireNonNull(list)) {
arrayList.add(new Image(-1, -1, o));
}
return AvatarDataSource.a(arrayList, this.A0, 0);
}
public class a implements LottieListener<LottieComposition>{
final StoriesContainer a;
a(StoriesContainer storiesContainer){
this.a = storiesContainer;
}
@Override // com.airbnb.lottie.LottieListener
public void a(LottieComposition lottieComposition){
if (StoryCircleImageView.this.getWidth() > 0) {
StoryCircleImageView.this.a(this.a, lottieComposition);
} else {
StoryCircleImageView.this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver$OnGlobalLayoutListenerC0393a(lottieComposition));
}
}
public class ViewTreeObserver$OnGlobalLayoutListenerC0393a implements ViewTreeObserver.OnGlobalLayoutListener{
final LottieComposition a;
ViewTreeObserver$OnGlobalLayoutListenerC0393a(LottieComposition lottieComposition){
this.a = lottieComposition;
}
@Override // android.view.ViewTreeObserver.OnGlobalLayoutListener
public void onGlobalLayout(){
StoryCircleImageView.this.getViewTreeObserver().removeOnGlobalLayoutListener(this);
a aVar = a.this;
StoryCircleImageView.this.a(aVar.a, this.a);
}
}
}
public class b implements ValueAnimator.AnimatorUpdateListener{
b(){
}
@Override // android.animation.ValueAnimator.AnimatorUpdateListener
public void onAnimationUpdate(ValueAnimator valueAnimator){
StoryCircleImageView.this.invalidate();
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,6 @@
package com.vtosters.lite.ui.bottomnavigation;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock;
import android.annotation.SuppressLint;
@@ -219,13 +220,19 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
// ViewCompat.setScaleY(mLargeLabel, !mStaticModeEnabled && !checked ? mLargeScale : 1.0f);
ViewCompat.setScaleX(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
ViewCompat.setScaleY(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
// make mLargeLabel and mSmallLabel are bold
mLargeLabel.setTypeface(null, Typeface.BOLD);
mSmallLabel.setTypeface(null, Typeface.BOLD);
// make mLargeLabel and mSmallLabel text size is 10sp
mLargeLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
mSmallLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
int textsize;
if (vkme()){
textsize = 11;
} else {
textsize = 10;
}
mLargeLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, textsize);
mSmallLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, textsize);
mLargeLabel.setVisibility(/*checked ? VISIBLE :*/ INVISIBLE);
mSmallLabel.setVisibility(VISIBLE);//checked ? INVISIBLE : VISIBLE);
@@ -0,0 +1,38 @@
package ru.vtosters.lite.concurrent;
import com.vk.core.concurrent.VkExecutors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import io.reactivex.Scheduler;
public class VTExecutors {
public static ExecutorService getMusicDownloadExecutor() {
return VTMusicDownloadExecutor.getInstance();
}
public static ExecutorService getIoExecutor() {
return VkExecutors.x.e();
}
public static Scheduler getIoScheduler() {
return VkExecutors.x.f();
}
public static Scheduler getSlowTasksScheduler() {
return VkExecutors.x.q();
}
static class VTMusicDownloadExecutor {
private VTMusicDownloadExecutor() {}
private static class LazyHolder {
public static final ExecutorService INSTANCE = Executors.newSingleThreadExecutor();
}
public static ExecutorService getInstance() {
return LazyHolder.INSTANCE;
}
}
}
@@ -1,56 +1,31 @@
package ru.vtosters.lite.deviceinfo;
import static ru.vtosters.lite.deviceinfo.OEMDetector.hasMiuiIncrCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isEMUI;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isMIUI;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isSamsung;
import static ru.vtosters.lite.utils.About.getBuildNumber;
public class Device {
private String androidId;
private String bluetoothMac;
private String boardName;
private String brandName;
private String cpuAbi;
private String deviceName;
private String firmwareDisplay;
private String firmwareId;
private String manufacturerName;
private String modelName;
private String productName;
private String MiuiUiVersionCode;
private String MiuiUiVersionName;
private String MiuiIncrementalCode;
private String OneUiMinorVersion;
private String OneUiMajorVersion;
private String EmuiVersion;
private int sdkVersion;
private String serialId;
private String wifiMac;
public Device withSerialId(String str) {
this.serialId = str;
return this;
}
public Device withAndroidId(String str) {
this.androidId = str;
return this;
}
public Device withWifiMac(String str) {
this.wifiMac = str;
return this;
}
public Device withBluetoothMac(String str) {
this.bluetoothMac = str;
return this;
}
public Device withSdkVersion(int i) {
this.sdkVersion = i;
return this;
}
public Device withFirmwareId(String str) {
this.firmwareId = str;
return this;
}
public Device withFirmwareDisplay(String str) {
this.firmwareDisplay = str;
return this;
}
public Device withProductName(String str) {
this.productName = str;
return this;
@@ -66,11 +41,6 @@ public class Device {
return this;
}
public Device withCpuAbi(String str) {
this.cpuAbi = str;
return this;
}
public Device withManufacturerName(String str) {
this.manufacturerName = str;
return this;
@@ -86,11 +56,49 @@ public class Device {
return this;
}
public String toString() {
return "Device{serialId='" + this.serialId + "', androidId='" + this.androidId + "', wifiMac='" + this.wifiMac + "', bluetoothMac='" + this.bluetoothMac + "'}";
public Device withMiuiUiVersionName(String str) {
this.MiuiUiVersionName = str;
return this;
}
public Device withMiuiUiVersionCodeName(String str) {
this.MiuiUiVersionCode = str;
return this;
}
public Device withOneUiMinorVersionName(String str) {
this.OneUiMinorVersion = str;
return this;
}
public Device withOneUiMajorVersionName(String str) {
this.OneUiMajorVersion = str;
return this;
}
public Device withMiuiIncrementalCodeName(String str) {
this.MiuiIncrementalCode = str;
return this;
}
public Device withEmuiVersionName(String str) {
this.EmuiVersion = str;
return this;
}
public String toDeviceName() {
return "Device{sdkVersion=" + this.sdkVersion + ", productName='" + this.productName + "', deviceName='" + this.deviceName + "', boardName='" + this.boardName + "', cpuAbi='" + this.cpuAbi + "', manufacturerName='" + this.manufacturerName + "', brandName='" + this.brandName + "', modelName='" + this.modelName + "'}";
return "Device information: "
+ "commit='" + getBuildNumber()
+ "', sdkVersion=" + this.sdkVersion
+ ", productName='" + this.productName
+ "', deviceName='" + this.deviceName
+ "', boardName='" + this.boardName
+ "', manufacturerName='" + this.manufacturerName
+ "', brandName='" + this.brandName
+ (isMIUI() ? "', MiuiUiVersionCode='" + this.MiuiUiVersionCode + "', MiuiUiVersionName='" + this.MiuiUiVersionName : "")
+ (isSamsung() ? "', OneUiMajorVersion='" + this.OneUiMajorVersion + "', OneUiMinorVersion='" + this.OneUiMinorVersion : "")
+ (hasMiuiIncrCode() ? "', MiuiUiVersionIncrementalCode='" + this.MiuiIncrementalCode : "")
+ (isEMUI() ? "', EmuiVersion='" + this.EmuiVersion : "")
+ "', modelName='" + this.modelName + "'";
}
}
@@ -1,192 +1,31 @@
package ru.vtosters.lite.deviceinfo;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getEmuiVersionCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionIncrementalCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionName;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getOneUiMajorVersion;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getOneUiMinorVersion;
import android.os.Build;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.os.EnvironmentCompat;
import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.NetworkInterface;
import java.util.Collections;
public class DeviceInfoCollector {
private static final String TAG = "DeviceInfoCollector";
public Device collect(Context context) {
return new Device().withSerialId(serialId()).withAndroidId(androidId(context)).withWifiMac(wifiMac(context)).withBluetoothMac(bluetoothMac(context)).withSdkVersion(Build.VERSION.SDK_INT).withFirmwareId(Build.ID).withFirmwareDisplay(Build.DISPLAY).withProductName(Build.PRODUCT).withDeviceName(Build.DEVICE).withBoardName(Build.BOARD).withCpuAbi(Build.CPU_ABI).withManufacturerName(Build.MANUFACTURER).withBrandName(Build.BRAND).withModelName(Build.MODEL);
}
private String serialId() {
String str;
try {
Class<?> cls = Class.forName("android.os.SystemProperties");
Method method = cls.getMethod("get", String.class);
str = (String) method.invoke(cls, "gsm.sn1");
if (isInvalidSerial(str)) {
str = (String) method.invoke(cls, "ril.serialnumber");
}
if (isInvalidSerial(str)) {
str = (String) method.invoke(cls, "ro.serialno");
}
if (isInvalidSerial(str)) {
str = (String) method.invoke(cls, "sys.serialnumber");
}
if (isInvalidSerial(str)) {
str = Build.SERIAL;
}
} catch (Exception e) {
Log.d(TAG, "Serial ID obtaining failed: ", e);
}
str = null;
if (str != null) {
return str.toLowerCase();
}
return null;
}
private String androidId(Context context) {
return Settings.Secure.getString(context.getContentResolver(), "android_id").toLowerCase();
}
private String wifiMac(Context context) {
String wifiMacFromManager = wifiMacFromManager(context);
if (isInvalidMac(wifiMacFromManager)) {
wifiMacFromManager = wifiMacFromNetworkInterfaces();
}
if (isInvalidMac(wifiMacFromManager)) {
wifiMacFromManager = wifiMacFromFileSystem();
}
if (isInvalidMac(wifiMacFromManager)) {
wifiMacFromManager = null;
}
if (wifiMacFromManager != null) {
return wifiMacFromManager.toLowerCase();
}
return null;
}
private String wifiMacFromManager(Context context) {
WifiInfo connectionInfo;
try {
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager == null || (connectionInfo = wifiManager.getConnectionInfo()) == null) {
return null;
}
return null;
} catch (Exception e) {
Log.d(TAG, "WiFi MAC obtaining from manager failed: ", e);
return null;
}
}
private String wifiMacFromNetworkInterfaces() {
try {
for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
byte[] hardwareAddress = networkInterface.getHardwareAddress();
if (hardwareAddress == null) {
return null;
}
StringBuilder sb = new StringBuilder();
int length = hardwareAddress.length;
for (int i = 0; i < length; i++) {
sb.append(String.format("%02X:", Byte.valueOf(hardwareAddress[i])));
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
}
return null;
} catch (Exception e) {
Log.d(TAG, "WiFi MAC obtaining from network interfaces failed: ", e);
return null;
}
}
private String wifiMacFromFileSystem() {
try {
FileReader fileReader = new FileReader("/sys/class/net/wlan0/address");
try {
BufferedReader bufferedReader = new BufferedReader(fileReader);
try {
String readLine = bufferedReader.readLine();
bufferedReader.close();
fileReader.close();
return readLine;
} catch (Throwable th) {
th.addSuppressed(th);
}
} catch (Throwable th2) {
throw th2;
}
} catch (Exception e) {
Log.d(TAG, "WiFi MAC obtaining from file system failed: ", e);
return null;
}
return null;
}
private String bluetoothMac(Context context) {
String bluetoothMacFromAdapter = bluetoothMacFromAdapter();
if (isInvalidMac(bluetoothMacFromAdapter)) {
bluetoothMacFromAdapter = bluetoothMacFromContentResolver(context);
}
if (isInvalidMac(bluetoothMacFromAdapter)) {
bluetoothMacFromAdapter = null;
}
if (bluetoothMacFromAdapter != null) {
return bluetoothMacFromAdapter.toLowerCase();
}
return null;
}
private String bluetoothMacFromAdapter() {
try {
BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();
if (defaultAdapter == null) {
return null;
}
if (Build.VERSION.SDK_INT < 23) {
return null;
}
Field declaredField = defaultAdapter.getClass().getDeclaredField("mService");
declaredField.setAccessible(true);
Object obj = declaredField.get(defaultAdapter);
if (obj != null) {
return (String) obj.getClass().getMethod("getAddress").invoke(obj, new Object[0]);
}
return null;
} catch (Exception e) {
Log.d(TAG, "BT MAC obtaining from adapter failed: ", e);
return null;
}
}
private String bluetoothMacFromContentResolver(Context context) {
try {
return Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
} catch (Exception e) {
Log.d(TAG, "BT MAC obtaining from content resolver failed: ", e);
return null;
}
}
private boolean isInvalidSerial(String str) {
return TextUtils.isEmpty(str) || EnvironmentCompat.MEDIA_UNKNOWN.equalsIgnoreCase(str);
}
private boolean isInvalidMac(String str) {
return TextUtils.isEmpty(str) || "02:00:00:00:00:00".equalsIgnoreCase(str) || "00:00:00:00:00:00".equalsIgnoreCase(str);
public Device collect() {
return new Device()
.withSdkVersion(Build.VERSION.SDK_INT)
.withProductName(Build.PRODUCT)
.withDeviceName(Build.DEVICE)
.withBoardName(Build.BOARD)
.withManufacturerName(Build.MANUFACTURER)
.withBrandName(Build.BRAND)
.withModelName(Build.MODEL)
.withOneUiMajorVersionName(String.valueOf(getOneUiMajorVersion()))
.withOneUiMinorVersionName(String.valueOf(getOneUiMinorVersion()))
.withMiuiUiVersionName(getMiuiUiVersionName())
.withMiuiIncrementalCodeName(getMiuiUiVersionIncrementalCode())
.withEmuiVersionName(getEmuiVersionCode())
.withMiuiUiVersionCodeName(getMiuiUiVersionCode());
}
}
@@ -1,55 +1,133 @@
package ru.vtosters.lite.deviceinfo;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import ru.vtosters.lite.utils.ReflectionUtils;
public class OEMDetector {
private static Field semPlatformIntField;
private static Method getPropMtd;
private static Boolean isOneUi;
private static int oneUiMajorVersion;
private static float oneUiMinorVersion;
static {
try {
getPropMtd = ReflectionUtils.getDeclaredMethod("android.os.SystemProperties", "get", String.class);
semPlatformIntField = ReflectionUtils.getDeclaredField(Build.VERSION.class, "SEM_PLATFORM_INT");
} catch (NoSuchFieldException | ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace();
}
}
public static boolean isOneUi() {
if (isOneUi != null)
return isSamsung() && isOneUi;
try {
var semPlatform = semPlatformIntField.getInt(null);
if (semPlatform < 0x186a0) {
isOneUi = false;
return false;
}
final var encodedVersion = semPlatform - 0x15f90;
oneUiMajorVersion = encodedVersion / 0x2710;
oneUiMinorVersion = (encodedVersion % 0x2710) / 0x64;
isOneUi = true;
} catch (Throwable e) {
isOneUi = false;
}
return isOneUi;
}
public static int getOneUiMajorVersion() {
return isOneUi() ? oneUiMajorVersion : 0;
}
public static float getOneUiMinorVersion() {
return isOneUi() ? oneUiMinorVersion : 0;
}
public static boolean isOEM() {
return isMIUI() || isEMUI() || isFlyme() || isZenUI() || isSamsung() || isVivo();
}
private static boolean isMIUI() {
return !TextUtils.isEmpty(getSystemProperty("ro.miui.ui.version.name"));
public static boolean isMIUI() {
try {
getGlobalContext().getPackageManager().getPackageInfo("com.miui.system", 0);
return true;
} catch (Exception unused) {
return detectMiuiV2();
}
}
private static boolean isEMUI() {
public static boolean isIntentResolved(Context ctx, Intent intent ){
return (intent!=null && ctx.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null);
}
public static boolean detectMiuiV2() {
var ctx = getGlobalContext();
return isIntentResolved(ctx, new Intent("miui.intent.action.OP_AUTO_START").addCategory(Intent.CATEGORY_DEFAULT))
|| isIntentResolved(ctx, new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")))
|| isIntentResolved(ctx, new Intent("miui.intent.action.POWER_HIDE_MODE_APP_LIST").addCategory(Intent.CATEGORY_DEFAULT))
|| isIntentResolved(ctx, new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.powercenter.PowerSettings")));
}
public static boolean hasMiuiIncrCode() {
return !TextUtils.isEmpty(getMiuiUiVersionIncrementalCode()) && isMIUI();
}
public static boolean isEMUI() {
return !TextUtils.isEmpty(getSystemProperty("ro.build.hw_emui_api_level"));
}
private static boolean isZenUI() {
public static boolean isZenUI() {
return !TextUtils.isEmpty(getSystemProperty("ro.asus.ui"));
}
private static boolean isVivo() {
public static boolean isVivo() {
return !TextUtils.isEmpty(getSystemProperty("ro.vivo.os.version")) || !TextUtils.isEmpty(getSystemProperty("ro.vivo.rom")) || !TextUtils.isEmpty(getSystemProperty("ro.vivo.rom.version")) || !TextUtils.isEmpty(getSystemProperty("ro.vivo.build.version.sdk"));
}
private static boolean isSamsung() {
public static boolean isSamsung() {
return !TextUtils.isEmpty(getSystemProperty("ro.config.knox"));
}
private static boolean isFlyme() {
public static boolean isFlyme() {
return !TextUtils.isEmpty(getSystemProperty("ro.build.ro.meizu.rom.config")) || !TextUtils.isEmpty(getSystemProperty("persist.sys.static_blur_mode")) || !TextUtils.isEmpty(getSystemProperty("persist.sys.use.flyme.icon"));
}
private static String getSystemProperty(String str) {
BufferedReader bufferedReader;
public static String getMiuiUiVersionName() {
return getSystemProperty("ro.miui.ui.version.name");
}
public static String getMiuiUiVersionCode() {
return getSystemProperty("ro.miui.ui.version.code");
}
public static String getEmuiVersionCode() {
return getSystemProperty("ro.build.version.emui");
}
public static String getMiuiUiVersionIncrementalCode() {
return getSystemProperty("ro.build.version.incremental");
}
public static String getSystemProperty(String prop) {
try {
bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("getprop " + str).getInputStream()), 1024);
try {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
return bufferedReader.readLine();
} catch (IOException ignored) {
}
} catch (Throwable ignored) {
return (String) getPropMtd.invoke(null, prop);
} catch (Throwable e) {
e.printStackTrace();
return null;
}
return null;
}
}
@@ -4,90 +4,288 @@ import static ru.vtosters.lite.dnr.DNRModule.hookDNR;
import static ru.vtosters.lite.dnr.DNRModule.hookDNT;
import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import com.vk.core.network.Network;
import com.vk.im.engine.ImEngine1;
import com.vk.im.engine.events.OnDialogUpdateEvent;
import com.vk.im.engine.models.EntityIntMap;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.common.DialogAction;
import com.vk.im.ui.components.common.MsgAction;
import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg;
import com.vk.im.ui.views.dialog_actions.DialogActionsListView;
import com.vtosters.lite.R;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.vtosters.lite.downloaders.MessagesDownloader;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.hooks.CryptImHook;
import ru.vtosters.lite.ui.dialogs.Translate;
import ru.vtosters.lite.utils.AndroidUtils;
public class DNRInjector {
public static void inject(Dialog dialog, List<DialogAction> list) {
int peerId = dialog.getId();
int peerId = 0;
list.add(DialogAction.valueOf("pinmsg"));
list.add(DialogAction.valueOf("unpinmsg"));
if (dialog != null) {
try {
peerId = dialog.getId();
} catch (Exception e) {
Log.d("DialoggetId", "null");
}
}
if (peerId == 0) {
return;
}
list.add(DialogAction.DOWNLOAD);
list.add(DialogAction.pinmsg);
list.add(DialogAction.unpinmsg);
if (isDnrEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNR_OFF"));
list.add(DialogAction.DNR_OFF);
} else {
list.add(DialogAction.valueOf("DNR_ON"));
list.add(DialogAction.DNR_ON);
}
if (isDntEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNT_OFF"));
list.add(DialogAction.DNT_OFF);
} else {
list.add(DialogAction.valueOf("DNT_ON"));
list.add(DialogAction.DNT_ON);
}
list.add(DialogAction.ENCRYPT);
IMProcessor prov = EncryptProvider.getProcessorFor(peerId);
if (prov != null && !prov.isPublic()) {
list.add(DialogAction.ENCRYPT_SETT);
}
}
public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) {
hashMap.put(DialogAction.valueOf("DNR_ON"), getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.valueOf("DNR_OFF"), getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.valueOf("DNT_ON"), getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.valueOf("DNT_OFF"), getIdentifier("DNT_OFF", "string"));
hashMap.put(DialogAction.DOWNLOAD, R.string.download_dl);
hashMap.put(DialogAction.DNR_ON, R.string.DNR_ON);
hashMap.put(DialogAction.DNR_OFF, R.string.DNR_OFF);
hashMap.put(DialogAction.DNT_ON, R.string.DNT_ON);
hashMap.put(DialogAction.DNT_OFF, R.string.DNT_OFF);
hashMap.put(DialogAction.valueOf("pinmsg"), getIdentifier("pinmsg", "string"));
hashMap.put(DialogAction.valueOf("unpinmsg"), getIdentifier("unpinmsg", "string"));
hashMap.put(DialogAction.ENCRYPT, R.string.encryption);
hashMap.put(DialogAction.ENCRYPT_SETT, R.string.encryption_sett);
// hashMap.put(DialogAction.pinmsg, getIdentifier("pinmsg", "string"));
// hashMap.put(DialogAction.unpinmsg, getIdentifier("unpinmsg", "string"));
return hashMap;
}
public static boolean onClick(Dialog dialog, DialogAction action) {
var id = dialog.getId();
@SuppressLint("ResourceType")
public static List<Object> injectToList(List<Object> actions) {
var list = new ArrayList<>(actions);
list.add(new DialogActionsListView.b.a(DialogAction.DOWNLOAD, 1, R.attr.im_ic_msgdl, R.string.download_dl)); // DialogAction, Int, Icon, String
if (action == DialogAction.valueOf("MARK_AS_READ")) {
list.add(new DialogActionsListView.b.a(DialogAction.DNR_ON, 2, R.attr.im_ic_pinned_msg_hide, R.string.DNR_ON)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNR_OFF, 2, R.attr.im_ic_pinned_msg_show, R.string.DNR_OFF)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNT_ON, 2, R.attr.im_ic_edit_msg, R.string.DNT_ON)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNT_OFF, 2, R.attr.im_ic_edit_msg, R.string.DNT_OFF)); // DialogAction, Int, Icon, String
if (!isTablet()) {
list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT, 3, R.attr.im_ic_keyboard, R.string.encryption)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT_SETT, 3, R.attr.im_ic_more_vertical, R.string.encryption_sett)); // DialogAction, Int, Icon, String
}
list.add(new DialogActionsListView.b.a(DialogAction.MARK_AS_READ, 4, R.attr.im_ic_done, R.string.vkim_dialogs_list_option_mark_as_read)); // DialogAction, Int, Icon, String
return list;
}
public static void forceInvalidateDialogActions(Dialog d) {
EntityIntMap<Dialog> map = new EntityIntMap<>();
map.a(d.getId(), d);
ImEngine1.a().a(new OnDialogUpdateEvent(null, map));
}
public static List<DialogAction> injectToListAccess(List<DialogAction> actions, Dialog dialog) {
int peerId = 0;
if (dialog != null) {
try {
peerId = dialog.getId();
} catch (Exception e) {
Log.d("DialoggetId", "null");
}
}
if (peerId == 0) {
return actions;
}
actions.add(DialogAction.DOWNLOAD);
if (isDnrEnabledFor(peerId)) {
actions.add(DialogAction.DNR_OFF);
} else {
actions.add(DialogAction.DNR_ON);
}
if (isDntEnabledFor(peerId)) {
actions.add(DialogAction.DNT_OFF);
} else {
actions.add(DialogAction.DNT_ON);
}
actions.add(DialogAction.ENCRYPT);
IMProcessor prov = EncryptProvider.getProcessorFor(peerId);
if (prov != null && !prov.isPublic()) {
actions.add(DialogAction.ENCRYPT_SETT);
}
actions.add(DialogAction.MARK_AS_READ);
return actions;
}
public static boolean onClickHeader(DialogAction action, Dialog dialog) {
int peerId = 0;
if (dialog != null) {
try {
peerId = dialog.getId();
} catch (Exception e) {
Log.d("DialoggetId", "null");
}
}
if (peerId == 0) {
return true;
}
if (action == DialogAction.MARK_AS_READ) {
DNRModule.hookRead(dialog);
forceInvalidateDialogActions(dialog);
}
if (action == DialogAction.DOWNLOAD) {
File out = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "dialog-" + peerId + ".html");
try {
new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out);
} catch (Exception e) {
sendToast(AndroidUtils.getString(R.string.download_dl_error));
e.printStackTrace();
}
return true;
}
if (action == DialogAction.DNR_ON) {
setDnr(dialog, true);
forceInvalidateDialogActions(dialog);
return true;
} else if (action == DialogAction.DNR_OFF) {
setDnr(dialog, false);
forceInvalidateDialogActions(dialog);
return true;
}
if (action == DialogAction.DNT_ON) {
setDnt(dialog, true);
forceInvalidateDialogActions(dialog);
return true;
} else if (action == DialogAction.DNT_OFF) {
setDnt(dialog, false);
forceInvalidateDialogActions(dialog);
return true;
}
if (action == DialogAction.ENCRYPT_SETT) {
CryptImHook.hookPref(peerId);
return true;
} else if (action == DialogAction.ENCRYPT) {
CryptImHook.hook(peerId, dialog);
return true;
}
return false;
}
public static boolean onClick(Dialog dialog, DialogAction action) {
int peerId = 0;
if (dialog != null) {
try {
peerId = dialog.getId();
} catch (Exception e) {
Log.d("DialoggetId", "null");
}
}
if (peerId == 0) {
return true;
}
if (action == DialogAction.MARK_AS_READ) {
DNRModule.hookRead(dialog);
}
if (action == DialogAction.valueOf("DNR_ON")) {
if (action == DialogAction.DOWNLOAD) {
File out = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), peerId + "-dialog.html");
try {
new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
if (action == DialogAction.DNR_ON) {
setDnr(dialog, true);
return true;
} else if (action == DialogAction.valueOf("DNR_OFF")) {
} else if (action == DialogAction.DNR_OFF) {
setDnr(dialog, false);
return true;
}
if (action == DialogAction.valueOf("DNT_ON")) {
if (action == DialogAction.DNT_ON) {
setDnt(dialog, true);
return true;
} else if (action == DialogAction.valueOf("DNT_OFF")) {
} else if (action == DialogAction.DNT_OFF) {
setDnt(dialog, false);
return true;
}
if (action == DialogAction.valueOf("pinmsg")) {
pinnedMsg(id, true);
if (action == DialogAction.pinmsg) {
pinnedMsg(peerId, true);
return true;
} else if (action == DialogAction.valueOf("unpinmsg")) {
pinnedMsg(id, false);
} else if (action == DialogAction.unpinmsg) {
pinnedMsg(peerId, false);
return true;
}
if (action == DialogAction.ENCRYPT_SETT) {
CryptImHook.hookPref(peerId);
return true;
} else if (action == DialogAction.ENCRYPT) {
CryptImHook.hook(peerId, dialog);
return true;
}
@@ -95,33 +293,46 @@ public class DNRInjector {
}
public static LinkedHashMap<MsgAction, DelegateMsg.a.a> injectToHashMapMsg(LinkedHashMap<MsgAction, DelegateMsg.a.a> hashMap) {
hashMap.put(MsgAction.valueOf("TRANSLATE"), new DelegateMsg.a.a(getIdentifier("translator", "string")));
hashMap.put(MsgAction.valueOf("READTO"), new DelegateMsg.a.a(getIdentifier("readto", "string")));
hashMap.put(MsgAction.valueOf("TRANSLATE"), new DelegateMsg.a.a(R.string.translator));
hashMap.put(MsgAction.valueOf("READTO"), new DelegateMsg.a.a(R.string.readto));
return hashMap;
}
public static boolean onClickMsg(Context context, MsgAction action, Msg msg) {
var text = ((MsgFromUser) msg).f();
var fullMsg = ((MsgFromUser) msg).j2(); // text + reply
var reply = fullMsg.substring(text.length() + 1);
var peerId = msg.v1();
if (action == MsgAction.valueOf("READTO")) {
DNRModule.hookReadStartMsgTo(msg);
return true;
}
var isTextExist = !text.isEmpty() && !text.equals(" ");
var isReplyExist = !reply.isEmpty() && !reply.equals(" ");
if (msg instanceof MsgFromUser) {
var text = ((MsgFromUser) msg).f();
var fullMsg = ((MsgFromUser) msg).j2(); // text + reply
var reply = fullMsg.substring(text.length() + 1);
if (action == MsgAction.valueOf("TRANSLATE")) {
if (isTextExist && isReplyExist) {
Translate.showTranslatedText(context, text + "\n\nРеплай:\n" + reply);
} else if (isReplyExist) {
Translate.showTranslatedText(context, "Реплай:\n" + reply);
} else if (isTextExist) {
Translate.showTranslatedText(context, text);
} else {
sendToast("Нет текста для перевода");
var isTextExist = !text.isEmpty() && !text.equals(" ");
var isReplyExist = !reply.isEmpty() && !reply.equals(" ");
if (isReplyExist) {
reply = decryptMessage(reply, peerId);
}
if (isTextExist) {
text = decryptMessage(text, peerId);
}
if (action == MsgAction.valueOf("TRANSLATE")) {
if (isTextExist && isReplyExist) {
Translate.showTranslatedText(context, text + "\n\n" + context.getString(R.string.translator_reply) + "\n" + reply);
} else if (isReplyExist) {
Translate.showTranslatedText(context, context.getString(R.string.translator_reply) + "\n" + reply);
} else if (isTextExist) {
Translate.showTranslatedText(context, text);
} else {
sendToast(context.getString(R.string.translator_no_text));
}
}
}
@@ -132,7 +343,7 @@ public class DNRInjector {
Thread thread = new Thread(() -> {
try {
var request = new Request.a()
.b("https://api.vk.com/method/" + (needToBePinned ? "messages.pinConversation" : "messages.unpinConversation") + "?peer_id=" + dialogid + "&access_token=" + getUserToken() + "&v=5.119")
.b("https://" + getApi() + "/method/" + (needToBePinned ? "messages.pinConversation" : "messages.unpinConversation") + "?peer_id=" + dialogid + "&access_token=" + getUserToken() + "&v=5.119")
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
.a();
@@ -149,15 +360,27 @@ public class DNRInjector {
thread.start();
sendToast("Диалог успешно " + (needToBePinned ? "закреплен" : "откреплен"));
sendToast(AndroidUtils.getString(R.string.pin_dialog) + " " + AndroidUtils.getString(needToBePinned ? R.string.dialog_pinned : R.string.dialog_unpinned));
}
public static void setDnr(Dialog dialog, boolean value) {
hookDNR(dialog.getId());
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
hookDNR(peerId);
}
public static void setDnt(Dialog dialog, boolean value) {
hookDNT(dialog.getId());
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
hookDNT(peerId);
}
}
@@ -1,8 +1,8 @@
package ru.vtosters.lite.dnr;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.ProxyUtils.getApi;
import android.util.Log;
@@ -1,111 +1,135 @@
package ru.vtosters.lite.downloaders;
import android.os.Environment;
import android.util.Log;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import android.os.Environment;
import com.vk.core.util.ToastUtils;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import com.vtosters.lite.R;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.music.Callback;
import ru.vtosters.lite.music.FFMpeg;
import ru.vtosters.lite.music.M3UDownloader;
import ru.vtosters.lite.music.MP3Downloader;
import ru.vtosters.lite.utils.AndroidUtils;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
import ru.vtosters.lite.music.callback.MusicCallbackBuilder;
import ru.vtosters.lite.music.converter.playlist.PlaylistConverter;
import ru.vtosters.lite.music.downloader.AudioGet;
import ru.vtosters.lite.music.downloader.PlaylistDownloader;
import ru.vtosters.lite.music.downloader.TrackDownloader;
import ru.vtosters.lite.music.notification.MusicNotificationBuilder;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.IOUtils;
/**
* Entrypoint for downloading audio
* <p>
* The actual code is in {@link ru.vtosters.lite.music}
*/
public class AudioDownloader {
private static NotificationManagerCompat notificationManager = NotificationManagerCompat.from(AndroidUtils.getGlobalContext());
public static final ExecutorService executor = Executors.newCachedThreadPool();
public static void downloadAudio(MusicTrack track) {
if (AndroidUtils.getDefaultPrefs().getBoolean("new_music_downloading_way", false)) {
downloadMP3(track);
} else {
downloadM3U8(track);
}
public static void downloadPlaylist(Playlist playlist) {
var tracks = PlaylistConverter.getPlaylist(playlist);
var playlistName = IOUtils.getValidFileName(playlist.g);
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
var downloadPath = musicPath + File.separator + playlistName;
var notificationId = playlistName.hashCode();
var notification = MusicNotificationBuilder.buildPlaylistDownloadNotification(playlistName, notificationId);
PlaylistDownloader.downloadPlaylist(
tracks,
IOUtils.getValidFileName(playlist.g),
downloadPath,
MusicCallbackBuilder.buildPlaylistCallback(tracks.size(), notification, notificationId)
);
}
public static void downloadM3U8(MusicTrack track) {
public static void downloadAudio(MusicTrack track) {
downloadM3U8(track, false);
}
public static void cacheTrack(MusicTrack track) {
var trackId = track.y1();
if (CacheDatabaseDelegate.isCached(trackId)) {
CacheDatabaseDelegate.removeTrackFromCache(LibVKXClient.asId(track));
return;
}
var trackFile = FileCacheImplementation.getTrackFile(trackId);
if (!trackFile.exists())
trackFile.getParentFile().mkdirs();
executor.submit(() -> downloadM3U8(track, true));
}
public static void cachePlaylist(Playlist playlist) {
var tracks = PlaylistConverter.getPlaylist(playlist);
var notificationId = playlist.g.hashCode();
var notification = MusicNotificationBuilder.buildPlaylistDownloadNotification(playlist.g, notificationId);
PlaylistDownloader.cachePlaylist(
tracks,
MusicCallbackBuilder.buildPlaylistCallback(tracks.size(), notification, notificationId)
);
}
public static void cacheAllAudios() {
var tracks = AudioGet.getAudios();
var notificationId = AccountManagerUtils.getUserId();
var notification = MusicNotificationBuilder.buildAllAudiosDownloadNotification(notificationId);
PlaylistDownloader.cachePlaylist(
tracks,
MusicCallbackBuilder.buildPlaylistCallback(tracks.size(), notification, notificationId)
);
}
public static void downloadAllAudios() {
var tracks = AudioGet.getAudios();
var notificationId = AccountManagerUtils.getUserId();
var notification = MusicNotificationBuilder.buildAllAudiosDownloadNotification(notificationId);
var playlistName = "Audios of " + AccountManagerUtils.getUserId();
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
var downloadPath = musicPath + File.separator + playlistName;
PlaylistDownloader.downloadPlaylist(
tracks,
playlistName,
downloadPath,
MusicCallbackBuilder.buildPlaylistCallback(tracks.size(), notification, notificationId)
);
}
private static void downloadM3U8(MusicTrack track, boolean cache) {
if (track.D == null) {
ToastUtils.a("Не удалось найти ссылку на аудиозапись");
ToastUtils.a(getString(R.string.link_audio_error));
return;
}
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
var tempId = track.d;
var downloadPath = musicPath + File.separator + tempId;
var downloadPath = musicPath + File.separator;
var notification = MusicNotificationBuilder.buildDownloadNotification(track, tempId);
var notification = buildDownloadNotification(track, tempId);
downloadM3U8(track, downloadPath, new Callback() {
@Override
public void onProgress(int progress) {
notification.setProgress(100, progress, false);
notificationManager.notify(tempId, notification.build());
}
@Override
public void onSuccess() {
try {
var fileName = track.toString();
var success = FFMpeg.convert(downloadPath, musicPath + File.separator + fileName + ".mp3");
if (success) {
notification
.setContentText("Загрузка завершена")
.setProgress(0, 0, false)
.setSmallIcon(android.R.drawable.stat_sys_download_done);
notificationManager.notify(tempId, notification.build());
} else {
onFailure();
}
} catch (UnsatisfiedLinkError e) {
Log.e("AudioDownloader", "Опять эти нативные либы");
Log.e("AudioDownloader", e.getMessage());
onFailure();
}
}
@Override
public void onFailure() {
notification.setContentText("Не удалось загрузить аудиозапись").setProgress(0, 0, false);
notificationManager.notify(tempId, notification.build());
}
@Override
public void onSizeReceived(long size, long header) {
}
});
}
private static void downloadM3U8(MusicTrack track, String path, Callback callback) {
File outDir = new File(path);
if (!outDir.exists())
if (outDir.mkdir())
Log.v("AudioDownloader", "Directory created");
else
Log.e("AudioDownloader", "Directory creation failed");
Log.i("AudioDownloader", "Downloading audio to " + path);
M3UDownloader.execute(track.D, outDir, callback);
}
private static void downloadMP3(MusicTrack track) {
MP3Downloader.execute(track);
}
private static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle("Загрузка аудиозаписи")
.setContentText(track.toString())
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true);
notificationBuilder.setProgress(100, 0, false);
notificationManager.notify(id, notificationBuilder.build());
return notificationBuilder;
if (cache) {
TrackDownloader.cacheTrack(track, MusicCallbackBuilder.buildOneTrackCallback(tempId, notification));
} else {
TrackDownloader.downloadTrack(track, downloadPath, MusicCallbackBuilder.buildOneTrackCallback(tempId, notification));
}
}
}
@@ -0,0 +1,621 @@
package ru.vtosters.lite.downloaders;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getArray;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import android.util.SparseArray;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.vtosters.lite.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
public class MessagesDownloader {
private static final String VK_DOMAIN = "vk.com";
private static SimpleDateFormat sdformat;
private static SparseArray<MiniUser> usersArray;
public static String formatTime(long now) {
return sdformat.format(new Date(now));
}
public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
StringBuilder builder = new StringBuilder();
for (CharSequence cs : elements) {
builder.append(cs).append(delimiter);
}
return builder.toString();
}
private static String getPollHtml(JSONObject poll) throws JSONException {
StringBuilder pollHtml = new StringBuilder(
"<div class=\"vtex-milk-msg poll\">" +
"<p style=\"text-align:center;\">" + poll.optString("question") + "</p>"
);
var answers = poll.optJSONArray("answers");
for (int i = 0; i < answers.length(); i++) {
var jsonObject = answers.optJSONObject(i);
if (jsonObject != null)
pollHtml.append("<hr><p>").append(jsonObject.optString("text")).append(" · ").append(jsonObject.optString("votes")).append(" (").append(jsonObject.optString("rate")).append("%)</p>");
}
pollHtml.append("<hr><p style=\"text-align:center;\">")
.append(AndroidUtils.getString(R.string.chat_export_poll_voted))
.append(" ")
.append(poll.optString("votes"))
.append(" ")
.append(AndroidUtils.getString(R.string.chat_export_users_name))
.append("</p>");
return pollHtml.append("</div>").toString();
}
private static String getVideoHtml(JSONObject files) throws JSONException {
if (files == null) return AndroidUtils.getString(R.string.chat_export_video_nolinks);
Iterator<?> keys = files.keys();
StringBuilder videoHtml = new StringBuilder();
int qualityIndex = 0;
String[] quality = {"144", "240", "360", "480", "720", "1080", "1440", "2160"};
while (keys.hasNext()) {
String key = (String) keys.next();
if (key.equals("mp4_" + quality[qualityIndex])) {
videoHtml.append("<a class=\"msg-attach-link\" href=\"").append(files.get(key)).append("\">").append(quality[qualityIndex]).append("p</a>").append(" ");
if (qualityIndex == quality.length - 1) break;
++qualityIndex;
}
}
return videoHtml.toString();
}
public void downloadDialog(int peer_id, DialogDownloaderFormatProvider format, File out) throws Exception {
sdformat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", getResources().getConfiguration().locale);
FileOutputStream fos = new FileOutputStream(out);
// fix TODO with conversation name (API method messages.getConversationsById)
fos.write(format.provideDocumentStart("TODO", formatTime(System.currentTimeMillis())).getBytes(StandardCharsets.UTF_8));
fetchDialogInfo(peer_id, 0, ((users, messages) -> {
try {
fos.write(format.provideHeader("TODO", formatTime(System.currentTimeMillis())).getBytes(StandardCharsets.UTF_8));
for (MiniMsg msg : messages) {
fos.write(format.provideMessage(msg, users.get(msg.fromId)).getBytes(StandardCharsets.UTF_8));
}
fos.write(format.provideDocumentEnd().getBytes(StandardCharsets.UTF_8));
fos.close();
LifecycleUtils.getCurrentActivity().runOnUiThread(() -> makeText(getGlobalContext(), AndroidUtils.getString(R.string.saved_as) + " " + out.getAbsolutePath(), LENGTH_SHORT).show());
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}));
}
public void fetchDialogInfo(int peer_id, int offset, FetchListener fl) {
makeRequest("https://" + getApi() + "/method/messages.getHistory?extended=1&v=5.140&offset=" + offset + "&count=200&peer_id=" + peer_id + "&access_token=" + getUserToken(),
response -> {
try {
JSONObject mainJson = new JSONObject(response);
JSONObject obj = mainJson.getJSONObject("response");
SparseArray<MiniUser> users = new SparseArray<>();
parseUsers(users, obj.optJSONArray("profiles"), false);
parseUsers(users, obj.optJSONArray("groups"), true);
List<MiniMsg> msgs = parseMessages(obj.getJSONArray("items"));
usersArray = users;
fl.onReceive(users, msgs);
} catch (JSONException e) {
e.printStackTrace();
}
});
}
private List<MiniMsg> parseMessages(JSONArray jsonArray) throws JSONException {
ArrayList<MiniMsg> thing = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
MiniMsg msg = new MiniMsg(jsonArray.getJSONObject(i));
thing.add(msg);
}
return thing;
}
private void parseUsers(SparseArray<MiniUser> array, @Nullable JSONArray jsonArray, boolean groups) throws JSONException {
if (jsonArray == null) return;
for (int i = 0; i < jsonArray.length(); i++) {
MiniUser user = new MiniUser(jsonArray.getJSONObject(i), groups);
array.put(groups ? -user.id : user.id, user);
}
}
interface FetchListener {
void onReceive(SparseArray<MiniUser> users, List<MiniMsg> messages);
}
static class MiniUser {
public String firstName;
public String lastName;
public boolean isGroup;
int id;
String photo100;
public MiniUser(JSONObject obj, boolean is_group) throws JSONException {
id = obj.getInt("id");
firstName = obj.optString("first_name", obj.optString("name"));
lastName = obj.optString("last_name", "");
photo100 = obj.getString("photo_100");
isGroup = is_group;
}
}
static class MiniMsg {
long date;
int fromId;
int id; // message id
String text;
List<JSONObject> attachments;
List<JSONObject> fwd_messages;
JSONObject reply_message; // one reply
JSONObject chat_action;
JSONObject geo;
public MiniMsg(JSONObject obj) throws JSONException {
date = obj.getLong("date") * 1000;
fromId = obj.getInt("from_id");
id = obj.getInt("id");
text = decryptMessage(obj.getString("text"), obj.getInt("peer_id"));
reply_message = obj.optJSONObject("reply_message");
chat_action = obj.optJSONObject("action");
geo = obj.optJSONObject("geo");
attachments = new ArrayList<>();
fwd_messages = new ArrayList<>();
JSONArray arr = obj.optJSONArray("attachments");
if (arr != null)
for (int i = 0; i < arr.length(); i++) attachments.add(arr.getJSONObject(i));
JSONArray fwdArr = obj.optJSONArray("fwd_messages");
if (fwdArr != null)
for (int i = 0; i < fwdArr.length(); i++) fwd_messages.add(fwdArr.getJSONObject(i));
}
}
// This class defines everything which is needed to create an output file
abstract static class DialogDownloaderFormatProvider {
// Internal, for JSON/HTML
abstract String provideDocumentStart(String dialogName, String date);
abstract String provideDocumentEnd();
abstract String provideHeader(String dialogName, String date);
abstract String provideMessage(MiniMsg message, MiniUser user) throws JSONException;
}
public static class HtmlDialogDownloaderFormatProvider extends DialogDownloaderFormatProvider {
@Override
String provideDocumentStart(String dialogName, String date) {
String style = ".vtex-milk-msg {\n" +
" border-radius: 8px;\n" +
" padding: 24px;\n" +
" background: white;\n" +
" margin: 16px;\n" +
" box-shadow: 0 4px 8px 0 rgba(0,0,0,0.07);\n" +
" word-wrap: break-word;\n" +
"}\n" +
"\n" +
".vtex-milk-msgcont br {\n" +
" display: none;\n" +
"}\n" +
"\n" +
".vtex-milk-msg p {\n" +
" margin: 0;\n" +
"}\n" +
"\n" +
".vtex-milk-msg.vtex-milk-msg-out {\n" +
" background: #ADD3FF;\n" +
"}\n" +
"\n" +
"p.msg-attaches {\n" +
" margin-top: 8px;\n" +
" font-style: italic;\n" +
"}\n" +
"p.chat-action {\n" +
" font-style: italic;\n" +
"}\n" +
"\n" +
".vtex-milk-header {\n" +
" border-radius: 8px;\n" +
" padding: 24px;\n" +
" background: white;\n" +
" margin: 16px;\n" +
" box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);\n" +
"}\n" +
"\n" +
"h4.vtex-milk-header-txt {\n" +
" margin: 0;\n" +
"}\n" +
"\n" +
"h5.vtex-milk-header-sub {\n" +
" margin: 0;\n" +
" padding-top: 8px;\n" +
"}\n" +
"\n" +
"a.msg-attach-link {\n" +
" color: #5181B8;\n" +
" text-decoration: none;\n" +
"}\n" +
"\n" +
".msg-from a {\n" +
" color: #5181B8;\n" +
" text-decoration: none;\n" +
"}\n" +
"\n" +
".msg-from-date {\n" +
" color: rgba(0, 0, 0, 0.75);\n" +
"}\n" +
"\n" +
"body {\n" +
" font-family: Roboto, system-ui, sans-serif;\n" +
"}\n" +
"\n" +
".msg-body {\n" +
" padding-top: 4px;\n" +
"}\n" +
".msg-reply {\n" +
" border-left: 3px solid #7aa7f6;\n" +
" margin-top: 5px;\n" +
" padding-left: 3px;\n" +
"}\n\n" +
".msg-reply p {\n" +
" padding-left: 5px;\n" +
"}\n\n" +
".msg-reply p.reply-header {\n" +
" color: #5181B8;\n" +
"}\n\n" +
".msg-reply p.reply-content {\n" +
" color: #000000;\n" +
"}\n" +
".vtex-milk-msg.poll {\n" +
" width: 45%;\n" +
" background: linear-gradient(to bottom right, #707c8c, #4d5565);\n" +
" font-style: normal;" +
"}\n" +
".vtex-milk-msg.poll p { color: white; }\n" +
".vtex-milk-msg.poll hr { border-top: 1px; background: #ffffff; }\n" +
"\n" +
"";
return "<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta charset=\"utf-8\"><title>"
+ AndroidUtils.getString(R.string.chat_export_title)
+ "</title><style>"
+ style
+ "</style></head><body>";
}
@Override
String provideDocumentEnd() {
return "</div></body></html>";
}
@Override
String provideHeader(String dialogName, String date) {
return "<div class=\"vtex-milk-header\"><h4 class=\"vtex-milk-header-txt\">VTLite</h4><h5 class=\"vtex-milk-header-sub\">" + AndroidUtils.getString(R.string.chat_export_header) + " (" + date + ")</h5></div><div class=\"vtex-milk-msgcont\">";
}
@Override
String provideMessage(MiniMsg message, MiniUser user) throws JSONException {
String isOut = (user.id == getUserId()) ? " vtex-milk-msg-out" : "";
String geoPosition = "";
if (message.geo != null) {
var coordinates = message.geo.optJSONObject("coordinates");
if (coordinates != null) {
var latitude = coordinates.optDouble("latitude");
var longitude = coordinates.optDouble("longitude");
var ll = longitude + "," + latitude;
geoPosition = "<a href=\"https://yandex.ru/maps/?ll=" + ll + "&mode=search&sll=" + ll + "&text=" + latitude + "," + longitude + "&z=12\">" +
"<img src=\"https://static-maps.yandex.ru/1.x/?ll=" + longitude + "," + latitude + "&z=12&l=map&size=300,200&pt=" + ll + ",vkgrm\"/>" +
"</a>";
}
}
String chatAction = (message.chat_action != null) ? getHtmlForChatAction(message.chat_action) : "";
String attaches = (message.attachments.size() > 0) ? "<p class=\"msg-attaches\">" + AndroidUtils.getString(R.string.attachments) + ": " + getHtmlForAttach(message.attachments) + "</p>" : "";
String reply = (message.reply_message != null) ? provideReply(message.reply_message) : "";
String fwdMessages = (message.fwd_messages.size() > 0) ? provideForwardMessages(message.fwd_messages) : "";
String userLink = (user.isGroup ? "club" : "id") + user.id;
return "<div class=\"vtex-milk-msg" + isOut + "\" id=\"" + message.id + "\">" +
"<p class=\"msg-from\">" + AndroidUtils.getString(R.string.from_lower) + " <a href=\"https://" + VK_DOMAIN + "/" + userLink + "\">" + user.firstName + " " + user.lastName + "</a> <span class=\"msg-from-date\">" + formatTime(message.date) + "</span></p>" + // TODO photo100
"<p class=\"msg-body\">" + mentionsReplace(message.text) + "</p>" +
geoPosition +
chatAction +
attaches +
reply +
fwdMessages +
"</div>";
}
private String provideReply(JSONObject replyMessage) {
var messageId = replyMessage.optInt("id");
var userId = replyMessage.optInt("from_id");
var peerId = replyMessage.optInt("peer_id");
var text = mentionsReplace(decryptMessage(replyMessage.optString("text"), peerId));
var fwdMessages = replyMessage.optJSONArray("fwd_messages");
var user = usersArray.get(userId);
if (text.isEmpty()) {
if (fwdMessages != null) {
var length = fwdMessages.length();
if (length > 0) text = length + " " + pluralMsg(length);
} else text = AndroidUtils.getString(R.string.attachment); // Вложение
}
return "<a href=\"#" + messageId + "\" class=\"msg-attach-link\">" +
"<div class=\"msg-reply\">" +
"<p class=\"reply-header\">" + AndroidUtils.getString(R.string.vkim_msg_fwd_single) + "</p>" +
"<p class=\"reply-content\">" + user.firstName + " " + user.lastName + ": " + text + "</p>" +
"</div>" +
"</a>";
}
private String provideForwardMessages(List<JSONObject> fwd_messages) throws JSONException {
StringBuilder fwdmsgs = new StringBuilder("<div class=\"msg-reply\">");
for (JSONObject fwd_message : fwd_messages) {
if (fwd_message == null) continue;
List<JSONObject> attaches = new ArrayList<>();
JSONArray arr = fwd_message.optJSONArray("attachments");
if (arr != null) {
for (int i = 0; i < arr.length(); i++) {
try {
attaches.add(arr.getJSONObject(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
List<JSONObject> fwdsMsg = new ArrayList<>();
JSONArray fwd_msgs = fwd_message.optJSONArray("fwd_messages");
if (fwd_msgs != null) {
for (int i = 0; i < fwd_msgs.length(); i++) {
try {
fwdsMsg.add(fwd_msgs.getJSONObject(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
JSONObject reply_message = fwd_message.optJSONObject("reply_message");
var attachesHtml = (attaches.size() > 0) ? AndroidUtils.getString(R.string.attachments) + ": " + getHtmlForAttach(attaches) : "";
var replyHtml = (reply_message != null) ? provideReply(reply_message) : "";
var fwdsHtml = (fwdsMsg.size() > 0) ? provideForwardMessages(fwdsMsg) : ""; // recursion XD :>
var userId = fwd_message.optInt("from_id");
var peerId = fwd_message.optInt("peer_id");
var text = mentionsReplace(decryptMessage(fwd_message.optString("text"), peerId));
var userLink = ((userId < 0) ? "club" : "id") + Math.abs(userId);
fwdmsgs.append("<p class=\"reply-content\"><a class=\"msg-attach-link\" href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\">@").append(userLink).append("</a>: ").append(text).append(attachesHtml).append(replyHtml).append(fwdsHtml);
}
return fwdmsgs.append("</div>").toString();
}
private String mentionsReplace(String text) {
var matcher = Pattern.compile("\\[((?:club|id|public)\\d+)\\|([^]]+)\\]").matcher(text);
return matcher.replaceAll("<a class=\"msg-attach-link\" href=\"https://" + VK_DOMAIN + "/$1\">$2</a>");
}
private String pluralMsg(int count) {
String[] plurals = getArray(R.array.msg_plurals);
var hundredModulo = count % 100;
var tenModulo = count % 10;
if (hundredModulo > 10 && hundredModulo < 20) return plurals[2];
else if (tenModulo > 1 && tenModulo < 5) return plurals[1];
else if (tenModulo == 1) return plurals[0];
return plurals[2];
}
private String getHtmlForChatAction(JSONObject action) {
var type = action.optString("type");
StringBuilder htmlAction = new StringBuilder("<p class=\"chat-action\">");
switch (type) {
case "chat_photo_update":
htmlAction.append(AndroidUtils.getString(R.string.chat_export_avatar_update));
break;
case "chat_photo_remove":
htmlAction.append(AndroidUtils.getString(R.string.chat_export_avatar_remove));
break;
case "chat_create":
var name = action.optString("text");
htmlAction.append(AndroidUtils.getString(R.string.chat_export_chat_created)).append((!name.isEmpty()) ? " \"" + name + "\"" : "");
break;
case "chat_title_update":
var newName = action.optString("text");
htmlAction.append(AndroidUtils.getString(R.string.chat_export_name_changed)).append((!newName.isEmpty()) ? (" " + AndroidUtils.getString(R.string.chat_export_to) + " \"" + newName + "\"") : "");
break;
case "chat_invite_user":
var newUserId = action.optInt("member_id");
htmlAction.append(AndroidUtils.getString(R.string.chat_export_user_added) + " ").append((newUserId > 0) ? AndroidUtils.getString(R.string.chat_export_type_user) : AndroidUtils.getString(R.string.chat_export_type_group));
if (newUserId != 0) {
var userLink = ((newUserId < 0) ? "club" : "id") + Math.abs(newUserId);
htmlAction.append(" <a href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\" class=\"msg-attach-link\">@").append(userLink).append("</a>");
}
break;
case "chat_kick_user":
var removedUserId = action.optInt("member_id");
htmlAction.append(AndroidUtils.getString(R.string.chat_export_user_kicked) + " ").append((removedUserId > 0) ? AndroidUtils.getString(R.string.chat_export_type_user) : AndroidUtils.getString(R.string.chat_export_type_group));
if (removedUserId != 0) {
var userLink = ((removedUserId < 0) ? "club" : "id") + Math.abs(removedUserId);
htmlAction.append(" <a href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\" class=\"msg-attach-link\">@").append(userLink).append("</a>");
}
break;
case "chat_pin_message":
var message = action.optString("message");
htmlAction.append(AndroidUtils.getString(R.string.chat_export_msg_pinned)).append((!message.isEmpty()) ? (" \"" + message + "\"") : "");
break;
case "chat_unpin_message":
htmlAction.append(AndroidUtils.getString(R.string.chat_export_msg_unpinned));
break;
case "chat_invite_user_by_link":
htmlAction.append(AndroidUtils.getString(R.string.chat_export_join_by_link));
break;
case "chat_screenshot":
htmlAction.append(AndroidUtils.getString(R.string.chat_export_chat_screenshot));
break;
case "custom":
htmlAction.append(action.optString("message"));
break;
default:
htmlAction.append(AndroidUtils.getString(R.string.vkim_msg_unsupported) + " (").append(type).append(")");
break;
}
return htmlAction.append("</p>").toString();
}
private String getHtmlForAttach(List<JSONObject> attaches) throws JSONException {
StringBuilder rs = new StringBuilder();
for (JSONObject attach : attaches) {
String type = attach.getString("type");
JSONObject item = attach.optJSONObject(type);
if (item == null) continue;
switch (type) { // market_album is not supported
case "photo":
var sizes = item.getJSONArray("sizes");
rs.append("<a href=\"").append(sizes.getJSONObject(sizes.length() - 1).getString("url")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_photo)).append("</a>");
break;
case "doc":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_doc)).append("</a>");
break;
case "link":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_link)).append("</a>");
break;
case "wall":
rs.append("<a href=\"https://" + VK_DOMAIN + "/wall").append(item.optString("to_id", item.optString("owner_id"))).append("_").append(item.getString("id")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_wallpost)).append("</a>");
break;
case "sticker":
rs.append("<img style=\"width:128px;height:128px;\" src=\"").append(item.getJSONArray("images").getJSONObject(1).getString("url")).append("\"/>");
break;
case "audio_message":
rs.append("<a href=\"").append(item.optString("link_mp3")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_audiomsg)).append("</a>");
break;
case "audio":
rs.append(AndroidUtils.getString(R.string.chat_export_type_audio)).append(" (").append(item.optString("artist")).append(" — ").append(item.optString("title")).append(")");
break;
case "video":
rs.append(AndroidUtils.getString(R.string.chat_export_type_video)).append(" (").append(getVideoHtml(item.optJSONObject("files"))).append(")");
break;
case "wall_reply":
var link = "https://" + VK_DOMAIN + "/wall" + item.optString("owner_id") + "_" + item.optString("post_id") + "?reply=" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_wallreply)).append("</a>");
break;
case "story":
var story_link = "https://" + VK_DOMAIN + "/story" + item.optString("owner_id") + "_" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(story_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_story)).append("</a>");
break;
case "podcast":
var podcast_link = "https://" + VK_DOMAIN + "/podcast" + item.optString("owner_id") + "_" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(podcast_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_podcast)).append("</a>");
break;
case "gift":
rs.append("<img src=\"").append(item.optString("thumb_96")).append("\"/>");
break;
case "mini_app":
var app = item.optJSONObject("app");
if (app != null) {
var miniapp_link = "https://" + VK_DOMAIN + "/app" + app.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(miniapp_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_miniapp)).append("</a>");
break;
}
rs.append(AndroidUtils.getString(R.string.chat_export_error));
break;
case "audio_playlist":
var playlist_link = "https://" + VK_DOMAIN + "/music/album/" + item.optString("owner_id") + "_" + item.optString("id") + "_" + item.optString("access_key");
rs.append("<a class=\"msg-attach-link\" href=\"").append(playlist_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_playlist)).append(" (").append(item.optString("title")).append(")</a>");
break;
case "poll":
rs.append(AndroidUtils.getString(item.optBoolean("anonymous") ? R.string.chat_export_poll_anon : R.string.chat_export_poll_publ)).append(" ").append(AndroidUtils.getString(R.string.chat_export_type_poll)).append(" ").append(getPollHtml(item));
break;
case "market":
var market_item_link = "https://" + VK_DOMAIN + "/market" + item.optString("owner_id") + "_" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(market_item_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_market)).append("</a>");
break;
default:
rs.append(AndroidUtils.getString(R.string.vkim_msg_unsupported)).append(" (").append(type).append(")");
break;
}
rs.append(" ");
}
return rs.toString();
}
}
}
@@ -1,7 +1,5 @@
package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
@@ -11,6 +9,9 @@ import android.content.IntentFilter;
import android.net.Uri;
import android.os.Environment;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import java.io.File;
import b.h.g.m.FileUtils;
@@ -46,9 +47,9 @@ public class OTADownloader {
maxIndex = Math.max(maxIndex, Integer.parseInt(name.replaceFirst(".+-(\\d+).+", "$1")));
}
File apk = maxIndex == -1 ? new File(downloadDir, "VTLite.apk") : new File(downloadDir, "VTLite-" + maxIndex + ".apk");
APKInstallActivity.installOta(context, FileUtils.n(apk));
APKInstallActivity.installOta(context, FileUtils.uriFromFile(apk));
} else if (status == DownloadManager.STATUS_FAILED) {
AndroidUtils.sendToast(getString("downloaderr"));
AndroidUtils.sendToast(context.getString(R.string.downloaderr));
}
}
}
@@ -56,16 +57,35 @@ public class OTADownloader {
public static void downloadBuild(String url) {
var context = AndroidUtils.getGlobalContext();
var uri = Uri.parse(url);
try {
var uri = Uri.parse(url);
context.registerReceiver(callback, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
context.registerReceiver(callback, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
var request = new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("VTLite.apk");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "VTLite.apk");
var request = new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("VTLite.apk");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "VTLite_" + System.currentTimeMillis() / 1000 + ".apk");
var manager = (DownloadManager) AndroidUtils.getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
var manager = (DownloadManager) AndroidUtils.getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
} catch (Exception e) {
e.printStackTrace();
new VkAlertDialog.Builder(context)
.setTitle(R.string.update_error)
.setMessage(R.string.update_error_text)
.setPositiveButton(R.string.no,
(dialog, which) -> dialog.cancel()
)
.setNeutralButton(R.string.yes,
(dialog, which) -> {
var intent = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("https://github.com/vtosters/lite/releases/latest/download/VTLite.apk"));
context.startActivity(intent);
}
)
.show();
}
}
}
@@ -22,8 +22,9 @@ public class StoryDownloader {
String url = imageSizes.get(imageSizes.size() - 1).url;
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("photo" + story.E.a);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DCIM, "/Stories/photo" + story.E.a + ".jpg");
request.setTitle("photo" + story.E.a + ".jpg");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, "photo" + story.E.a + ".jpg");
request.allowScanningByMediaScanner();
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
return;
}
@@ -1,19 +1,23 @@
package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.dialogs.bottomsheet.MenuBottomSheetAction;
import com.vk.core.util.ToastUtils;
import com.vk.dto.common.VideoFile;
@@ -28,6 +32,7 @@ import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.utils.ExternalLinkParser;
import ru.vtosters.lite.utils.LifecycleUtils;
public class VideoDownloader {
private static final int DOWNLOAD_ID = 0;
@@ -46,7 +51,7 @@ public class VideoDownloader {
public static void injectAction(ArrayList<MenuBottomSheetAction> list, VideoFile video) {
if (!video.U && !video.I1()) {
addAction(list, DOWNLOAD_ID, R.drawable.ic_download_outline_24, R.string.download, 9);
addAction(list, OPEN_EXTERNAL_LINK_ID, R.drawable.ic_link_outline_28, getIdentifier("interfacevideoext_short", "string"), 9);
addAction(list, OPEN_EXTERNAL_LINK_ID, R.drawable.ic_link_outline_28, R.string.interfacevideoext_short, 9);
}
}
@@ -88,7 +93,7 @@ public class VideoDownloader {
}
if (list.isEmpty()) {
ToastUtils.a(getString("videodownloaderr"));
ToastUtils.a(context.getString(R.string.videodownloaderr));
return;
}
@@ -98,37 +103,38 @@ public class VideoDownloader {
max[i] = list.get(i);
}
if (context == null) {
var url = urls.get(urls.size() - 1);
if (context == null) context = LifecycleUtils.getCurrentActivity();
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 + ".mp4");
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
return;
}
var adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, max) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) super.getView(position, convertView, parent);
textView.setTextColor(getTextAttr());
return textView;
}
};
var builder = new AlertDialog.Builder(context);
builder.setItems(max, ((dialog, which) -> {
var url = urls.get(which);
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 + ".mp4");
((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
}));
builder.show();
new VkAlertDialog.Builder(context)
.setAdapter(adapter, (dialog, which) -> {
var url = urls.get(which);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(videoFile.toString());
request.allowScanningByMediaScanner();
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, videoFile + ".mp4");
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
})
.show();
}
public static void parseVideoLink(String url, Context ctx) {
if (url.contains("vk.com/story")) {
ToastUtils.a("Не поддерживается загрузка историй");
ToastUtils.a(ctx.getString(R.string.video_dl_stories_not_supported));
return;
}
if (!url.contains("vk.com/video")) {
ToastUtils.a("Неверная ссылка");
ToastUtils.a(ctx.getString(R.string.video_dl_wrong_link));
return;
}
@@ -136,10 +142,10 @@ public class VideoDownloader {
String ownerId = videoId.split("_")[0];
final ProgressDialog progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage("Обработка видео");
progressDialog.setMessage(ctx.getString(R.string.video_dl_progress));
progressDialog.show();
makeRequest("https://" + "api.vk.com" + "/method/video.get?owner_id=" + ownerId + "&videos=" + videoId + "&v=5.99&access_token=" + getUserToken(),
makeRequest("https://" + getApi() + "/method/video.get?owner_id=" + ownerId + "&videos=" + videoId + "&v=5.99&access_token=" + getUserToken(),
response -> {
progressDialog.cancel();
@@ -152,7 +158,7 @@ public class VideoDownloader {
downloadVideo(videoFile, ctx);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(ctx, "Видео нельзя скачать", Toast.LENGTH_SHORT).show();
Toast.makeText(ctx, ctx.getString(R.string.video_dl_error), Toast.LENGTH_SHORT).show();
}
});
}
@@ -8,16 +8,27 @@ import android.os.Build;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationManagerCompat;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils;
public class NotificationChannels {
public static final String MUSIC_DOWNLOAD_CHANNEL_ID = "music_download_channel";
public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = "Загрузка музыки";
public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = "Прогресс загрузки музыки";
public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = AndroidUtils.getString(R.string.music_downloading);
public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = AndroidUtils.getString(R.string.music_downloading_progress);
public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID = "music_playlist_download_channel";
public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_NAME = AndroidUtils.getString(R.string.playlist_downloading);
public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_DESCRIPTION = AndroidUtils.getString(R.string.playlist_downloading_progress);
public static final String MUSIC_CACHING_NAME = AndroidUtils.getString(R.string.caching_track_or_pic);
private static NotificationManagerCompat notificationManagerCompat;
@RequiresApi(api = Build.VERSION_CODES.O)
public static void createChannels() {
createMusicDownloadChannel();
createMusicPlaylistDownloadChannel();
}
@RequiresApi(api = Build.VERSION_CODES.O)
@@ -29,4 +40,20 @@ public class NotificationChannels {
var notificationManager = NotificationManagerCompat.from(AndroidUtils.getGlobalContext());
notificationManager.createNotificationChannel(musicDownloadChannel);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public static void createMusicPlaylistDownloadChannel() {
var musicDownloadChannel = new NotificationChannel(MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID, MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
musicDownloadChannel.setDescription(MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_DESCRIPTION);
musicDownloadChannel.setShowBadge(true);
musicDownloadChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
var notificationManager = NotificationManagerCompat.from(AndroidUtils.getGlobalContext());
notificationManager.createNotificationChannel(musicDownloadChannel);
}
public static NotificationManagerCompat getNotificationManager() {
if (notificationManagerCompat == null)
notificationManagerCompat = NotificationManagerCompat.from(AndroidUtils.getGlobalContext());
return notificationManagerCompat;
}
}
@@ -1,10 +1,14 @@
package ru.vtosters.lite.encryption;
import static ru.vtosters.lite.hooks.MessagesHook.injectOwnText;
import static ru.vtosters.lite.hooks.MessagesHook.injectOwnTextAll;
import android.util.Log;
import android.util.Pair;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.msg_list.MsgListComponent;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -49,6 +53,51 @@ public class EncryptProvider {
return msg.v1();
}
// For message editing
public static String decryptMessage(MsgFromUser msg, boolean showEmoji) {
var decryptedMessage = decryptMessage(getBody(msg), getPeerId(msg));
if (!showEmoji && !decryptedMessage.equals(injectOwnTextAll(getBody(msg))))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
public static String decryptMessage(String msg, MsgListComponent list) {
var peerid = list.G().getId();
var decryptedMessage = decryptMessage(msg, peerid);
if (!decryptedMessage.equals(injectOwnTextAll(msg)))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
public static CharSequence decryptMessage(CharSequence msg, int peerid) {
return decryptMessage(msg.toString(), peerid);
}
public static CharSequence decryptMessage(Msg msg, CharSequence orig) {
if (msg instanceof MsgFromUser) {
var decrypted = decryptMessage(((MsgFromUser) msg).f(), msg.v1());
if (decrypted.contains("\uD83D\uDD12")) {
return decrypted;
}
}
return orig;
}
public static String decryptMessages(String msgBody, int peer, boolean showEmoji) {
return (String) decryptMessage(msgBody, peer, showEmoji);
}
// For MentionsFormatter that requires CharSequence
public static CharSequence decryptMessage(String msgBody, int peer, boolean showEmoji) {
var decryptedMessage = decryptMessage(msgBody, peer);
if (!showEmoji && !decryptedMessage.equals(injectOwnTextAll(msgBody)))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
// This will run through EVERY single processor available.
public static String decryptMessage(MsgFromUser msg) {
return decryptMessage(getBody(msg), getPeerId(msg));
@@ -58,12 +107,13 @@ public class EncryptProvider {
try {
for (IMProcessor processor : processors) {
if ((processor.isUsed() || !processor.isPublic()) && processor.isEncrypted(msgBody) && (processor.isPublic() || getKeyForProcessor(processor, peer) != null))
return "\uD83D\uDD12 " + processor.decode(msgBody, getKeyForProcessor(processor, peer));
return "\uD83D\uDD12 " + injectOwnTextAll(processor.decode(msgBody, getKeyForProcessor(processor, peer)));
}
} catch (Exception e) {
e.printStackTrace();
}
return msgBody;
return injectOwnTextAll(msgBody);
}
private static byte[] getKeyForProcessor(IMProcessor processor, int peer) {
@@ -84,9 +134,8 @@ public class EncryptProvider {
return keyString.getBytes();
}
// This will use only the processor which was chosen in chat menu [that's why ID is needed, bruh]
// This will use only the processor which was chosen in chat menu
public static String encryptMessage(MsgFromUser msg) {
String msgBody = getBody(msg);
Log.d("EncryptProvider", "encryptMessage: msg = " + msg);
@@ -96,11 +145,11 @@ public class EncryptProvider {
for (IMProcessor processor : processors) {
int peer = getPeerId(msg);
if (processor.isUsedToEncrypt(peer)) {
return processor.encode(msgBody, getKeyForProcessor(processor, peer));
return injectOwnText(processor.encode(msgBody, getKeyForProcessor(processor, peer)));
}
}
return msgBody;
return injectOwnText(msgBody);
}
// For rendering UI
@@ -0,0 +1,19 @@
package ru.vtosters.lite.feature.discover;
import com.vk.dto.discover.DiscoverItem;
import java.util.ArrayList;
public class DiscoverTemplates {
public static ArrayList<String> getTemplates() {
var templates = DiscoverItem.Template.values();
var arrayList = new ArrayList<String>();
for (var template : templates) {
if (template != DiscoverItem.Template.GRID_MEDIA) {
arrayList.add(template.b());
}
}
return arrayList;
}
}
@@ -0,0 +1,15 @@
package ru.vtosters.lite.feature.music;
import android.content.Context;
import com.vk.music.fragment.MusicFragment;
public class MusicArtistSelectorHook {
public static void navigateToSearch(Context context, String artist) {
var fr = new MusicFragment.f();
fr.a(artist);
// navigate
fr.a(context);
}
}
@@ -2,26 +2,28 @@ package ru.vtosters.lite.foaf;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.ProxyUtils.apiproxy;
import static ru.vtosters.lite.utils.ProxyUtils.getApi;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;
import androidx.exifinterface.media.ExifInterface;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.network.Network;
import com.vtosters.lite.R;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
@@ -30,14 +32,15 @@ import java.util.regex.Pattern;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import ru.vtosters.lite.net.Request;
import ru.vtosters.lite.utils.LifecycleUtils;
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 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 String API_VKNEXT = "https://api.vtosters.app/v1/getBypassedOnlineInfo?json=1&ids=";
private static final OkHttpClient client = new OkHttpClient();
public static long getLastSeen(long origtime, int id) throws ParseException, IOException {
public static long getLastSeen(long origtime, int id) throws ParseException {
var request = new okhttp3.Request.a()
.b(getLink(id))
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")).a();
@@ -58,15 +61,56 @@ public class FoafBase {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
Date date = sdf.parse(matcher.group(1));
Date date = sdf.parse(Objects.requireNonNull(matcher.group(1)));
sdf.setTimeZone(TimeZone.getDefault());
return sdf.parse(sdf.format(date)).getTime() / 1000;
}
public static JSONObject getBypassedOnlineInfo(int id) throws JSONException {
var request = new okhttp3.Request.a()
.b(API_VKNEXT + id)
.a();
String response = null;
var dummy = new JSONObject();
dummy.put("last_seen", 0);
try {
response = client.a(request).execute().a().g();
var online_info = new JSONObject(response).optJSONObject("response").optJSONObject(Integer.toString(id));
return online_info == null ? dummy : online_info;
} catch (Exception e) {
Log.e("GetBypassedOnlineInfo", e.getMessage());
return dummy;
}
}
public static JSONObject getBypassedOnlineInfo(String ids) {
var request = new okhttp3.Request.a()
.b(API_VKNEXT + ids)
.a();
String response;
var dummy = new JSONObject();
try {
response = client.a(request).execute().a().g();
var online_info = new JSONObject(response).optJSONObject("response");
return online_info == null ? dummy : online_info;
} catch (Exception e) {
Log.e("GetBypassedOnlineInfo1", e.getMessage());
return dummy;
}
}
private static String getLink(int i) {
String str;
StringBuilder sb;
if (apiproxy()) {
if (isAnyProxyEnabled()) {
sb = new StringBuilder();
str = "https://" + getApi() + "/_/vk.com/foaf.php?id=";
} else {
@@ -80,7 +124,7 @@ public class FoafBase {
public static void loadAndShow(Context context, int i) {
ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage(getString("com_facebook_loading"));
progressDialog.setMessage(context.getString(R.string.com_facebook_loading));
progressDialog.setCancelable(false);
progressDialog.show();
@@ -92,21 +136,26 @@ public class FoafBase {
try {
progressDialog.cancel();
Matcher matcher = FOAF_REGEX.matcher(str);
Matcher matcher2 = FOAF_REGEX_LOGIN.matcher(str);
matcher.find();
matcher2.find();
String normalHumanDate = getNormalHumanDate(matcher.group(1));
getNormalHumanDate(matcher2.group(1));
VkAlertDialog.Builder a2 = new VkAlertDialog.Builder(context).setTitle(getIdentifier("addinf", "string"));
a2.setMessage(getString("foafid") + " " + i + getString("foafregdate") + " " + normalHumanDate + getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).setPositiveButton(17039370, null).create().show();
String normalHumanDate = getNormalHumanDate(Objects.requireNonNull(matcher.group(1)));
LifecycleUtils.getCurrentActivity().runOnUiThread(() -> new VkAlertDialog.Builder(context)
.setTitle(R.string.addinf)
.setMessage(context.getString(R.string.foafid) +
" " + i + context.getString(R.string.foafregdate)
+ " " + normalHumanDate + context.getString(R.string.foafdate)
+ " " + daysPassedFromFoafDate(normalHumanDate))
.setPositiveButton(android.R.string.ok, null)
.show());
} catch (Exception e) {
e.printStackTrace();
makeText(getGlobalContext(), getString("foaferr"), LENGTH_SHORT).show();
LifecycleUtils.getCurrentActivity().runOnUiThread(() -> makeText(getGlobalContext(), context.getString(R.string.foaferr), LENGTH_SHORT).show());
}
}
private static long daysPassedFromFoafDate(String str) {
try {
@SuppressLint("SimpleDateFormat")
Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(str.split(" ")[1]);
return TimeUnit.DAYS.convert(new Date().getTime() - parse.getTime(), TimeUnit.MILLISECONDS);
} catch (ParseException e) {
@@ -116,7 +165,7 @@ public class FoafBase {
}
private static String getNormalHumanDate(String str) {
String[] split = str.split(ExifInterface.GPS_DIRECTION_TRUE);
String[] split = str.split("T");
return split[1].split("\\+")[0] + " " + split[0];
}
}
@@ -0,0 +1,383 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews;
import static ru.vtosters.lite.utils.Preferences.ads;
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.dev;
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.postsrecomm;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Collections;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
public class AdBlockHook {
public static Boolean discoverAdBlock(JSONObject jsonObject) {
if (jsonObject == null) return true;
try {
var type = jsonObject.optString("type");
var post = jsonObject.optJSONObject("post");
if (jsonObject.optString("template").contains("ads") || jsonObject.has("ads")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: ads");
return false;
}
if (isAds(post, type)) {
return false;
}
if (authorsrecomm() && (type.equals("authors_rec")
|| type.startsWith("recommended_") && (type.endsWith("audios")
|| type.endsWith("artists")
|| type.endsWith("playlists")
|| type.endsWith("groups")))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: authorsrecomm");
return false;
}
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: postsrecomm");
return false;
}
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: friendsrecomm");
return false;
}
if (adsgroup() && (post != null ? post.optInt("marked_as_ads") : 0) == 1 && !isWhitelistedAd(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: marked_as_ads is true");
return false;
}
if (post != null) {
if (isBadNews(post.optString("text")) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: text filters");
return false;
}
if (checkCopyright(post) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: copyright filters");
return false;
}
if (checkCaption(post) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: caption filters");
return false;
}
if (NewsFeedFiltersUtils.injectFiltersReposts(post) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: repost ad");
return false;
}
}
} catch (Exception e) {
Log.d("NewsfeedAdBlockV2", "discover: " + e.getMessage());
}
return true;
}
public static JSONObject discoverInject(JSONObject json) throws JSONException {
var items = json.optJSONArray("items");
var newObj = new JSONArray();
// newObj.put(discoverObj()); // template injection
for (int i = 0; i < (items != null ? items.length() : 0); i++) {
try {
var curr = items.getJSONObject(i);
if (!curr.optString("template").contains("info") && discoverAdBlock(curr)) {
newObj.put(items.optJSONObject(i));
}
} catch (Exception e) {
Log.d("NewsfeedAdBlockV2", "discover: " + e);
}
}
json.put("items", newObj);
return json;
}
public static JSONObject discoverObj() throws JSONException {
var mainjson = new JSONObject();
var info = new JSONObject();
info.put("title", "Test Injection");
info.put("text_color", "#ffffff");
info.put("description", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat");
var image = new JSONArray();
var imageQuality1 = new JSONObject();
imageQuality1.put("url", "https://w7.pngwing.com/pngs/505/1021/png-transparent-konata-izumi-lucky-star-desktop-anime-anime-blue-mammal-face.png");
imageQuality1.put("width", 72); // 72, 108, 144, 216, 288
imageQuality1.put("height", 72); // 72, 108, 144, 216, 288
image.put(imageQuality1);
var background = new JSONArray();
var backgroundQuality1 = new JSONObject();
backgroundQuality1.put("url", "https://2ch.life/vg/arch/2022-08-22/src/38524739/16440606579870.jpg");
backgroundQuality1.put("width", 344); // 344, 516, 680, 1032, 1376
backgroundQuality1.put("height", 215); // 215, 323, 426, 645, 860
background.put(backgroundQuality1);
info.put("image", image);
info.put("background", background);
mainjson.put("info", info);
mainjson.put("track_code", "info_banner_donut_catalog");
mainjson.put("template", "info");
var action = new JSONObject();
action.put("type", "open_url");
action.put("url", "vk.com/vtosters_official");
action.put("target", "internal");
mainjson.put("action", action);
return mainjson;
}
public static JSONArray feedInject(JSONArray items) {
if (items.length() == 0) return items;
try {
var newItems = new JSONArray();
for (int j = 0; j < items.length(); j++) {
var list = items.optJSONObject(j);
if (list == null) continue;
var type = list.optString("type");
if (isAds(list, type)) {
continue;
}
if (authorsrecomm() && (type.equals("authors_rec")
|| type.startsWith("recommended_") && (type.endsWith("audios")
|| type.endsWith("artists")
|| type.endsWith("playlists")
|| type.endsWith("groups")))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: authorsrecomm");
continue;
}
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: postsrecomm");
continue;
}
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: friendsrecomm");
continue;
}
if (adsgroup() && list.optInt("marked_as_ads") == 1 && !isWhitelistedAd(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: marked_as_ads is true");
continue;
}
if (isBadNews(list.optString("text")) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: text filters");
continue;
}
if (checkCopyright(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: copyright filters");
continue;
}
if (checkCaption(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters");
continue;
}
if (hasMiniAppAds(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: MiniApp filters");
continue;
}
if (NewsFeedFiltersUtils.injectFiltersReposts(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad");
continue;
}
newItems.put(list);
}
return newItems;
} catch (Exception e) {
Log.d("NewsfeedAdBlockV2", e.getMessage());
}
return items;
}
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
if (!adsstories()) {
return json;
}
if (json.has("ads")) {
var ad = json.optJSONObject("ads");
if (isDeleteFix) {
if (ad != null) {
ad.optJSONObject("settings")
.put("stories_interval", 0)
.put("authors_interval", 0)
.put("time_interval", 0)
.put("stories_init", 0)
.put("authors_init", 0)
.put("time_init", 0);
}
if (dev()) Log.d("StoriesAds", "Set ads settings at zero values");
} else {
json.remove("ads");
if (dev()) Log.d("StoriesAds", "Removed ads block");
}
}
if (!json.has("items")) return json;
var items = json.optJSONArray("items");
if (items != null) {
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item != null) {
parseStoriesItem(item);
}
}
}
return json;
}
private static void parseStoriesItem(JSONObject item) throws JSONException {
var stories = item.optJSONArray("stories");
var newStories = new JSONArray();
if (stories == null) return;
for (int j = 0; j < stories.length(); j++) {
var story = stories.optJSONObject(j);
if (!story.optBoolean("is_ads") && !story.optBoolean("is_promo")) {
newStories.put(story);
} else {
if (dev())
Log.d("StoriesAds", "Fetched ad, owner id " + story.optString("owner_id") + ", caption " + story.optString("caption"));
}
}
item.put("stories", newStories);
}
public static Boolean isAds(JSONObject list, String type) throws JSONException {
if (list == null || type == null || !ads()) return false;
if (list.has("ads")
|| type.equals("ads")
|| type.equals("carousel")
|| type.equals("html5_ad")
|| type.equals("ads_easy_promote")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: ads");
return true;
}
if (type.equals("promo_button")
|| type.equals("app_widget")
|| type.equals("app_video")
|| type.equals("app_slider")
|| type.equals("tags_suggestions")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: promo");
return true;
}
return false;
}
public static Boolean isWhitelistedFilters(JSONObject list) {
var id = String.valueOf(list.optInt("owner_id"));
if (id.equals("0")) {
id = String.valueOf(list.optInt("source_id"));
}
if (id.equals("-189659924")) {
return true;
}
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet(
"whitelisted_filters_groups",
Collections.emptySet()
);
return whitelist.contains(id);
}
public static Boolean isWhitelistedAd(JSONObject list) {
var id = String.valueOf(list.optInt("owner_id"));
if (id.equals("0")) {
id = String.valueOf(list.optInt("source_id"));
}
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()
);
return whitelist.contains(id);
}
public static Boolean hasMiniAppAds(JSONObject list) {
var attachments = list.optJSONArray("attachments");
if (attachments != null && getBoolValue("blockminiapps", false)) {
for (int j = 0; j < attachments.length(); j++) {
var type = attachments.optJSONObject(j).optString("type");
if (type.contains("mini_app")) return true;
}
}
return false;
}
}
@@ -0,0 +1,143 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.dnr.DNRInjector.forceInvalidateDialogActions;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.text.Editable;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vtosters.lite.R;
import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.utils.AndroidUtils;
public class CryptImHook {
public static boolean isPrivateProcessor(int peerID) {
for (IMProcessor processor : EncryptProvider.processors) {
if (processor.isUsedToEncrypt(peerID)) {
return !processor.isPublic();
}
}
return false;
}
public static void hook(int peerId, Dialog d) {
List<IMProcessor> processors = EncryptProvider.processors;
IMProcessor enabled = null;
int enabledPosition = 0;
String[] titles = new String[processors.size() + 1];
titles[0] = AndroidUtils.getString(R.string.encryption_disable);
for (int i = 0; i < processors.size(); i++) {
IMProcessor proc = processors.get(i);
titles[i + 1] = proc.getUIName();
if (proc.isUsedToEncrypt(peerId)) {
enabled = proc;
enabledPosition = i + 1;
}
}
IMProcessor finalEnabled = enabled;
Activity ctx = getCurrentActivity();
if (ctx == null) {
sendToast(AndroidUtils.getString(R.string.app_activities_error));
return;
}
new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString(R.string.encryption_sett))
.setSingleChoiceItems(titles, enabledPosition, (dialog, which) -> {
if (which == 0) {
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
} else {
IMProcessor proc = processors.get(which - 1);
if (proc.isUsedToEncrypt(peerId)) {
proc.disableEncryptFor(peerId);
} else {
proc.enableEncryptFor(peerId);
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
}
}
dialog.dismiss();
forceInvalidateDialogActions(d);
})
.show();
}
public static void hookPref(int peerId) {
IMProcessor enabled = null;
String key = null;
for (IMProcessor processor : EncryptProvider.processors) {
if (processor.isUsedToEncrypt(peerId)) {
enabled = processor;
}
}
if (enabled != null && enabled.isPublic()) {
sendToast(AndroidUtils.getString(R.string.encryption_public_algorithm_error));
return;
}
if (Objects.requireNonNull(enabled).getEncryptionKeyFor(peerId) != null) {
key = enabled.getEncryptionKeyFor(peerId);
}
if (key.equals("VTAesDefault")) {
key = null;
}
Context ctx = getCurrentActivity();
if (ctx == null) {
sendToast(ctx.getString(R.string.app_activities_error));
return;
}
LinearLayout linearLayout = new LinearLayout(ctx);
final EditText editText = new EditText(ctx);
editText.setHintTextColor(getSTextAttr());
editText.setBackgroundTintList(ColorStateList.valueOf(getSTextAttr()));
linearLayout.addView(editText);
editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams());
margin.setMargins(dp2px(24f), 0, dp2px(24f), 0);
editText.setLayoutParams(margin);
editText.setText(key == null ? "" : key);
IMProcessor finalEnabled = enabled;
new VkAlertDialog.Builder(ctx)
.setTitle(R.string.encryption_enter_key)
.setMessage(String.format(ctx.getString(R.string.encryption_current_algorithm_title), enabled.getUIName()))
.setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
Editable edit = editText.getText();
finalEnabled.setEncryptionKeyFor(peerId, edit == null ? null : edit.toString());
}).setNegativeButton(android.R.string.cancel, null)
.show();
}
}
@@ -1,16 +1,18 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.getStringDate;
import android.annotation.SuppressLint;
import com.vtosters.lite.R;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import ru.vtosters.lite.utils.AndroidUtils;
public class DateHook {
public static boolean fulltime() {
return getPrefsValue("dateformat").equals("noyear") || getPrefsValue("dateformat").equals("full") || getPrefsValue("dateformat").equals("noseconds");
@@ -19,11 +21,11 @@ public class DateHook {
public static String getDateFormat() {
switch (getPrefsValue("dateformat")) {
case "noyear":
return getString("fulltime2");
return AndroidUtils.getString(R.string.fulltime2);
case "full":
return getString("fulltime");
return AndroidUtils.getString(R.string.fulltime);
default:
return getString("fulltime3");
return AndroidUtils.getString(R.string.fulltime3);
}
}
@@ -38,7 +40,7 @@ public class DateHook {
if (!fulltime()) return null;
try {
return getStringDate(isFemale ? getIdentifier("last_seen_profile_f", "string") : getIdentifier("last_seen_profile_m", "string"), date.format(new Date(time)));
return getStringDate(isFemale ? R.string.last_seen_profile_f : R.string.last_seen_profile_m, date.format(new Date(time)));
} catch (Throwable th) {
th.printStackTrace();
return null;
@@ -1,11 +1,15 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.MD5;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.annotation.SuppressLint;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import java.util.Random;
public class DeviceInfoHook{
public class DeviceInfoHook {
public static String getDeviceInfo(String input) {
Log.d("DeviceInfoHook", "getDeviceInfo: " + input);
if (getBoolValue("hideDeviceInfo", true)) return "";
@@ -13,27 +17,30 @@ public class DeviceInfoHook{
}
public static String getDeviceId(String input) {
Log.d("DeviceInfoHook", "getDeviceId: " + input);
Log.d("DeviceInfoHook", "getDeviceId shuffled: " + shuffle(input));
if (getBoolValue("hideDeviceInfo", true)) return shuffle(input);
return input;
return findDeviceId() + ":" + getDeviceId();
}
public static String shuffle(String string) {
StringBuilder sb = new StringBuilder(string.length());
double rnd;
for (char c: string.toCharArray()) {
rnd = Math.random();
if (rnd < 0.34)
sb.append(c);
else if (rnd < 0.67)
sb.insert(sb.length() / 2, c);
else
sb.insert(0, c);
public static String getDeviceId() {
String sb2 = Build.PRODUCT +
Build.BOARD +
Build.BOOTLOADER +
Build.BRAND +
Build.DEVICE +
Build.DISPLAY +
Build.FINGERPRINT +
Build.HARDWARE +
Build.HOST +
Build.ID +
Build.MANUFACTURER +
Build.MODEL +
Build.PRODUCT +
Build.TAGS;
sb.append(new Random().nextInt(10));
sb.deleteCharAt(0);
}
return sb.toString();
return MD5(sb2);
}
@SuppressLint("HardwareIds")
private static String findDeviceId() {
return Settings.Secure.getString(getGlobalContext().getContentResolver(), "android_id");
}
}
@@ -82,7 +82,8 @@ public class DockBarInjector {
} while (acquire.invoke(synchronizedPool) != null);
}
} catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) {
} catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException |
NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
@@ -211,6 +212,10 @@ public class DockBarInjector {
if (milkshake())
val = MenuCountersState.k();
break;
case tab_news:
if (milkshake() && getBoolValue("newsfeed_notif", true))
val = MenuCountersState.k();
break;
case menu_friends:
if (!milkshake())
val = MenuCountersState.k();
@@ -286,7 +291,7 @@ public class DockBarInjector {
}
public static Class<?> interceptClick(int id, RightMenu rightMenu) {
if (id == tab_menu) {
if (id == tab_menu && rightMenu != null) {
rightMenu.a();
}
@@ -294,6 +299,7 @@ public class DockBarInjector {
if (id == tab.id)
return tab.fragmentClass;
}
for (DockBarTab tab : sManager.getDisabledTabs()) {
if (id == tab.id)
return tab.fragmentClass;
@@ -29,7 +29,6 @@ import javax.net.ssl.HttpsURLConnection;
public class GcmHook {
private static final String agent = String.format("Android-GCM/1.5 (%s %s)", Build.MODEL, Build.MODEL);
public static ArrayList<String> langs = new ArrayList<>();
private static KeyPair pair;
private static int rid = 0;
@@ -38,12 +37,12 @@ public class GcmHook {
}
public static String requestTokenV2(String orig) {
if (musicFixNew()) return "null";
if (musicFixNew()) return "null"; //not public
return orig;
}
public static String requestToken(String orig) {
if (musicFixNew()) return "{null}";
if (musicFixNew()) return "{null}"; //not public
if (orig.equals("")) return requestToken();
return orig;
}
@@ -1,31 +1,31 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.foaf.FoafBase.getLastSeen;
import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.utils.Base64Utils.decode;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews;
import static ru.vtosters.lite.utils.Preferences.ads;
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.hooks.OnlineFormatterHook.onlineHookProfiles;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogHeader;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogPlaylist;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogSeparator;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getPlaylist;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.getStatic;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.friendsblock;
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.hasVerification;
import static ru.vtosters.lite.utils.Preferences.podcastcatalog;
import static ru.vtosters.lite.utils.Preferences.postsrecomm;
import static ru.vtosters.lite.utils.VTVerifications.isDeveloper;
import static ru.vtosters.lite.utils.VTVerifications.isPrometheus;
import static ru.vtosters.lite.utils.VTVerifications.isVerified;
import android.text.TextUtils;
import android.util.Log;
import com.vk.core.network.Network;
import com.vk.core.util.DeviceIdProvider;
import com.vk.core.util.LangUtils;
import com.vtosters.lite.R;
import org.json.JSONArray;
import org.json.JSONException;
@@ -33,15 +33,17 @@ import org.json.JSONObject;
import java.io.IOException;
import java.text.ParseException;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Random;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
public class JsonInjectors {
private static final OkHttpClient mClient = new OkHttpClient();
@@ -69,7 +71,7 @@ public class JsonInjectors {
}
public static JSONObject donateRecomm() throws JSONException {
var title = "Помоги проекту донатом и получи бонус!";
var title = AndroidUtils.getString(R.string.donate_to_vtl);
var link = "https://vk.com/vtosters_official";
var text_color = "2D81E0";
@@ -110,9 +112,9 @@ public class JsonInjectors {
}
public static JSONObject vktesters(int id) throws JSONException {
var title = "Карточка Тестера";
var title = AndroidUtils.getString(R.string.tester_profile);
var text_color = "2D81E0";
var link = "https://static.vk.com/bugs?lang=" + LangUtils.a() + "#/reporter" + id;
var link = "https://" + getStatic() + "/bugs?lang=" + LangUtils.a() + "#/reporter" + id;
var json = new JSONObject();
var icons = new JSONArray();
@@ -154,27 +156,21 @@ public class JsonInjectors {
var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id");
var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null
var text = "Я не загрузил данные (9(9((";
var text = AndroidUtils.getString(R.string.no_data_error);
var link = "https://vtosters.app"; // can be null
var linktitle = "Test button"; // can be null
// "{\"layout\":\"tertiary\",\"text\":\"" + linktitle + "\",\"type\":\"link\",\"link\":\"" + link + "\"}";
var buttons = decode("eyJsYXlvdXQiOiJ0ZXJ0aWFyeSIsInRleHQiOiI=") + linktitle + decode("IiwidHlwZSI6ImxpbmsiLCJsaW5rIjoi") + link + decode("In0=");
// ,"icon":" + pic + "
var icon = decode("LCJpY29uIjoi") + pic + decode("Ig==");
var hasIcon = !pic.isEmpty();
var hasButton = !buttons.isEmpty();
var hasButton = !link.isEmpty();
var isPicture = pic.endsWith(".png") || pic.endsWith(".jpg") || pic.endsWith(".jpeg") || pic.endsWith(".webp");
if (!isPicture) hasIcon = false;
if (!hasIcon) icon = "";
if (!hasButton) buttons = "";
if (isVerified(peerid)) text = AndroidUtils.getString(R.string.i_bought) + " VTosters Premium";
if (isPrometheus(peerid))
text = AndroidUtils.getString(R.string.i_bought) + " VTosters Premium Gold Prime Pro Plus";
if (isDeveloper(peerid)) text = AndroidUtils.getString(R.string.i_created_poop);
if (isVerified(peerid)) text = "Я купил VTosters Premium";
if (isPrometheus(peerid)) text = "Я купил VTosters Premium Gold Prime Pro Plus";
if (isDeveloper(peerid)) text = "Я создал говно";
if (!isVerified(peerid) || text.equals("")) {
if (!isVerified(peerid) || text.equals("") || peerid == AccountManagerUtils.getUserId() || peerid == 0) {
if (getBoolValue("convBarRecomm", false)) {
return null;
} else {
@@ -182,14 +178,27 @@ public class JsonInjectors {
}
}
if (!dev()) return orig.optJSONObject("conversation_bar");
if (!dev()) return orig.optJSONObject("conversation_bar"); // for devs only
// JSONObject("{\"name\":\"group_admin_welcome\",\"text\":\"" + textverif + "\",\"buttons\":[],\"icon\":\"" + pic + "\"}");
return new JSONObject(decode("eyJuYW1lIjoiZ3JvdXBfYWRtaW5fd2VsY29tZSIsInRleHQiOiI=")
+ text + decode("IiwiYnV0dG9ucyI6Ww==")
+ buttons + decode("XQ==")
+ icon
+ decode("fQ=="));
var json = new JSONObject();
var buttonsJson = new JSONObject();
buttonsJson.put("layout", "tertiary");
buttonsJson.put("text", linktitle);
buttonsJson.put("type", "link");
buttonsJson.put("link", link);
var buttonsjson = new JSONArray(); // max 3 buttons in array
if (hasButton) buttonsjson.put(buttonsJson);
json.put("name", "group_admin_welcome");
json.put("text", text);
json.put("buttons", buttonsjson);
if (hasIcon && isPicture) {
json.put("icon", pic);
}
return json;
}
public static JSONObject menu(JSONObject orig) throws JSONException {
@@ -234,30 +243,12 @@ public class JsonInjectors {
}
public static JSONObject musiclink(JSONObject json) {
var oldItems = json.optJSONArray("links");
var section = json.optJSONObject("section");
var linksblock = section.optJSONArray("blocks");
var newBlock = new JSONArray();
var links = json.optJSONArray("links");
if (oldItems != null) {
if (oldItems.optJSONObject(0).optString("url").contains("?section=recent")) {
if (links != null) {
if (links.optJSONObject(0).optString("url").contains("?section=recent")) {
json.remove("links");
for (int i = 0; i < linksblock.length(); i++) {
var item = linksblock.optJSONObject(i);
var datatype = item.optString("data_type");
var layname = item.optJSONObject("layout").optString("name");
if (!datatype.equals("links") && !layname.equals("separator")) {
newBlock.put(item);
}
}
try {
section.putOpt("blocks", newBlock);
} catch (JSONException e) {
e.printStackTrace();
}
if (dev()) Log.d("VKMusic", "Removed links buttons");
}
}
@@ -265,195 +256,118 @@ public class JsonInjectors {
return json;
}
public static JSONObject setOnlineInfo(JSONObject json) throws ParseException, IOException, JSONException {
public static JSONObject setOnlineInfo(JSONObject json) throws JSONException {
var id = json.optInt("id");
if (id == AccountManagerUtils.getUserId()) {
return json;
}
var onlineinfo = json.optJSONObject("online_info");
var time = getLastSeen(0L, id);
if (onlineinfo != null && !onlineinfo.optBoolean("visible")) {
var bypassed = getBypassedOnlineInfo(id);
if (bypassed.optInt("last_seen", 0) != 0) {
json.remove("online_info");
if (time != 0L && onlineinfo != null && !onlineinfo.optBoolean("is_online") && id != AccountManagerUtils.getUserId()) {
json.remove("online_info");
var online_info = new JSONObject()
.put("visible", true)
.put("last_seen", bypassed.optInt("last_seen"))
.put("is_online", bypassed.optBoolean("is_online"))
.put("app_id", bypassed.optInt("app_id"))
.put("is_mobile", bypassed.optBoolean("is_mobile"));
var last_seen = new JSONObject()
.put("platform", bypassed.optInt("platform"))
.put("time", bypassed.optInt("last_seen"));
json.put("last_seen", last_seen).put("online_info", online_info);
}
}
return json;
}
public static JSONArray setOnlineInfoUsers(JSONArray profiles) throws JSONException {
if (profiles == null || profiles.length() == 0) return profiles;
StringBuilder sb = new StringBuilder();
var curVkId = AccountManagerUtils.getUserId();
for (int i = 0; i < profiles.length(); i++) {
JSONObject profile = profiles.getJSONObject(i);
int id = profile.optInt("id", -1);
JSONObject onlinfo = profile.optJSONObject("online_info");
if (id == curVkId || id < 0 || onlinfo == null || onlinfo.optBoolean("visible")) {
continue;
}
sb.append(id);
sb.append(",");
}
var ids = sb.toString();
if (ids.length() > 0) {
ids = ids.substring(0, ids.length() - 1);
} else {
return profiles;
}
JSONObject bypassedObj = getBypassedOnlineInfo(ids);
for (int i = 0; i < profiles.length(); i++) {
JSONObject profile = profiles.getJSONObject(i);
int id = profile.optInt("id");
JSONObject bypassed = bypassedObj.optJSONObject(Integer.toString(id));
if (bypassed == null) {
continue;
}
profile.remove("online_info");
var online_info = new JSONObject()
.put("visible", true)
.put("last_seen", time)
.put("is_online", false)
.put("app_id", 0)
.put("is_mobile", false);
.put("last_seen", bypassed.optInt("last_seen"))
.put("is_online", bypassed.optBoolean("is_online"))
.put("app_id", bypassed.optInt("app_id"))
.put("is_mobile", bypassed.optBoolean("is_mobile"));
var last_seen = new JSONObject()
.put("platform", 4)
.put("time", time);
.put("platform", bypassed.optInt("platform"))
.put("time", bypassed.optInt("last_seen"));
json.put("last_seen", last_seen).put("online_info", online_info);
profile.put("last_seen", last_seen).put("online_info", online_info);
}
return json;
}
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
if (!adsstories()) {
return json;
}
if (json.has("ads")) {
if (isDeleteFix) {
json.optJSONObject("ads").optJSONObject("settings")
.put("stories_interval", 0)
.put("authors_interval", 0)
.put("time_interval", 0)
.put("stories_init", 0)
.put("authors_init", 0)
.put("time_init", 0);
if (dev()) Log.d("StoriesAds", "Set ads settings at zero values");
} else {
json.remove("ads");
if (dev()) Log.d("StoriesAds", "Removed ads block");
}
}
if (!json.has("items")) return json;
var items = json.optJSONArray("items");
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item != null) {
parseStoriesItem(item);
}
}
return json;
}
private static void parseStoriesItem(JSONObject item) throws JSONException {
var stories = item.optJSONArray("stories");
var newStories = new JSONArray();
if (stories == null) return;
for (int j = 0; j < stories.length(); j++) {
var story = stories.optJSONObject(j);
if (!story.optBoolean("is_ads") && !story.optBoolean("is_promo")) {
newStories.put(story);
} else {
if (dev())
Log.d("StoriesAds", "Fetched ad, owner id " + story.optString("owner_id") + ", caption " + story.optString("caption"));
}
}
item.put("stories", newStories);
}
public static Boolean isAds(JSONObject list, String type) throws JSONException {
if (list == null || type == null || !ads()) return false;
if (list.has("ads")
|| type.equals("ads")
|| type.equals("carousel")
|| type.equals("html5_ad")
|| type.equals("ads_easy_promote")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: ads");
return true;
}
if (type.equals("promo_button")
|| type.equals("app_widget")
|| type.equals("app_video")
|| type.equals("app_slider")
|| type.equals("tags_suggestions")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: promo");
return true;
}
return false;
return profiles;
}
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
for (int j = 0; j < items.length(); j++) {
var list = items.optJSONObject(j);
var name = list.optString("id");
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null);
var mutableFiltersSet = new LinkedHashSet<String>();
if (filtersSet != null)
mutableFiltersSet.addAll(filtersSet);
if (!name.equals("kpop") && !name.equals("foryou") && !name.equals("qazaqstan")) {
list.put("is_hidden", false).put("is_unavailable", false);
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + name + " in newsfeed list");
}
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item == null) continue;
var id = item.optString("id");
var title = item.optString("title");
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
// this items not working
|| id.equals("kpop") || id.equals("foryou")
|| id.equals("qazaqstan") || id.equals("podcasts"))
continue;
mutableFiltersSet.add(id + "|" + title);
var hide = selectedItems.contains(id);
Log.d("NewsfeedList", "Added list " + id + " to feed");
item.put("is_hidden", hide)
.put("is_unavailable", hide);
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
}
getDefaultPrefs().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
.apply();
return items;
}
public static JSONArray newsfeedadtest(JSONArray items) throws JSONException {
if (!getBoolValue("newadblock", true)) return items;
var newItems = new JSONArray();
for (int j = 0; j < items.length(); j++) {
var list = items.optJSONObject(j);
var type = list.optString("type");
if (isAds(list, type)) {
continue;
}
if (authorsrecomm() && (type.equals("authors_rec")
|| type.startsWith("recommended_") && (type.endsWith("audios")
|| type.endsWith("artists")
|| type.endsWith("playlists")
|| type.endsWith("groups")))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: authorsrecomm");
continue;
}
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: postsrecomm");
continue;
}
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: friendsrecomm");
continue;
}
if (adsgroup() && list.optInt("marked_as_ads") == 1) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: marked_as_ads is true");
continue;
}
if (isBadNews(list.optString("text"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: text filters");
continue;
}
if (checkCopyright(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: copyright filters");
continue;
}
if (checkCaption(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters");
continue;
}
if (NewsFeedFiltersUtils.injectFiltersReposts(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad");
continue;
}
newItems.put(list);
}
return newItems;
}
public static JSONObject music(JSONObject json) throws JSONException {
var catalog = json.optJSONObject("catalog");
@@ -464,6 +378,8 @@ public class JsonInjectors {
}
if (oldItems != null && oldItems.optJSONObject(0).optString("url").contains("general")) {
json.optJSONArray("playlists").put(getPlaylist());
if (podcastcatalog()) {
var podcasts = fetchCatalogPodcast();
if (podcasts != null) {
@@ -527,21 +443,41 @@ public class JsonInjectors {
Log.d("VKMusic", "title: " + title + " id: " + id + " url: " + url + " value: " + value);
if (url.contains(value)) {
if (url.contains(value) && !value.isEmpty()) {
catalog.put("default_section", id);
if (dev()) Log.d("VKMusic", "Added " + title + " as default music section");
}
}
if (CacheDatabaseDelegate.hasTracks() && !LibVKXClient.isIntegrationEnabled()){ // inj in playlist list
var blocks = oldItems.optJSONObject(0).optJSONArray("blocks");
var newBlocks = new JSONArray();
if (blocks != null){
newBlocks
.put(getCatalogHeader())
.put(getCatalogPlaylist())
.put(getCatalogSeparator());
Log.d("VKMusic", "added cache catalog playlist");
for (int i = 0; i < blocks.length(); i++) {
newBlocks.put(blocks.optJSONObject(i));
}
oldItems.optJSONObject(0).put("blocks", newBlocks);
}
}
}
return json;
}
public static JSONObject fetchCatalogId(String section) {
if (section == null) return null;
if (section.isEmpty()) return null;
var request = new Request.a()
.b("https://api.vk.com/method/catalog.getAudio"
.b("https://" + getApi() + "/method/catalog.getAudio"
+ "?v=5.119"
+ "&https=1"
+ "&need_blocks=1"
@@ -565,7 +501,7 @@ public class JsonInjectors {
public static JSONObject fetchCatalogPodcast() {
var request = new Request.a()
.b("https://api.vk.com/method/catalog.getPodcasts"
.b("https://" + getApi() + "/method/catalog.getPodcasts"
+ "?v=5.119"
+ "&https=1"
+ "&need_blocks=1"
@@ -585,8 +521,8 @@ public class JsonInjectors {
return null;
}
public static JSONObject friends(JSONObject json) throws JSONException {
JSONObject catalog = json;
public static JSONObject friends(JSONObject json) throws JSONException, ParseException, IOException {
JSONObject catalog = onlineHookProfiles(json);
boolean sectionexecute = true;
boolean hasBirthday = false;
@@ -651,10 +587,7 @@ public class JsonInjectors {
return json;
}
public static boolean haveDonateButton() {
int randomshower = new Random().nextInt(6);
return hasVerification() || randomshower != 1;
return hasVerification() || new Random().nextInt(6) != 1;
}
}
@@ -2,6 +2,7 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.ui.dialogs.ServerDialog.sendRequest;
import static ru.vtosters.lite.utils.CacheUtils.getInstance;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters;
import static ru.vtosters.lite.utils.Preferences.checkupdates;
import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme;
import static ru.vtosters.lite.utils.ThemesUtils.setNeededTheme;
@@ -11,27 +12,29 @@ import android.os.Build;
import android.preference.PreferenceManager;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.concurrent.VTExecutors;
import ru.vtosters.lite.ui.dialogs.DisableBattery;
import ru.vtosters.lite.ui.dialogs.InstallGMS;
import ru.vtosters.lite.ui.dialogs.OTADialog;
import ru.vtosters.lite.ui.dialogs.ServerDialog;
import ru.vtosters.lite.ui.dialogs.Start;
import ru.vtosters.lite.utils.DeletedMessagesHandler;
public class MainActivityInjector {
public static void inject(Activity activity) {
setNeededTheme(activity);
ServerDialog.activity = activity;
sendRequest();
if (checkupdates()) OTADialog.checkUpdates(activity);
VTExecutors.getIoScheduler().a(DeletedMessagesHandler::reloadMessagesList); // ioScheduler
Start.alert(activity);
InstallGMS.alert(activity);
DisableBattery.alert(activity);
PreferenceManager.getDefaultSharedPreferences(activity)
.edit()
.putBoolean("isdark", isDarkTheme())
.commit();
getInstance().autoCleaningCache();
VTExecutors.getSlowTasksScheduler().a(() -> {
getInstance().autoCleaningCache();
}); // slowTasksScheduler
setupFilters();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannels.createChannels();
}
@@ -7,22 +7,23 @@ import static ru.vtosters.lite.utils.Preferences.autoalltranslate;
import static ru.vtosters.lite.utils.Preferences.autotranslate;
import static ru.vtosters.lite.utils.Preferences.savemsgsett;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import com.vk.api.internal.MethodCall;
import ru.vtosters.lite.translators.BaseTranslator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.regex.Pattern;
import ru.vtosters.lite.translators.BaseTranslator;
import ru.vtosters.lite.utils.LifecycleUtils;
public class MessagesHook {
public static String injectOwnText(String oldText) {
if (!autotranslate() || TextUtils.isEmpty(oldText))
return oldText;
var instance = BaseTranslator.getInstance();
var instance = BaseTranslator.getInstance();
return replaceMentions(oldText, instance);
}
@@ -45,7 +46,8 @@ public class MessagesHook {
var mentions = new ArrayList<String>();
while (matcher.find()) {
mentions.add(matcher.group());
matcher.appendReplacement(textBuff, "vtl_mention" + mentionsCount + ""); ++mentionsCount;
matcher.appendReplacement(textBuff, "vtl_mention" + mentionsCount + "");
++mentionsCount;
}
matcher.appendTail(textBuff);
@@ -60,7 +62,7 @@ public class MessagesHook {
matcherMentions.appendTail(retTextBuff);
return retTextBuff.toString();
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
return instance.getTranslation(oldText);
}
@@ -73,6 +75,14 @@ public class MessagesHook {
});
}
public static Context fixCTX(Context ctx) {
if (ctx == null) {
return LifecycleUtils.getCurrentActivity();
} else {
return ctx;
}
}
public static void injRequest(MethodCall.a req) {
var time = expireTime();
@@ -1,58 +1,31 @@
package ru.vtosters.lite.hooks;
import static java.lang.Long.MAX_VALUE;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.injectFiltersReposts;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isAds;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isAuthorRecommendations;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isFriendsRecommendations;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isGroupAds;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isMusicBlock;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isNewsBlock;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isPostRecommendations;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isRecomsGroup;
import static ru.vtosters.lite.utils.Preferences.ads;
import static ru.vtosters.lite.utils.Preferences.adsslider;
import static ru.vtosters.lite.utils.Preferences.authorsrecomm;
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.vkme;
import com.vk.core.preference.Preference;
import android.content.Context;
import android.os.PowerManager;
import org.json.JSONException;
import org.json.JSONObject;
import com.vk.core.preference.Preference;
import com.vtosters.lite.api.ExtendedCommunityProfile;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import ru.vtosters.lite.utils.AccountManagerUtils;
public class NewsfeedHook {
public static boolean injectFilters(JSONObject obj) throws JSONException {
if (getBoolValue("newadblock", true)) return true;
var optString = obj.optString("type", "");
if (isAds(optString) || isAuthorRecommendations(optString) || isPostRecommendations(optString) || isFriendsRecommendations(optString) || isRecomsGroup(optString) || isMusicBlock(optString) || isNewsBlock(optString)) {
return false;
}
optString = obj.optString("post_type", "");
if (isAds(optString) || isAuthorRecommendations(optString) || isPostRecommendations(optString) || isFriendsRecommendations(optString) || isMusicBlock(optString) || isNewsBlock(optString)) {
return false;
}
optString = obj.optString("filters", "");
if (isAds(optString) || isAuthorRecommendations(optString) || isPostRecommendations(optString) || isFriendsRecommendations(optString)) {
return false;
}
if (checkCopyright(obj)) return false;
if (isBadNews(obj.optString("text", ""))) return false;
if (checkCaption(obj)) return false;
if (isGroupAds(obj)) return false;
return !injectFiltersReposts(obj);
} // inject our filters to newsfeed, getpost and discover
public static long getUpdateNewsfeed(boolean refresh_timeout) {
if (vkme()) {
return MAX_VALUE;
@@ -73,4 +46,91 @@ public class NewsfeedHook {
}
return list;
}
public static String[] feedParams() {
HashSet<String> params = new HashSet<>();
params.add("post");
params.add("photo");
params.add("photo_tag");
if (!friendsrecomm()) {
params.add("friends_recomm");
}
if (!ads()) {
params.add("app_widget");
params.add("promo_button");
}
if (!authorsrecomm()) {
params.add("authors_rec");
}
return params.toArray(new String[0]);
}
public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet(
"whitelisted_filters_groups", Collections.emptySet()
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) {
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
var mutableAdsSet = new LinkedHashSet<>(getDefaultPrefs().getStringSet(
"whitelisted_filters_groups",
Collections.emptySet())
);
if (needWhitelist) {
mutableAdsSet.add(id);
} else {
mutableAdsSet.remove(id);
}
getDefaultPrefs().edit().putStringSet("whitelisted_filters_groups", mutableAdsSet).apply();
}
public static void setWhitelistedAd(ExtendedCommunityProfile eup, boolean needWhitelist) {
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
var mutableAdsSet = new LinkedHashSet<>(getDefaultPrefs().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()));
if (needWhitelist) {
mutableAdsSet.add(id);
} else {
mutableAdsSet.remove(id);
}
getDefaultPrefs().edit().putStringSet("whitelisted_ad_groups", mutableAdsSet).apply();
}
public static void adsParams(HashSet<String> hashSet) {
if (ads())
hashSet.add("ads_disabled");
hashSet.add("ads_app");
hashSet.add("ads_site");
hashSet.add("ads_post");
if (!adsslider())
hashSet.add("ads_app_slider");
hashSet.add("ads_site_slider");
hashSet.add("ads_app_video");
hashSet.add("ads_post_pretty_cards");
hashSet.add("ads_post_snippet_video");
}
public static boolean isPowerSaveMode() {
var pw = (PowerManager) getGlobalContext().getSystemService(Context.POWER_SERVICE);
return !getBoolValue("force_disable_psm", false) && pw.isPowerSaveMode();
}
}
@@ -1,14 +1,18 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfo;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfoUsers;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.getPrefsFromFile;
import static ru.vtosters.lite.utils.ProxyUtils.getApi;
import android.util.Log;
import com.vtosters.lite.R;
import org.json.JSONArray;
import org.json.JSONException;
@@ -17,6 +21,8 @@ import org.json.JSONObject;
import java.io.IOException;
import java.text.ParseException;
import ru.vtosters.lite.utils.AndroidUtils;
public class OnlineFormatterHook {
private static String AppName;
@@ -59,37 +65,37 @@ public class OnlineFormatterHook {
case 5027722:
return "VK Messenger (Desktop)";
case 6146827:
return "VK Мессенджер (Android)";
return AndroidUtils.getString(R.string.vk_messenger) + " (Android)"; // VK Мессенджер (Android)
case 6482950:
return "VK Мессенджер (iPhone)";
return AndroidUtils.getString(R.string.vk_messenger) + " (iPhone)"; // VK Мессенджер (iPhone)
case 6481715:
return "VK Мессенджер Dev (iPhone)";
return AndroidUtils.getString(R.string.vk_messenger) + " Dev (iPhone)"; // VK Мессенджер Dev (iPhone)
case 7799655:
return "VK Почта";
return AndroidUtils.getString(R.string.vk_mail_online); // VK Почта
case 7598572:
return "Сферум (Android)";
return AndroidUtils.getString(R.string.sferum_online) + " (Android)"; // Сферум (Android)
case 7571751:
return "Сферум (iPhone)";
return AndroidUtils.getString(R.string.sferum_online) + " (iPhone)"; // Сферум (iPhone)
case 7556576:
return "Сферум";
return AndroidUtils.getString(R.string.sferum_online); // Сферум
case 7497650:
return "VK ID";
case 8094476:
return "VK Звонки (Android)";
return AndroidUtils.getString(R.string.vk_calls_online) + " (Android)"; // VK Звонки (Android)
case 8093730:
return "VK Звонки (iPhone)";
return AndroidUtils.getString(R.string.vk_calls_online) + " (iPhone)"; // VK Звонки (iPhone)
case 7793118:
return "VK Звонки (Desktop)";
return AndroidUtils.getString(R.string.vk_calls_online) + " (Desktop)"; // VK Звонки (Desktop)
case 6767438:
return "VK Музыка (Android)";
return AndroidUtils.getString(R.string.vk_music_online) + " (Android)"; // VK Музыка (Android)
case 8113297:
return "VK Клипы (Android)";
return AndroidUtils.getString(R.string.vk_clips_online) + " (Android)"; // VK Клипы (Android)
case 8106428:
return "VK Клипы (iPhone)";
return AndroidUtils.getString(R.string.vk_clips_online) + " (iPhone)"; // VK Клипы (iPhone)
case 5044491:
return "Candy";
case 8114066:
return "VK Видео";
return AndroidUtils.getString(R.string.vk_video_online); // VK Видео
case 4894723:
return "Phoenix Lite";
case 4994316:
@@ -125,6 +131,12 @@ public class OnlineFormatterHook {
return "Miranda NG (bridge)";
case 8043814:
return "Quise";
case 7221936:
return "Вечный Online";
case 6892935:
return "VK Helper";
case 6248661:
return "MemeVoices for VK";
default:
return getAppNameFromOnline(appid);
}
@@ -162,17 +174,69 @@ public class OnlineFormatterHook {
if (appname == null) return null;
return getString("custom_online") + " " + appname;
return AndroidUtils.getString(R.string.custom_online) + " " + appname;
}
public static JSONObject onlineHook(JSONObject json, boolean isGlobalHook) throws ParseException, IOException, JSONException {
if (!getBoolValue("onlinefix", false)) return json;
public static JSONObject onlineHook(JSONObject json) throws ParseException, IOException, JSONException {
if (getBoolValue("onlinefix", false)) setOnlineInfo(json);
if (isGlobalHook && !getBoolValue("globalUsersOnline", false)) {
return json;
return json;
}
public static JSONArray onlineHookList(JSONArray jsonArr) throws ParseException, IOException, JSONException {
if (!getBoolValue("onlinefix", false)) return jsonArr;
try {
setOnlineInfoUsers(jsonArr);
} catch (Exception e) {
Log.e("onlineHookProfiles", e.getMessage());
}
setOnlineInfo(json);
return jsonArr;
}
public static JSONObject onlineHookProfiles(JSONObject json) throws ParseException, IOException, JSONException {
if (!getBoolValue("onlinefix", false)) return json;
try {
setOnlineInfoUsers(json.optJSONArray("profiles"));
} catch (Exception e) {
Log.e("onlineHookProfiles", e.getMessage());
}
return json;
}
public static JSONObject onlineHookItems(JSONObject json) throws ParseException, IOException, JSONException {
if (!getBoolValue("onlinefix", false)) return json;
try {
setOnlineInfoUsers(json.optJSONArray("items"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
return json;
}
public static JSONObject onlineHookRequestsAndRecommendations(JSONObject json) throws ParseException, IOException, JSONException {
if (!getBoolValue("onlinefix", false)) return json;
try {
setOnlineInfoUsers(json.optJSONObject("read_requests").optJSONArray("items"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
try {
setOnlineInfoUsers(json.optJSONObject("recommendations").optJSONArray("items"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
try {
setOnlineInfoUsers(json.optJSONArray("profiles"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
return json;
}
}
@@ -1,6 +1,5 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import android.annotation.SuppressLint;
@@ -15,10 +14,15 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.core.drawable.RecoloredDrawable;
import com.vk.core.util.ToastUtils;
import com.vk.dto.common.AttachmentWithMedia;
import com.vk.dto.common.ImageSize;
import com.vtosters.lite.R;
import com.vtosters.lite.attachments.DocumentAttachment;
import com.vtosters.lite.attachments.PhotoAttachment;
import org.json.JSONException;
@@ -26,6 +30,7 @@ import org.json.JSONObject;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
@@ -36,18 +41,53 @@ import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class PhotoViewer {
static OkHttpClient client = new OkHttpClient();
public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) {
if (item.getItemId() == AndroidUtils.getIdentifier("search_photo", "id")) {
searchPhoto(getUrlFromAttachment((PhotoAttachment) attachment));
if (item.getItemId() == R.id.search_photo) {
if (attachment instanceof PhotoAttachment) {
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
searchPhoto(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(R.string.photo_get_error);
}
else
ToastUtils.a(R.string.photo_get_error);
}
return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("copy_photo_url", "id")) {
copyPhotoUrl(getUrlFromAttachment((PhotoAttachment) attachment));
} else if (item.getItemId() == R.id.copy_photo_url) {
if (attachment instanceof PhotoAttachment) {
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(R.string.photo_get_error);
}
else
ToastUtils.a(R.string.photo_get_error);
}
return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("open_original_photo", "id")) {
openUrl(getUrlFromAttachment((PhotoAttachment) attachment));
} else if (item.getItemId() == R.id.open_original_photo) {
if (attachment instanceof PhotoAttachment) {
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
openUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(R.string.photo_get_error);
}
else
ToastUtils.a(R.string.photo_get_error);
}
return true;
}
return true;
@@ -55,41 +95,90 @@ public class PhotoViewer {
@SuppressLint("UseCompatLoadingForDrawables")
public static void addMenuItems(AttachmentWithMedia attachment, ActionsPopup.b actionPopup, int i, boolean z) {
actionPopup.a(getIdentifier("search_photo_content", "string"),
actionPopup.a(R.string.search_photo_content,
ThemesUtils.isDarkTheme()
? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28)
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()),
false,
() -> {
searchPhoto(getUrlFromAttachment((PhotoAttachment) attachment));
if (attachment instanceof PhotoAttachment) {
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
searchPhoto(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(R.string.photo_get_error);
}
else
ToastUtils.a(R.string.photo_get_error);
}
return null;
}
);
actionPopup.a(getIdentifier("copy_photo_url_content", "string"),
actionPopup.a(R.string.copy_photo_url_content,
!ThemesUtils.isDarkTheme()
? new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), ThemesUtils.getAccentColor())
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE),
false,
() -> {
copyPhotoUrl(getUrlFromAttachment((PhotoAttachment) attachment));
if (attachment instanceof PhotoAttachment) {
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(R.string.photo_get_error);
}
else
ToastUtils.a(R.string.photo_get_error);
}
return null;
}
);
actionPopup.a(getIdentifier("open_original_photo_content", "string"),
actionPopup.a(R.string.open_original_photo_content,
ThemesUtils.isDarkTheme()
? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28)
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28),
ThemesUtils.getAccentColor()),
false,
() -> {
openUrl(getUrlFromAttachment((PhotoAttachment) attachment));
if (attachment instanceof PhotoAttachment) {
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
openUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(R.string.photo_get_error);
}
else
ToastUtils.a(R.string.photo_get_error);
}
return null;
}
);
}
private static String getUrlFromAttachment(PhotoAttachment attachment) {
private static String getUrlFromDocumentAttachment(DocumentAttachment attachment) {
List<ImageSize> imageSizes = null;
if (attachment.J != null) {
imageSizes = attachment.J.t1();
}
return getUrlFromImageSizeList(imageSizes);
}
private static String getUrlFromPhotoAttachment(PhotoAttachment attachment) {
var imageSizes = attachment.D.Q.t1();
return getUrlFromImageSizeList(imageSizes);
}
@Nullable
private static String getUrlFromImageSizeList(List<ImageSize> imageSizes) {
if (imageSizes.isEmpty())
return null;
var max = imageSizes.get(0);
@@ -157,7 +246,7 @@ public class PhotoViewer {
if (url == null || url.isEmpty()) return;
ClipboardManager manager = (ClipboardManager) AndroidUtils.getGlobalContext().getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(ClipData.newPlainText("vk_photo_url", url));
Toast.makeText(AndroidUtils.getGlobalContext(), AndroidUtils.getIdentifier("copied_to_clipboard", "string"), Toast.LENGTH_SHORT).show();
Toast.makeText(AndroidUtils.getGlobalContext(), R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show();
}
private static void openUrl(String url) {
@@ -0,0 +1,83 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.Preferences.preferences;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import com.facebook.drawee.generic.RoundingParams;
import ru.vtosters.lite.utils.AndroidUtils;
public class PicRoundingHook {
private static final int pref = preferences.getInt("pic_rounding", 0);
public static RoundingParams inject() {
if (pref > 0) {
return customParams();
} else {
return new RoundingParams().a(true);
}
}
public static RoundingParams inject(float orig) {
if (pref > 0) {
return customParams();
} else {
return new RoundingParams().b(orig);
}
}
public static RoundingParams inject(float orig, float orig2, float orig3, float orig4) {
if (pref > 0) {
return new RoundingParams().a(AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref));
} else {
return new RoundingParams().a(orig, orig2, orig3, orig4);
}
}
public static void inject(float orig, Canvas canvas, Paint paint) {
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(orig, orig, orig, paint);
}
}
public static void inject(Canvas canvas, Paint paint, float orig) {
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(canvas.getClipBounds().exactCenterX(), canvas.getClipBounds().exactCenterY(), orig, paint);
}
}
public static void inject(Canvas canvas, float orig, float orig2, float orig3, Paint paint) {
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(orig, orig2, orig3, paint);
}
}
public static void inject(Bitmap bitmap, Bitmap bitmap2, Paint b2) {
Shader.TileMode tileMode = Shader.TileMode.CLAMP;
b2.setShader(new BitmapShader(bitmap2, tileMode, tileMode));
Canvas canvas = new Canvas(bitmap);
float width = bitmap2.getWidth() / 2;
if (pref > 0) {
canvas.drawRoundRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), b2);
} else {
canvas.drawCircle(width, width, width, b2);
}
}
private static RoundingParams customParams() {
return RoundingParams.b(AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref));
}
}
@@ -14,7 +14,8 @@ import ru.vtosters.lite.utils.Preferences;
public class PostViewHook {
/**
* For displaying child elements with custom direction in rtl container we should remove their, set layout direction and add again */
* For displaying child elements with custom direction in rtl container we should remove their, set layout direction and add again
*/
private static void saveChildDirectionForRlt(ViewGroup container) {
var children = new View[container.getChildCount()];
for (int i = 0; i < container.getChildCount(); i++) {
@@ -0,0 +1,9 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
public class PromoStickersHook {
public static String hook(){
return getBoolValue("promotedstickers", true) ? "purchased,active" : "purchased,active,promoted";
}
}
@@ -1,37 +1,34 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.proxy.ProxyUtils.isRandomProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isVikaProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isZaboronaEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import static ru.vtosters.lite.utils.ProxyUtils.apiproxy;
import static ru.vtosters.lite.utils.ProxyUtils.isZaboronaEnabled;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ContextThemeWrapper;
import com.vk.auth.ui.VkAuthTextView;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import ru.vtosters.lite.ui.fragments.ProxySettingsFragment;
public class ProxyHook {
public static void hookAuth(View v) {
VkAuthTextView button = (VkAuthTextView) v;
button.setText("Настроить прокси");
button.setText(R.string.proxy_setup);
button.setOnClickListener(v1 -> callProxyDialog(v1.getContext()));
}
@@ -40,97 +37,64 @@ public class ProxyHook {
RadioGroup rg = new RadioGroup(ctx);
RadioButton rgDefault = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton rgProxy = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton rgZaborona = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton rgRandomProxy = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton rgVika = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
rg.addView(rgDefault);
rg.addView(rgProxy);
rg.addView(rgVika);
rg.addView(rgZaborona);
rg.addView(rgRandomProxy);
rgDefault.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
rgProxy.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
rgZaborona.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
rgRandomProxy.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
rgVika.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
rgDefault.setText("Отключить");
rgDefault.setText(ctx.getString(R.string.proxy_disable));
rgDefault.setTextColor(getTextAttr());
rgProxy.setText("Включить (Zaborona)");
rgProxy.setTextColor(getTextAttr());
rgZaborona.setText(ctx.getString(R.string.proxy_enable) + " (Zaborona)");
rgZaborona.setTextColor(getTextAttr());
rgProxy.setChecked(isZaboronaEnabled());
rgDefault.setChecked(!isZaboronaEnabled());
rgRandomProxy.setText(ctx.getString(R.string.proxy_enable) + " (Random Socks Proxy)");
rgRandomProxy.setTextColor(getTextAttr());
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Прокси");
builder.setMessage("Zaborona никак не связана с ВТостерс и мы не можем гарантировать её работу и безопасность");
builder.setView(rg);
builder.setPositiveButton("Применить", ((dialog, which) -> {
if (rgProxy.isChecked()) {
edit().putString("proxy", "zaborona").commit();
restartApplication();
} else {
if (isZaboronaEnabled()) {
edit().putString("proxy", "noproxy").commit();
restartApplication();
}
rgVika.setText(ctx.getString(R.string.proxy_enable) + " (Vika Mobile)");
rgVika.setTextColor(getTextAttr());
edit().putString("proxy", "noproxy").commit();
}
}));
rgZaborona.setChecked(isZaboronaEnabled());
rgDefault.setChecked(!isZaboronaEnabled() && !isRandomProxyEnabled() && !isVikaProxyEnabled());
rgRandomProxy.setChecked(isRandomProxyEnabled());
rgVika.setChecked(isVikaProxyEnabled());
builder.setNeutralButton("Настройки прокси", ((dialog, which) -> {
Intent a2 = new Navigator(ProxySettingsFragment.class).b(ctx);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(a2);
}));
var alert = builder.create();
alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
alert.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(getAccentColor());
}
public static String linkReplacer(String link) {
var vkapi = "api.vk.com";
var oauth = "oauth.vk.com";
var vkstatic = "static.vk.com";
var proxyapi = getPrefsValue("proxyapi");
var proxyoauth = getPrefsValue("proxyoauth");
var proxystatic = getPrefsValue("proxystatic");
if (!apiproxy() || link.isEmpty()) {
return link;
}
if (proxyapi.isEmpty() || proxyoauth.isEmpty() || proxystatic.isEmpty()) {
Log.d("VTLite", "Proxy is not set" + " " + proxyapi + " " + proxyoauth + " " + proxystatic);
return link;
}
if (link.contains(vkapi)) {
return link.replace(proxyapi, vkapi);
}
if (link.contains(oauth)) {
return link.replace(proxyoauth, oauth);
}
if (link.contains(vkstatic)) {
return link.replace(proxystatic, vkstatic);
}
return link;
}
public static String getAwayPhpCom() {
var proxyapi = getPrefsValue("proxyapi");
if (apiproxy() & !proxyapi.isEmpty()) {
return proxyapi;
}
return "m.vk.com";
new VkAlertDialog.Builder(ctx)
.setTitle(ctx.getString(R.string.vtlproxy))
.setMessage(ctx.getString(R.string.proxy_warning))
.setView(rg)
.setPositiveButton(ctx.getString(R.string.vtl_confirm), ((dialog, which) -> { // Применить
if (rgZaborona.isChecked()) {
edit().putString("proxy", "zaborona").commit();
restartApplication();
} else if (rgRandomProxy.isChecked()) {
edit().putString("proxy", "randomproxy").commit();
restartApplication();
} else if (rgVika.isChecked()) {
edit().putString("proxy", "vika").commit();
restartApplication();
} else {
edit().putString("proxy", "noproxy").commit();
restartApplication();
}
}))
.setNeutralButton(ctx.getString(R.string.proxy_settings), ((dialog, which) -> {
var intent = new Navigator(ProxySettingsFragment.class)
.b(ctx)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(intent);
}))
.show();
}
}
@@ -0,0 +1,25 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import com.vk.im.engine.models.ProfilesSimpleInfo;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.engine.models.messages.NestedMsg;
import com.vk.im.ui.views.ReplyView;
public class ReplyMsgHook {
public static void injectWithDecrypt(ReplyView replyView, MsgFromUser msgFromUser, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool) {
msgFromUser.d(decryptMessage(msgFromUser)); // set new value of text in MsgFromUser class
replyView.a(msgFromUser, profilesSimpleInfo, someBool);
}
public static void injectWithDecrypt(ReplyView replyView, NestedMsg nestedMsg, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool) {
nestedMsg.d(decryptMessage(nestedMsg.f(), nestedMsg.t1())); // set new value of text in NestedMsg class
replyView.a(nestedMsg, profilesSimpleInfo, someBool);
}
public static void injectWithDecrypt(ReplyView replyView, NestedMsg nestedMsg, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool, int i) {
if ((i & 4) != 0) someBool = false;
injectWithDecrypt(replyView, nestedMsg, profilesSimpleInfo, someBool);
}
}
@@ -1,4 +1,5 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.Preferences.dev;
import android.util.Log;
@@ -7,10 +8,10 @@ import com.vk.api.internal.MethodCall;
import java.util.LinkedHashMap;
public class RequestDumper{
public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap params, String apiver) {
public class RequestDumper {
public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap<String, String> params, String apiver) {
if (method.contains("execute.getGiftByStickerId")) {
apiver = "5.187";
apiver = "5.186";
}
if (dev()) {
@@ -2,20 +2,17 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.ui.components.DockBarEditorManager.getInstance;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.milkshake;
import static ru.vtosters.lite.utils.Preferences.superapp;
import static ru.vtosters.lite.utils.Preferences.useNewSettings;
import static ru.vtosters.lite.utils.Preferences.videonewcatalog;
import static ru.vtosters.lite.utils.Preferences.vkme;
import com.vk.apps.AppsFragment;
import com.vk.discover.ThemedFeedFragment;
import com.vk.discover.DiscoverFragment;
import com.vk.fave.fragments.FaveTabFragment;
import com.vk.menu.MenuFragment;
import com.vk.menu.SearchMenuFragment;
import com.vk.music.fragment.MusicCatalogFragment1;
import com.vk.music.fragment.MusicFragment;
import com.vk.newsfeed.HomeFragment;
import com.vk.newsfeed.NewsfeedFragment;
import com.vk.notifications.NotificationsContainerFragment;
@@ -30,7 +27,6 @@ import com.vtosters.lite.fragments.p2.DocumentsViewFragment;
import com.vtosters.lite.fragments.s2.GroupsFragment1;
import com.vtosters.lite.fragments.t2.c.DialogsFragment;
import com.vtosters.lite.fragments.y2.VideoCatalogFragment;
import com.vtosters.lite.fragments.y2.VideosFragment;
import com.vtosters.lite.general.fragments.GamesFragment;
import com.vtosters.lite.general.fragments.PhotosFragment;
@@ -47,19 +43,19 @@ public class StartFragmentHook {
case "groups":
return milkshake() ? CommunitiesCatalogFragment.class : GroupsFragment1.class;
case "music":
return getBoolValue("musicnewcatalog", true) ? MusicCatalogFragment1.class : MusicFragment.class;
return MusicCatalogFragment1.class;
case "friends":
return FriendsFragment.class;
case "photos":
return PhotosFragment.class;
case "videos":
return videonewcatalog() ? VideoCatalogFragment.class : VideosFragment.class;
return VideoCatalogFragment.class;
case "settings":
return useNewSettings();
case "apps":
return AppsFragment.class;
case "discover":
return ThemedFeedFragment.class;
return DiscoverFragment.class;
case "notifications":
return NotificationsContainerFragment.class;
case "money":
@@ -4,7 +4,6 @@ import static ru.vtosters.lite.utils.Preferences.feedcache;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.milkshake;
import static ru.vtosters.lite.utils.Preferences.miniapps;
import static ru.vtosters.lite.utils.Preferences.musicnewcatalog;
import static ru.vtosters.lite.utils.Preferences.postsredesign;
import static ru.vtosters.lite.utils.Preferences.superapp;
@@ -133,8 +132,6 @@ public class TogglesHook {
case FEATURE_MILKSHAKE_FORCE_DISABLED:
case FEATURE_MILKSHAKE_ACTIVATION_DISABLED:
return !milkshake();
case FEATURE_MUSIC_NEW_CATALOG:
return musicnewcatalog();
case AB_NEWS_VIDEO_LAYOUT_TEXT:
case FEATURE_COMPACT_REPOST:
case EXPERIMENT_NEWS_VIDEO_LAYOUT_TEXT:
@@ -5,7 +5,6 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getAttrId;
import static ru.vtosters.lite.utils.ThemesUtils.getBackgroundContent;
import static ru.vtosters.lite.utils.ThemesUtils.getBackgroundPage;
import static ru.vtosters.lite.utils.ThemesUtils.getColorFromAttr;
@@ -17,6 +16,7 @@ import static ru.vtosters.lite.utils.ThemesUtils.hex;
import android.webkit.WebView;
import com.vk.articles.preload.WebCachePreloader;
import com.vtosters.lite.R;
import com.vtosters.lite.data.ThemeTracker;
import java.io.BufferedReader;
@@ -61,10 +61,10 @@ public class VKUIHook {
.replace("%header_text%", hex(getHeaderText()))
.replace("%accent%", hex(getAccentColor()))
.replace("%background_page%", hex(getBackgroundPage()))
.replace("%content_tint_background%", hex(getColorFromAttr(getAttrId("content_tint_background"))))
.replace("%button_primary_background%", hex(getColorFromAttr(getAttrId("button_primary_background"))))
.replace("%button_outline_foreground%", hex(getColorFromAttr(getAttrId("button_outline_foreground"))))
.replace("%button_outline_border%", hex(getColorFromAttr(getAttrId("button_outline_border"))))
.replace("%content_tint_background%", hex(getColorFromAttr(R.attr.content_tint_background)))
.replace("%button_primary_background%", hex(getColorFromAttr(R.attr.button_primary_background)))
.replace("%button_outline_foreground%", hex(getColorFromAttr(R.attr.button_outline_foreground)))
.replace("%button_outline_border%", hex(getColorFromAttr(R.attr.button_outline_border)))
.replace("%text_primary%", hex(getTextAttr()));
@@ -0,0 +1,17 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.Preferences.wbios;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.ThemesUtils;
public class WritebarHook {
public static int getWriteBar() {
return wbios() ? R.layout.write_bar_i : R.layout.write_bar;
}
public static int getIconsColors(int def) {
return wbios() ? ThemesUtils.getAccentColor() : def;
}
}
@@ -0,0 +1,268 @@
package ru.vtosters.lite.hooks.ui;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.asId;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.getInstance;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.isIntegrationEnabled;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.isVkxInstalled;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.lambdaplay;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.isCached;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.isVkxCached;
import static ru.vtosters.lite.utils.NetworkUtils.isNetworkConnected;
import static ru.vtosters.lite.utils.Preferences.milkshake;
import android.os.RemoteException;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import com.vk.music.bottomsheets.a.MusicAction;
import com.vk.music.common.MusicPlaybackLaunchContext;
import com.vtosters.lite.R;
import java.util.ArrayList;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl;
import ru.vtosters.lite.downloaders.AudioDownloader;
public class MusicBottomSheetHook {
public static ArrayList<MusicAction> hook(ArrayList<MusicAction> actions, MusicTrack musicTrack) {
if (musicTrack.F1()) return actions;
var trackid = asId(musicTrack);
if (isVkxInstalled()) {
actions.add(getPlayInVKXAction());
}
if (isIntegrationEnabled()) {
if (isVkxCached(trackid)) {
actions.add(getRemoveCacheTrackVkxAction());
} else {
actions.add(addToCacheTrackVkxAction());
}
}
if (isNetworkConnected()) {
actions.add(downloadAsMp3Action());
}
return actions;
}
public static ArrayList<MusicAction> hookDownloadBTN(ArrayList<MusicAction> actions, MusicTrack musicTrack) {
if (musicTrack.F1()) return actions;
var trackid = asId(musicTrack);
if (isCached(trackid)) {
actions.add(new MusicAction(
R.id.music_action_toggle_download,
milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24,
R.string.remove_from_cache,
musicTrack.F1() ? R.color.music_action_button_gray_50_alpha : R.color.caption_gray,
R.string.music_talkback_empty,
false
));
} else {
actions.add(new MusicAction(
R.id.music_action_toggle_download,
milkshake() ? R.drawable.ic_download_outline_28 : R.drawable.ic_download_24,
R.string.add_to_cache,
musicTrack.F1() ? R.color.music_action_button_gray_50_alpha : R.color.caption_gray,
R.string.music_talkback_empty,
false
));
}
return actions;
}
public static ArrayList<MusicAction> hook(ArrayList<MusicAction> actions, Playlist playlist) {
if (playlist.D) return actions;
if (isVkxInstalled()) actions.add(getPlayInVKXAction());
if (isIntegrationEnabled()) {
if (isVkxCached(playlist.a, playlist.b)) {
actions.add(getRemoveCacheTrackVkxAction());
} else {
actions.add(addToCacheTrackVkxAction());
}
} else {
actions.add(addToCacheTrackAction());
}
if (isNetworkConnected()) actions.add(downloadAsMp3Action());
return actions;
}
public static boolean injectOnClick(int actionId, MusicTrack track, MusicPlaybackLaunchContext context, Playlist playlist) { // musictrack inj
if (actionId == R.id.play_in_vkx)
return tryPlayInVKX(track, context, playlist);
if (actionId == R.id.remove_from_cache_vkx) {
getInstance().runOnService(service -> {
try {
service.deleteTrackFromCache(track.d, track.e);
} catch (RemoteException e) {
e.printStackTrace();
}
});
return true;
} else if (actionId == R.id.add_to_cache_vkx) {
getInstance().runOnService(service -> {
try {
service.addTrackToCache(track.d, track.e, (track.J != null) ? track.J : "");
} catch (RemoteException e) {
e.printStackTrace();
}
});
return true;
}
if (actionId == R.id.download_mp3) {
if (isIntegrationEnabled()) {
getInstance().runOnService(service -> {
try {
service.downloadTrack(track.d, track.e, (track.J != null) ? track.J : "");
} catch (RemoteException e) {
e.printStackTrace();
}
});
} else {
AudioDownloader.downloadAudio(track);
}
return true;
}
return false;
}
public static boolean injectOnClick(int actionId, Playlist playlist) { // playlist inj
if (actionId == R.id.play_in_vkx)
return tryPlayInVKX(null, null, playlist);
if (actionId == R.id.add_to_cache) {
AudioDownloader.cachePlaylist(playlist);
return true;
}
if (actionId == R.id.remove_from_cache_vkx) {
getInstance().runOnService(service -> {
try {
service.deletePlaylistFromCache(playlist.a, playlist.b);
} catch (RemoteException e) {
e.printStackTrace();
}
});
return true;
} else if (actionId == R.id.add_to_cache_vkx) {
getInstance().runOnService(service -> {
try {
service.addPlaylistToCache(playlist.a, playlist.b, (playlist.Q != null) ? playlist.Q : "");
} catch (RemoteException e) {
e.printStackTrace();
}
});
return true;
}
if (actionId == R.id.download_mp3) {
if (isIntegrationEnabled()) {
getInstance().runOnService(service -> {
try {
service.downloadPlaylist(playlist.a, playlist.b, (playlist.Q != null) ? playlist.Q : "");
} catch (RemoteException e) {
e.printStackTrace();
}
});
} else {
AudioDownloader.downloadPlaylist(playlist);
}
return true;
}
return false;
}
public static boolean tryPlayInVKX(MusicTrack track, MusicPlaybackLaunchContext context, Playlist playlist) {
var trackList = new ArrayList<MusicTrack>();
if (playlist != null) {
trackList.addAll(playlist.R);
} else {
trackList.add(track);
}
LibVKXClientImpl.LibVKXAction action = iLibVkxService -> lambdaplay(trackList, track, iLibVkxService, context);
return getInstance().runOnService(action);
}
private static MusicAction getPlayInVKXAction() {
return new MusicAction(
R.id.play_in_vkx,
milkshake() ? R.drawable.ic_music_outline_24 : R.drawable.ic_music_24,
R.string.play_in_vkx,
R.color.caption_gray,
R.string.music_talkback_empty,
false
);
}
private static MusicAction getRemoveCacheTrackAction() {
return new MusicAction(
R.id.remove_from_cache,
milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24,
R.string.remove_from_cache,
R.color.caption_gray,
R.string.music_talkback_empty,
false
);
}
private static MusicAction addToCacheTrackAction() {
return new MusicAction(
R.id.add_to_cache,
milkshake() ? R.drawable.ic_add_outline_28 : R.drawable.ic_add_24,
R.string.add_to_cache,
R.color.caption_gray,
R.string.music_talkback_empty,
false
);
}
private static MusicAction getRemoveCacheTrackVkxAction() {
return new MusicAction(
R.id.remove_from_cache_vkx,
milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24,
R.string.remove_from_cache_vkx,
R.color.caption_gray,
R.string.music_talkback_empty,
false
);
}
private static MusicAction addToCacheTrackVkxAction() {
return new MusicAction(
R.id.add_to_cache_vkx,
milkshake() ? R.drawable.ic_add_outline_28 : R.drawable.ic_add_24,
R.string.add_to_cache_vkx,
R.color.caption_gray,
R.string.music_talkback_empty,
false
);
}
private static MusicAction downloadAsMp3Action() {
return new MusicAction(
R.id.download_mp3,
milkshake() ? R.drawable.ic_download_outline_28 : R.drawable.ic_download_24,
R.string.download_mp3,
R.color.caption_gray,
R.string.music_talkback_empty,
false
);
}
}
@@ -0,0 +1,31 @@
package ru.vtosters.lite.hooks.ui;
import android.content.res.Configuration;
import com.vk.core.ui.themes.VKTheme;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.lite.utils.ThemesUtils;
public class SystemThemeChangerHook {
private static int sPrevUiMode = 0;
public static void onThemeChanged(Configuration configuration) {
if (Preferences.systemtheme()) {
var uiMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (uiMode == sPrevUiMode) return;
VKTheme theme = null;
if (uiMode == Configuration.UI_MODE_NIGHT_YES)
theme = ThemesUtils.getDarkTheme();
else if (uiMode == Configuration.UI_MODE_NIGHT_UNDEFINED
|| uiMode == Configuration.UI_MODE_NIGHT_NO)
theme = ThemesUtils.getLightTheme();
if (theme != null) {
ThemesUtils.applyTheme(theme);
sPrevUiMode = uiMode;
}
}
}
}
@@ -0,0 +1,220 @@
package ru.vtosters.lite.music;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
public class LastFMScrobbler {
private static final String KEY = "5965d63402414776c54c266db0211746";
private static final String KEY_SECRET = "d982180eed13275bb948e41cf225f88f";
private static final String URL = "https://ws.audioscrobbler.com/2.0/";
private static final OkHttpClient CLIENT = new OkHttpClient();
private static final List<String> SCROBBLED_UUIDS = new ArrayList<>();
public static void grabMusicTrack(MusicTrack musictrack) {
var uid = musictrack.y1();
var artist = musictrack.C;
var title = musictrack.f;
var duration = musictrack.h;
var track_id = musictrack.d;
var owner_id = musictrack.e;
var access_key = !TextUtils.isEmpty(musictrack.J) ? musictrack.J : "";
var album_id = musictrack.I;
var album = album_id != null ? album_id.getTitle() : null;
if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) {
Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid);
return;
}
if (Preferences.autocache() && !CacheDatabaseDelegate.isCached(uid)) {
if (LibVKXClient.isIntegrationEnabled()){
LibVKXClient.getInstance().runOnService(service -> {
try {
service.addTrackToCache(track_id, owner_id, access_key);
} catch (RemoteException e) {
e.printStackTrace();
}
});
} else {
AudioDownloader.cacheTrack(musictrack);
}
}
scrobbleTrack(duration, artist, title, uid, album);
}
public static void scrobbleTrack(
long duration,
String artist,
String title,
String uid,
@Nullable String album
) {
Log.d("Scrobbler", "scrobbleTrack: " + title + " - " + artist + " - " + duration + " - " + uid);
if (!needScrobbling(uid) || !isLoggedIn() || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0)
return;
SCROBBLED_UUIDS.add(uid);
var params = new TreeMap<String, String>();
params.put("api_key", KEY);
params.put("method", "track.scrobble");
params.put("sk", getSessionKey());
params.put("artist[0]", artist);
params.put("track[0]", title);
if (!TextUtils.isEmpty(album))
params.put("album[0]", album);
params.put("duration[0]", String.valueOf(duration));
params.put("timestamp[0]", String.valueOf(System.currentTimeMillis() / 1000));
fetch(params, new Callback() {
@Override
public void a(Call call, IOException e) {
Log.d("Scrobbler", e+"");
}
@Override
public void a(Call call, Response response) throws IOException {
Log.d("Scrobbler", "Scrobbled: " + artist + " - " + title);
Log.d("Scrobbler", "Response scrobble: " + response.a().g());
}
});
}
public static void authenticate(String username, String password) {
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
AndroidUtils.sendToast(AndroidUtils.getString(R.string.lastfm_credentials_empty));
return;
}
var params = new TreeMap<String, String>();
params.put("api_key", KEY);
params.put("method", "auth.getMobileSession");
params.put("username", username);
params.put("password", password);
fetch(params, new Callback() {
@Override
public void a(Call call, IOException e) {
Log.d("Scrobbler", "Auth failed", e);
AndroidUtils.sendToast(AndroidUtils.getString(R.string.auth_error_vtl));
}
@Override
public void a(Call call, Response response) throws IOException {
try {
var resBody = response.a().g();
var json = new JSONObject(resBody);
fetchSession(json);
Log.d("Scrobbler", "Auth response " + resBody);
} catch (JSONException e) {
Log.d("Scrobbler", "Auth failed", e);
}
}
});
}
private static String generateMD5(Map<String, String> params) {
var sb = new StringBuilder();
for (var entry : params.entrySet())
sb.append(entry.getKey()).append(entry.getValue());
return AndroidUtils.MD5(sb.append(KEY_SECRET).toString());
}
private static void fetch(TreeMap<String, String> params, Callback callback) {
// Each call must be signed with md5.
// For more information check https://www.last.fm/api
params.put("api_sig", generateMD5(params));
params.put("format", "json");
var reqBodyBuilder = new FormBody.a(StandardCharsets.UTF_8);
for (var entry : params.entrySet())
reqBodyBuilder.a(entry.getKey(), entry.getValue());
var req = new Request.a()
.b(URL)
.a(reqBodyBuilder.a())
.a();
CLIENT.a(req).a(callback);
}
public static void fetchSession(JSONObject json) throws JSONException {
if (!json.has("session")) {
Log.d("Scrobbler", "Auth failed - no session");
return;
}
var session = json.getJSONObject("session");
var name = session.getString("name");
var key = session.getString("key");
AndroidUtils.edit()
.putString("username", name)
.putString("sessionKey", key)
.putBoolean("lastfm_enabled", true)
.apply();
Log.d("Scrobbler", "Auth success as " + name + ", key " + key);
}
public static void logout() {
AndroidUtils.edit()
.remove("username")
.remove("sessionKey")
.putBoolean("lastfm_enabled", false)
.apply();
SCROBBLED_UUIDS.clear();
AndroidUtils.sendToast(AndroidUtils.getString(R.string.lastfm_logout_success));
}
public static boolean needScrobbling(String uid) {
return isLoggedIn() && isScrobblingEnabled() && (SCROBBLED_UUIDS.isEmpty() || !SCROBBLED_UUIDS.get(SCROBBLED_UUIDS.size() - 1).contains(uid));
}
public static boolean isLoggedIn() {
return !TextUtils.isEmpty(getSessionKey());
}
public static boolean isScrobblingEnabled() {
return AndroidUtils.getPreferences().getBoolean("lastfm_enabled", false);
}
public static String getUserName() {
return AndroidUtils.getDefaultPrefs().getString("username", null);
}
private static String getSessionKey() {
return AndroidUtils.getDefaultPrefs().getString("sessionKey", null);
}
}
@@ -1,6 +1,6 @@
package ru.vtosters.lite.music;
import android.util.Log;
import com.vk.dto.music.MusicTrack;
import java.io.File;
import java.io.IOException;
@@ -8,63 +8,108 @@ import java.io.InputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.crypto.NoSuchPaddingException;
import okhttp3.Call;
import java8.util.concurrent.CompletableFuture;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import ru.vtosters.lite.music.converter.ts.FFMpeg;
import ru.vtosters.lite.music.converter.ts.TSMerger;
import ru.vtosters.lite.music.downloader.ThumbnailDownloader;
import ru.vtosters.lite.music.interfaces.ITrackDownloader;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
public class M3UDownloader {
public class M3UDownloader implements ITrackDownloader {
private static final OkHttpClient client = new OkHttpClient();
private static OkHttpClient client = new OkHttpClient();
public static void execute(String url, File outDir, Callback callback) {
var request = new Request.a()
.b(url)
.a();
client.a(request).a(new okhttp3.Callback() {
@Override
public void a(Call call, IOException e) {
}
@Override
public void a(Call call, Response response) throws IOException {
parse(response.a().g(), outDir, callback);
}
});
public static M3UDownloader getInstance() {
return Holder.INSTANCE;
}
private static void parse(String payload, File outDir, Callback callback) {
public void downloadTrack(MusicTrack track, File outDir, Callback callback, boolean cache) {
var request = new Request.a().b(track.D).a();
try {
VKM3UParser parser = new VKM3UParser(payload);
List<TransportStream> tses = parser.getTransportStreams();
callback.onProgress(5);
for (TransportStream ts : tses) {
String tsURL = parser.getBaseUrl() + ts.getName();
Log.d("M3UDownloader", "Downloading " + tsURL);
InputStream is = IOUtils.openStream(tsURL);
byte[] content;
if (TransportStream.METHOD_AES128.equals(ts.getMethod())) {
String key = IOUtils.readAllLines(IOUtils.openStream(ts.getKeyURL()));
content = IOUtils.decodeStream(is, key);
} else {
content = IOUtils.readAllBytes(is);
}
File tsDump = new File(outDir, ts.getName());
IOUtils.writeToFile(tsDump, content);
callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize());
callback.onProgress(10 + Math.round(80.0f * tses.indexOf(ts) / tses.size()));
}
} catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) {
var response = client.a(request).execute().a().g();
parse(response, outDir, callback, track, cache);
} catch (IOException e) {
e.printStackTrace();
callback.onFailure();
return;
}
callback.onSuccess();
}
private void parse(String payload, File outDir, Callback callback, MusicTrack track, boolean cache) {
if (cache) try {
ThumbnailDownloader.downloadThumbnails(track);
} catch (IOException e) {
e.printStackTrace();
}
VKM3UParser parser = new VKM3UParser(payload);
List<TransportStream> tses = parser.getTransportStreams();
AtomicInteger progress = new AtomicInteger(0);
List<CompletableFuture<Void>> futures = new ArrayList<>(tses.size());
var filesDir = AndroidUtils.getGlobalContext().getFilesDir();
var tsesDir = new File(filesDir, String.valueOf(track.d));
tsesDir.mkdirs();
var resultTs = new File(tsesDir, "result.ts");
String title = null;
if (track.f != null) {
title = track.f;
if (!track.g.isEmpty()) {
title += " (" + track.g + ")";
}
}
var fileName = IOUtils.getValidFileName((cache ? "track" : track.C + " - " + title) + ".mp3");
var resultMp3 = new File(outDir, fileName);
callback.onProgress(5);
for (TransportStream ts : tses) {
String tsURL = parser.getBaseUrl() + ts.getName();
futures.add(CompletableFuture.runAsync(() -> {
try {
InputStream is = IOUtils.openStream(tsURL);
byte[] content;
if (TransportStream.METHOD_AES128.equals(ts.getMethod())) {
String key = IOUtils.readAllLines(IOUtils.openStream(ts.getKeyURL()));
content = IOUtils.decodeStream(is, key);
} else {
content = IOUtils.readAllBytes(is);
}
File tsDump = new File(tsesDir, ts.getName());
IOUtils.writeToFile(tsDump, content);
callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size()));
callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize());
} catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) {
callback.onFailure();
throw new RuntimeException(e);
}
}));
}
var future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
future.join();
future.exceptionally(throwable -> {
callback.onFailure();
return null;
}).thenApply(v -> TSMerger.merge(tsesDir, resultTs)).thenApply(mergeResult -> mergeResult && FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track)).thenApply(convertResult -> {
if (convertResult)
callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size()));
else callback.onFailure();
return convertResult;
}).thenRun(() -> IOUtils.deleteRecursive(tsesDir)).thenRun(callback::onSuccess);
}
// Initialization-on-demand
private static class Holder {
private static final M3UDownloader INSTANCE = new M3UDownloader();
}
}
@@ -1,83 +1,76 @@
package ru.vtosters.lite.music;
import android.app.DownloadManager;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import com.vk.dto.music.MusicTrack;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.utils.AndroidUtils;
public class MP3Downloader {
private static final String URL_FORMAT = "https://api.vk.com/method/audio.getById?v=5.131&access_token=%s&audios=%s&copyright=https://vtosters.app/";
private static final OkHttpClient client = new OkHttpClient();
public static void execute(MusicTrack track) {
var token = AndroidUtils.getPreferences().getString("vk_admin_token", "");
if (token.isEmpty()) {
Toast.makeText(AndroidUtils.getGlobalContext(), "Обновите токен VK Admin в настройках", Toast.LENGTH_SHORT).show();
return;
}
var request = new Request.a()
.b(String.format(URL_FORMAT, token, track.y1()))
.a();
client.a(request).a(new Callback() {
@Override
public void a(Call call, IOException e) {
Log.d("MP3Downloader", e + "");
}
@Override
public void a(Call call, Response response) throws IOException {
var payload = response.a().g();
Log.d("MP3Downloader", payload);
try {
JSONObject jsonObj = new JSONObject(payload);
if (jsonObj.has("response")) {
JSONObject responseNode = new JSONObject(payload).getJSONArray("response")
.getJSONObject(0);
if (responseNode.has("url")) {
var url = responseNode.optString("url");
Log.d("MP3Downloader", url);
if (url != null) {
if (url.endsWith(".mp3")) {
downloadMP3(track.toString(), url);
} else if (VKM3UParser.isM3U8(url)) {
AudioDownloader.downloadM3U8(track);
}
}
}
}
} catch (JSONException e) {
Log.d("MP3Downloader", e + "");
}
}
});
}
private static void downloadMP3(String title, String url) {
var downloadManager = AndroidUtils.getGlobalContext().getSystemService(DownloadManager.class);
var request = new DownloadManager.Request(Uri.parse(url))
.setAllowedOverRoaming(true)
.setTitle("Downloading " + title)
.setDestinationInExternalFilesDir(AndroidUtils.getGlobalContext(),
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(),
title + ".mp3")
.setVisibleInDownloadsUi(true);
downloadManager.enqueue(request);
}
}
//package ru.vtosters.lite.music;
//
//import android.text.TextUtils;
//import android.util.Log;
//import android.widget.Toast;
//
//import com.vk.dto.music.MusicTrack;
//
//import org.json.JSONException;
//import org.json.JSONObject;
//
//import java.io.File;
//import java.io.IOException;
//
//import okhttp3.Call;
//import okhttp3.Callback;
//import okhttp3.OkHttpClient;
//import okhttp3.Request;
//import okhttp3.Response;
//import ru.vtosters.lite.downloaders.AudioDownloader;
//import ru.vtosters.lite.music.interfaces.ITrackDownloader;
//import ru.vtosters.lite.utils.AndroidUtils;
//
//public class MP3Downloader implements ITrackDownloader {
// private static final String URL_FORMAT = "https://api.vk.com/method/audio.getById?v=5.131&access_token=%s&audios=%s&copyright=";
//
// private static final OkHttpClient client = new OkHttpClient();
//
// public static void downloadMP3(MusicTrack track) {
// var token = AndroidUtils.getPreferences().getString("vk_admin_token", "");
// if (token.isEmpty()) {
// Toast.makeText(AndroidUtils.getGlobalContext(), "Обновите токен VK Admin в настройках", Toast.LENGTH_SHORT).show();
// return;
// }
//
// var request = new Request.a()
// .b(String.format(URL_FORMAT, token, track.y1()))
// .a();
// client.a(request).a(new Callback() {
// @Override
// public void a(Call call, IOException e) {
// Log.d("MP3Downloader", e + "");
// }
//
// @Override
// public void a(Call call, Response response) throws IOException {
// var payload = response.a().g();
// Log.d("MP3Downloader", payload);
// try {
// JSONObject jsonObj = new JSONObject(payload);
// if (!jsonObj.has("response"))
// return;
// JSONObject responseNode = new JSONObject(payload).getJSONArray("response")
// .getJSONObject(0);
// if (!responseNode.has("url"))
// return;
// var url = responseNode.optString("url");
// Log.d("MP3Downloader", url);
// if (TextUtils.isEmpty(url))
// return;
// if (VKM3UParser.isM3U8(url)) {
// AudioDownloader.downloadM3U8(track);
// return;
// }
// } catch (JSONException e) {
// Log.d("MP3Downloader", e + "");
// }
// }
// });
// }
//
// @Override
// public void downloadTrack(String url, File outDir, ru.vtosters.lite.music.Callback callback) {
//
// }
//}
@@ -1,176 +0,0 @@
package ru.vtosters.lite.music;
import static java.lang.String.valueOf;
import static ru.vtosters.lite.utils.AndroidUtils.MD5;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.util.Log;
import com.vk.dto.music.MusicTrack;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import ru.vtosters.lite.net.NetCall;
import ru.vtosters.lite.net.NetCallback;
import ru.vtosters.lite.net.NetClient;
import ru.vtosters.lite.net.NetRequest;
import ru.vtosters.lite.net.NetResponse;
public class Scrobbler {
private static final String key = "5965d63402414776c54c266db0211746";
private static final String keysecret = "d982180eed13275bb948e41cf225f88f";
private static final String url = "https://ws.audioscrobbler.com/2.0/";
private static final NetClient client = new NetClient.Builder().build();
private static final ArrayList<String> scrobbled = new ArrayList<>();
public static void scrobbleTrack(long duration, String artist, String title, String uid) {
var string = getDefaultPrefs().getString("sessionKey", null);
var timestamp = System.currentTimeMillis() / 1000;
Log.d("Scrobbler", "scrobbleTrack: " + title + " - " + artist + " - " + duration + " - " + uid);
if (!needToBeScrobble(uid) ||
string == null ||
string.isEmpty() ||
artist == null ||
artist.isEmpty() ||
title == null ||
title.isEmpty() ||
duration == 0) return;
scrobbled.add(uid); // add to scrobbled list
TreeMap<String, String> treeMap = new TreeMap<>(); // create map for request
treeMap.put("method", "track.scrobble");
treeMap.put("sk", string);
treeMap.put("artist[0]", artist);
treeMap.put("track[0]", title);
treeMap.put("timestamp[0]", valueOf(timestamp));
treeMap.put("api_key", key);
treeMap.put("duration[0]", valueOf(duration));
treeMap.put("api_sig", signMD5(treeMap));
treeMap.put("format", "json");
client.newCall(new NetRequest.Builder().url(url).post().params(treeMap).build()).enqueue(new NetCallback() {
@Override
public void onFailure(NetCall call, IOException e) {
Log.d("Scrobbler", "Error: " + e.getMessage());
}
@Override
public void onResponse(NetCall call, NetResponse response) {
Log.d("Scrobbler", "Scrobbled: " + artist + " - " + title);
Log.d("Scrobbler", "Response scrobble: " + response.getDataString());
}
});
}
public static void grabMusicTrack(MusicTrack musictrack) {
var uid = musictrack.y1();
var artist = musictrack.C;
var title = musictrack.f;
var duration = musictrack.h;
if (uid.isEmpty() || artist == null || artist.isEmpty() || title == null || title.isEmpty() || duration == 0) {
Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid);
return;
}
scrobbleTrack(duration, artist, title, uid);
}
private static String signMD5(Map<String, String> map) {
var sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
sb.append(entry.getKey());
sb.append(entry.getValue());
}
sb.append(keysecret);
return MD5(sb.toString());
}
public static void auth(String login, String pass) {
if (login == null || pass == null) {
sendToast("Логин или пароль не заданы");
return;
}
TreeMap<String, String> treeMap = new TreeMap<>(); // create map for request
treeMap.put("method", "auth.getMobileSession");
treeMap.put("api_key", key);
treeMap.put("username", login);
treeMap.put("password", pass);
treeMap.put("api_sig", signMD5(treeMap));
treeMap.put("format", "json");
client.newCall(new NetRequest.Builder().url(url).post().params(treeMap).build()).enqueue(new NetCallback() {
@Override
public void onFailure(NetCall call, IOException e) {
Log.d("Scrobbler", "Auth failed", e);
sendToast("Ошибка входа");
}
@Override
public void onResponse(NetCall call, NetResponse response) {
try {
var jSONObject = new JSONObject(response.getDataString());
sessionFetcher(jSONObject);
Log.d("Scrobbler", "Auth response " + response.getDataString());
} catch (JSONException e) {
Log.d("Scrobbler", "Auth failed", e);
}
}
});
}
public static void sessionFetcher(JSONObject jsonObject) throws JSONException {
if (!jsonObject.has("session")) {
Log.d("Scrobbler", "Auth failed - no session");
return;
}
var session = jsonObject.getJSONObject("session");
var name = session.getString("name");
var key = session.getString("key");
getDefaultPrefs().edit().putString("username", name).
putString("sessionKey", key).apply();
Log.d("Scrobbler", "Auth success as " + name + ", key " + key);
}
public static void logout() {
edit().remove("username").apply();
edit().remove("sessionKey").apply();
scrobbled.clear();
sendToast("Вы успешно вышли из учетной записи");
}
public static boolean needToBeScrobble(String uid) {
return isLoggedIn() && isScrobblingEnabled() && !scrobbled.contains(uid);
}
public static boolean isLoggedIn() {
return getDefaultPrefs().getString("sessionKey", null) != null;
}
public static boolean isScrobblingEnabled() {
return getPreferences().getBoolean("lastfm_enabled", false);
}
public static String getUserName() {
return getDefaultPrefs().getString("username", null);
}
}
@@ -18,6 +18,10 @@ public class VKM3UParser {
init();
}
public static boolean isM3U8(String str) {
return str.endsWith(".ts") || str.endsWith(".tp") || str.endsWith(".mpeg-ts") || str.endsWith(".m2ts");
}
private void init() {
int i = 0;
Scanner scanner = new Scanner(mData);
@@ -51,10 +55,6 @@ public class VKM3UParser {
return directive.substring(directive.indexOf(":") + 1);
}
public static boolean isM3U8(String str) {
return str.endsWith(".ts") || str.endsWith(".tp") || str.endsWith(".mpeg-ts") || str.endsWith(".m2ts");
}
public int getHeapSize() {
return mHeapSize;
}
@@ -0,0 +1,347 @@
package ru.vtosters.lite.music.cache;
import static ru.vtosters.lite.music.cache.FileCacheImplementation.getCacheDir;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.IOUtils.deleteRecursive;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.RemoteException;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.vk.core.util.ToastUtils;
import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import org.json.JSONObject;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import bruhcollective.itaysonlab.libvkx.ILibVkxService;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl;
import ru.vtosters.lite.utils.AndroidUtils;
public class CacheDatabaseDelegate {
private static final int DB_VERSION = 0x1;
private static final String DB_NAME = "vt_lite_cache.db";
private static final String TABLE_NAME = "tracks";
private static final String COLUMN_ID = "id";
private static final String COLUMN_TRACK_ID = "trackId";
private static final String COLUMN_ALBUM_ID = "albumId";
private static final String COLUMN_TITLE = "title";
private static final String COLUMN_SUBTITLE = "subtitle";
private static final String COLUMN_ARTIST = "artist";
private static final String COLUMN_ALBUM_TITLE = "albumTitle";
private static final String COLUMN_EXPLICIT = "explicit";
private static final String COLUMN_HAS_ARTWORK = "hasArtwork";
private static final String COLUMN_DURATION = "duration";
private static DbHelper helperInstance;
protected static DbHelper getHelper() {
if (helperInstance == null) helperInstance = new DbHelper(getGlobalContext());
return helperInstance;
}
// You MUST call this method ONLY AFTER TRACK IS DOWNLOADED!
public static void insertTrack(MusicTrack track) {
try {
var json = track.J();
var albumNode = json.optJSONObject("album");
var hasArtwork = false;
var albumId = -1;
var albumName = "";
if (albumNode != null) {
hasArtwork = albumNode.has("thumb");
albumId = albumNode.getInt("id");
albumName = albumNode.getString("title");
}
var formula = String.format(
"INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES ('%s', %s, '%s', '%s', '%s', '%s', %s, %s, %s)",
TABLE_NAME,
COLUMN_TRACK_ID, COLUMN_ALBUM_ID, COLUMN_TITLE, COLUMN_SUBTITLE, COLUMN_ARTIST, COLUMN_ALBUM_TITLE, COLUMN_EXPLICIT, COLUMN_DURATION, COLUMN_HAS_ARTWORK,
track.y1(),
albumId,
URLEncoder.encode(json.getString("title"), "UTF-8"),
URLEncoder.encode(json.optString("subtitle"), "UTF-8"),
URLEncoder.encode(json.getString("artist"), "UTF-8"),
URLEncoder.encode(albumName, "UTF-8"),
json.optInt("is_explicit"),
json.getInt("duration"),
hasArtwork ? 1 : 0
);
getHelper().getReadableDatabase().execSQL(formula);
} catch (Exception e) {
e.printStackTrace();
ToastUtils.a(AndroidUtils.getString(R.string.track_bd_insert_err) + " [" + e.getMessage() + "]", true);
}
}
public static void insertTracks(List<MusicTrack> tracks) {
for (var track : tracks) insertTrack(track);
}
public static void clear() {
getHelper().getReadableDatabase().execSQL(String.format("DELETE FROM %s", TABLE_NAME));
deleteRecursive(getCacheDir());
sendToast(AndroidUtils.getString(R.string.cached_tracks_deleted));
}
@NonNull
private static JSONObject reconstructFromDb(Cursor cursor) {
try {
var trackId = cursor.getString(getColumnIndex(cursor, COLUMN_TRACK_ID));
var splits = trackId.split("_");
var id = Integer.parseInt(splits[1]);
var ownerId = Integer.parseInt(splits[0]);
return new JSONObject()
.put("url", FileCacheImplementation.getServerPath())
.put("id", id)
.put("owner_id", ownerId)
.put("title", URLDecoder.decode(cursor.getString(getColumnIndex(cursor, COLUMN_TITLE)), "UTF-8"))
.put("subtitle", URLDecoder.decode(cursor.getString(getColumnIndex(cursor, COLUMN_SUBTITLE)), "UTF-8"))
.put("artist", URLDecoder.decode(cursor.getString(getColumnIndex(cursor, COLUMN_ARTIST)), "UTF-8"))
.put("duration", cursor.getInt(getColumnIndex(cursor, COLUMN_DURATION)))
.put("is_explicit", cursor.getInt(getColumnIndex(cursor, COLUMN_EXPLICIT)))
.put("access_key", 2281488)
.putOpt("album", reconstructAlbumFromDb(cursor, trackId));
} catch (Exception e) {
e.printStackTrace();
return new JSONObject();
}
}
@Nullable
private static JSONObject reconstructAlbumFromDb(Cursor cursor, String trackId) {
try {
if (!FileCacheImplementation.getTrackThumbnail(trackId, 300).exists()
&& !FileCacheImplementation.getTrackThumbnail(trackId, 600).exists()
&& !FileCacheImplementation.getTrackThumbnail(trackId, 1200).exists()
) {
var ownerId = Integer.parseInt(trackId.split("_")[1]);
return new JSONObject()
.put("id", cursor.getInt(getColumnIndex(cursor, COLUMN_ALBUM_ID)))
.put("owner_id", ownerId)
.put("title", URLDecoder.decode(cursor.getString(getColumnIndex(cursor, COLUMN_ALBUM_TITLE)), "UTF-8"))
.putOpt("thumb", reconstructAlbumThumbFromDb(cursor, trackId));
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Nullable
private static JSONObject reconstructAlbumThumbFromDb(Cursor cursor, String trackId) {
try {
if (cursor.getInt(getColumnIndex(cursor, COLUMN_HAS_ARTWORK)) != 0)
new JSONObject()
.put("height", 600)
.put("width", 600)
.putOpt("photo_300", FileCacheImplementation.getFileUri(FileCacheImplementation.getTrackThumbnail(trackId, 300)))
.putOpt("photo_600", FileCacheImplementation.getFileUri(FileCacheImplementation.getTrackThumbnail(trackId, 600)))
.putOpt("photo_1200", FileCacheImplementation.getFileUri(FileCacheImplementation.getTrackThumbnail(trackId, 1200)));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static int getColumnIndex(Cursor cursor, String name) {
return cursor.getColumnIndexOrThrow(name);
}
public static boolean hasTracks() {
if (LibVKXClient.isIntegrationEnabled()) {
return true;
}
var formula = String.format(
"SELECT COUNT(%s) FROM %s",
COLUMN_ID,
TABLE_NAME
);
var cursor = getHelper().getReadableDatabase().rawQuery(formula, null);
if (cursor != null) {
cursor.moveToFirst();
int count = cursor.getInt(0);
cursor.close();
return count > 0;
}
return false;
}
public static List<MusicTrack> getTracks() {
return getTracks(String.format(
"SELECT * FROM %s",
TABLE_NAME
));
}
public static List<MusicTrack> getTracksAsPlaylist() {
return getTracks(String.format(
"SELECT * FROM %s WHERE %s > -1 GROUP BY %s HAVING COUNT(*) > 1 ORDER by id DESC",
TABLE_NAME,
COLUMN_ALBUM_ID,
COLUMN_ALBUM_ID
));
}
public static List<MusicTrack> getTracksByAlbum(String id) {
return getTracks(String.format(
"SELECT COUNT(%s) FROM %s WHERE %s = %s",
COLUMN_ID,
TABLE_NAME,
COLUMN_ALBUM_ID,
id
));
}
public static List<MusicTrack> getTracksByAlbumOne(String id) {
return getTracks(String.format(
"SELECT * FROM %s WHERE %s = %s LIMIT 1",
TABLE_NAME,
COLUMN_ALBUM_ID,
id
));
}
public static List<MusicTrack> getTracks(String query) {
List<MusicTrack> list = new ArrayList<>();
try (Cursor cursor = getHelper().getReadableDatabase().rawQuery(query, new String[0])) {
while (cursor.moveToNext()) {
list.add(new MusicTrack(reconstructFromDb(cursor)));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public static boolean isCached(String trackId) {
var formula = String.format(
"SELECT COUNT(%s) FROM %s WHERE %s = '%s'",
COLUMN_ID,
TABLE_NAME,
COLUMN_TRACK_ID,
trackId
);
try {
Cursor size = getHelper().getReadableDatabase().rawQuery(formula, null);
if (size != null) {
size.moveToFirst();
int count = size.getInt(0);
size.close();
return count != 0;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
public static boolean isVkxCached(int playlist_id, int owner_id) {
return LibVKXClient.getInstance().runOnServiceSync(new LibVKXClientImpl.LibVKXActionGeneric<>() {
@Override
public Boolean run(ILibVkxService service) {
try {
return service.isPlaylistCached(playlist_id, owner_id);
} catch (RemoteException e) {
return false;
}
}
@Override
public Boolean defaultValue() {
return false;
}
});
}
public static boolean isVkxCached(String trackId) {
return LibVKXClient.getInstance().runOnServiceSync(new LibVKXClientImpl.LibVKXActionGeneric<>() {
@Override
public Boolean run(ILibVkxService service) {
try {
var splits = trackId.split("_");
var id = Integer.parseInt(splits[1]);
var owner = Integer.parseInt(splits[0]);
return service.isTrackCached(id, owner);
} catch (RemoteException e) {
return false;
}
}
@Override
public Boolean defaultValue() {
return false;
}
});
}
public static void removeTrackFromCache(String trackId) {
deleteRecursive(FileCacheImplementation.getTrackFolder(trackId));
var formula = String.format(
"DELETE FROM %s WHERE %s = '%s'",
TABLE_NAME,
COLUMN_TRACK_ID,
trackId
);
getHelper().getWritableDatabase().execSQL(formula);
}
public static long getTrackCount() {
if (!LibVKXClient.isIntegrationEnabled())
return DatabaseUtils.queryNumEntries(getHelper().getReadableDatabase(), TABLE_NAME);
return LibVKXClient.getInstance().runOnServiceSync(new LibVKXClientImpl.LibVKXActionGeneric<Long>() {
@Override
public Long run(ILibVkxService service) {
try {
return (long) service.getCache().size();
} catch (RemoteException e) {
e.printStackTrace();
return defaultValue();
}
}
@Override
public Long defaultValue() {
return 0L;
}
});
}
private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
public void onCreate(SQLiteDatabase db) {
var formula = String.format(
"CREATE TABLE %s (%s INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s INTEGER, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s INTEGER, %s INTEGER, %s INTEGER)",
TABLE_NAME,
COLUMN_ID, COLUMN_TRACK_ID, COLUMN_ALBUM_ID, COLUMN_TITLE, COLUMN_SUBTITLE, COLUMN_ARTIST, COLUMN_ALBUM_TITLE, COLUMN_EXPLICIT, COLUMN_DURATION, COLUMN_HAS_ARTWORK
);
db.execSQL(formula);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
@@ -0,0 +1,59 @@
package ru.vtosters.lite.music.cache;
import android.net.Uri;
import com.vk.dto.music.MusicTrack;
import java.io.File;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
public class FileCacheImplementation {
public static void clear() {
CacheDatabaseDelegate.clear();
IOUtils.deleteRecursive(getCacheDir(), false);
}
public static File getCacheDir() {
return AndroidUtils.getGlobalContext().getExternalFilesDir("vt_tracks");
}
public static File getTrackFolder(String trackId) {
var dir = new File(getCacheDir(), trackId);
dir.mkdirs();
return dir;
}
public static File getThumbnailsFolder(String trackId) {
var dir = new File(getTrackFolder(trackId), "thumbs");
dir.mkdirs();
return dir;
}
public static File getTrackFile(String trackId) {
return new File(getTrackFolder(trackId), "track.mp3");
}
public static boolean isTrackExist(String trackId) {
return CacheDatabaseDelegate.isCached(trackId);
}
public static File getTrackFile(MusicTrack track) {
return getTrackFile(track.y1());
}
public static File getTrackThumbnail(String trackId, int factor) {
return new File(getThumbnailsFolder(trackId), "thumb_" + factor + ".png");
}
public static String getFileUri(File file) {
if (!file.exists()) return null;
return Uri.fromFile(file).toString();
}
public static String getServerPath() {
return "https://vtosters.app";
}
}
@@ -0,0 +1,147 @@
package ru.vtosters.lite.music.cache.helpers;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import com.vk.dto.music.Playlist;
import com.vtosters.lite.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
import ru.vtosters.lite.utils.AndroidUtils;
public class PlaylistHelper {
public static Playlist createCachedPlaylistMetadata() {
try {
return new Playlist(getPlaylist());
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
public static Playlist createCachedPlaylistMetadata(String id) {
var track = TracklistHelper.getTracksOne(id).get(0);
var albumLink = track.I;
var thumb = albumLink.u1();
return createAlbum(
thumb != null ? thumb.h(600) : "",
albumLink.getTitle(),
track.C,
track.y1(),
albumLink.getId()
);
}
public static Playlist createAlbum(String photo, String title, String artist, String trackId, int albumId) {
try {
var jPhoto = new JSONObject();
if (!photo.isEmpty())
jPhoto.put("height", 600)
.put("width", 600)
.putOpt("photo_300", FileCacheImplementation.getFileUri(FileCacheImplementation.getTrackThumbnail(trackId, 300)))
.putOpt("photo_600", FileCacheImplementation.getFileUri(FileCacheImplementation.getTrackThumbnail(trackId, 600)));
var obj = new JSONObject()
.put("id", -2)
.put("owner_id", albumId)
.put("type", 1)
.put("album_type", "main_only")
.put("title", title)
.put("description", albumId + "/ " + AndroidUtils.getString(R.string.cached_album_warning))
.put("main_artists", new JSONArray()
.put(new JSONObject().put("name", artist)
.put("id", "-1")
.put("domain", "-1")))
.putOpt("photo", jPhoto)
.put("count", 0);
return new Playlist(obj);
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
public static List<Playlist> getAlbumPlaylists() {
List<Playlist> list = new ArrayList<>();
for (var track : CacheDatabaseDelegate.getTracksAsPlaylist()) {
var albumLink = track.I;
var thumb = albumLink.u1();
list.add(createAlbum(
thumb != null ? thumb.h(600) : "",
albumLink.getTitle(),
track.C,
track.y1(),
albumLink.getId()
));
}
return list;
}
public static JSONObject getPlaylist() throws JSONException {
return new JSONObject()
.put("id", -1)
.put("owner_id", getUserId())
.put("type", 0)
.put("album_type", "playlist")
.put("title", AndroidUtils.getString(R.string.cached_tracks_title))
.put("description", AndroidUtils.getString(R.string.cached_tracks_desc))
.put("access_key", "cache")
.put("genres", new JSONArray())
.put("is_following", false)
.put("followers", 0)
.put("plays", 0)
.put("create_time", 0)
.put("update_time", 0)
.put("subtitle", "")
.put("photo", new JSONObject()
.put("photo_34", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache34.jpg")
.put("photo_68", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache68.jpg")
.put("photo_135", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache135.jpg")
.put("photo_270", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache270.jpg")
.put("photo_300", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache300.jpg")
.put("photo_600", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache600.jpg")
.put("photo_1200", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/cached_playlist/VTLCache1200.jpg")
.put("width", 600)
.put("height", 600))
.put("meta", new JSONObject()
.put("view", "compact"))
.put("count", 0);
}
public static JSONObject getCatalogPlaylist() throws JSONException {
return new JSONObject()
.put("id", "cache")
.put("data_type", "music_playlists")
.put("layout", new JSONObject()
.put("name", "large_slider")
.put("is_editable", 0)
.put("owner_id", getUserId()))
.put("playlists_ids", new JSONArray()
.put(getUserId() + "_-1"));
}
public static JSONObject getCatalogHeader() throws JSONException {
return new JSONObject()
.put("id", "cache")
.put("data_type", "none")
.put("layout", new JSONObject()
.put("name", "header")
.put("title", AndroidUtils.getString(R.string.cached_tracks_title)));
}
public static JSONObject getCatalogSeparator() throws JSONException {
return new JSONObject()
.put("id", "cache")
.put("data_type", "none")
.put("layout", new JSONObject()
.put("name", "separator"));
}
}
@@ -0,0 +1,74 @@
package ru.vtosters.lite.music.cache.helpers;
import android.util.Log;
import com.vk.dto.music.MusicTrack;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.net.MalformedURLException;
import java.util.List;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
public class TracklistHelper {
public static List<MusicTrack> getTracks() {
return CacheDatabaseDelegate.getTracks();
}
public static List<MusicTrack> getTracks(String id) {
return CacheDatabaseDelegate.getTracksByAlbum(id);
}
public static List<MusicTrack> getTracksOne(String id) {
return CacheDatabaseDelegate.getTracksByAlbumOne(id);
}
public static JSONArray tracksToIds(List<MusicTrack> tracks) {
var arr = new JSONArray();
for (MusicTrack track : tracks) {
arr.put(track.y1());
}
return arr;
}
public static JSONArray tracksToJsons(List<MusicTrack> tracks) {
var arr = new JSONArray();
for (MusicTrack track : tracks) {
var json = track.J();
var folder = FileCacheImplementation.getThumbnailsFolder(LibVKXClient.asId(track));
try {
addCachedThumbnails(json, folder);
} catch (JSONException | MalformedURLException e) {
Log.d("TracklistHelper", e.getMessage());
}
arr.put(json);
}
return arr;
}
private static void addCachedThumbnails(JSONObject target, File thumbnailsDir)
throws JSONException, MalformedURLException {
var sizes = new JSONArray();
var files = thumbnailsDir.listFiles();
if (files == null || files.length == 0)
return;
for (var file : files) {
var filename = file.getName();
var width = Integer.parseInt(filename.substring(6, filename.length() - 4));
var src = file.toURI().toURL().toString();
Log.d("tracksToJsons", src);
var size = new JSONObject()
.put("width", width)
.put("src", src);
sizes.put(size);
}
target.put("album", new JSONObject().put("thumb", new JSONObject().put("sizes", sizes)));
}
}
@@ -0,0 +1,104 @@
package ru.vtosters.lite.music.cache.injectors;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import com.vk.api.audio.AudioGetPlaylist;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import io.reactivex.Observable;
import io.reactivex.ObservableOnSubscribe;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.helpers.PlaylistHelper;
import ru.vtosters.lite.music.cache.helpers.TracklistHelper;
public class PlaylistInjector {
private static final ExecutorService executor = Executors.newCachedThreadPool();
public final static String CHANNEL_NAME = "VTCH";
public static void injectDownloadPlaylist(Playlist playlist) {
executor.submit(() -> AudioDownloader.cachePlaylist(playlist));
}
public static boolean eligibleForOfflineCaching() {
return CacheDatabaseDelegate.hasTracks();
}
public static Observable<AudioGetPlaylist.c> injectGetPlaylist(AudioGetPlaylist audioGetPlaylist) {
try {
if (!eligibleForOfflineCaching())
return null;
var requestArgs = audioGetPlaylist.b();
var id = requestArgs.get("id");
var ownerId = requestArgs.get("owner_id");
var accessKey = requestArgs.get("access_key");
boolean isVirtualPlaylist = accessKey != null && (accessKey.equals("cache"));
boolean isAlbumVirtualPlaylist = accessKey != null && (accessKey.equals("cacheAlbum"));
Log.d("PlaylistInjector", "id = " + id + " / owner = " + ownerId + " / access = " + accessKey + " / " + isVirtualPlaylist + " + " + isAlbumVirtualPlaylist);
if (TextUtils.isEmpty(id) || (!isVirtualPlaylist && !isAlbumVirtualPlaylist))
return null;
return Observable.a((ObservableOnSubscribe<AudioGetPlaylist.c>) observableEmitter -> {
AudioGetPlaylist.c response = new AudioGetPlaylist.c();
if (LibVKXClient.isIntegrationEnabled()) {
LibVKXClient.getInstance().runOnService((service) -> {
try {
List<String> cache;
ArrayList<MusicTrack> tracks = new ArrayList<>();
if (isAlbumVirtualPlaylist) {
response.b = new Playlist(new JSONObject(service.getPlaylistDefJson(id, ownerId)));
cache = service.getTracksInPlaylist(id, ownerId);
} else {
response.b = PlaylistHelper.createCachedPlaylistMetadata();
cache = service.getCache();
}
for (String json : cache) {
tracks.add(new MusicTrack(new JSONObject(json)));
}
response.c = tracks;
} catch (RemoteException | JSONException e) {
e.printStackTrace();
response.c = new ArrayList<>();
}
observableEmitter.b(response);
});
return;
}
if (isVirtualPlaylist) {
response.c = (ArrayList<MusicTrack>) TracklistHelper.getTracks();
response.b = PlaylistHelper.createCachedPlaylistMetadata();
} else {
response.c = (ArrayList<MusicTrack>) TracklistHelper.getTracks(requestArgs.get("owner_id"));
response.b = PlaylistHelper.createCachedPlaylistMetadata(requestArgs.get("owner_id"));
}
observableEmitter.b(response);
});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,224 @@
package ru.vtosters.lite.music.cache.injectors;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.hasTracks;
import android.util.Log;
import com.vk.catalog2.core.CatalogParser;
import com.vk.catalog2.core.api.dto.CatalogResponse;
import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import io.reactivex.Observable;
import io.reactivex.ObservableOnSubscribe;
import ru.vtosters.lite.music.cache.helpers.PlaylistHelper;
import ru.vtosters.lite.music.cache.helpers.TracklistHelper;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NetworkUtils;
public class TracklistInjector {
public static boolean eligibleForOfflineCaching() {
return !NetworkUtils.isNetworkConnected();
}
public static Observable<CatalogResponse> createOfflineRx(CatalogParser parser) {
Log.d("TracklistInjector", "createOfflineRx");
return Observable.a((ObservableOnSubscribe<CatalogResponse>) observableEmitter -> {
if (LibVKXClient.isIntegrationEnabled()) {
LibVKXClient.getInstance().runOnService((service) -> {
try {
try {
Log.d("TracklistInjector", "Using vkx cache catalog");
observableEmitter.b(parser.c(new JSONObject(service.getCacheCatalog())));
} catch (Exception e) {
e.printStackTrace();
List<MusicTrack> tracks = new ArrayList<>();
List<String> cache = service.getCache();
for (String json : cache) {
Log.d("TracklistInjector", "added " + json);
tracks.add(new MusicTrack(new JSONObject(json)));
}
Log.d("TracklistInjector", "Using own cache catalog from vkx");
observableEmitter.b(parser.c(createVirtualCatalog(tracks)));
}
} catch (Exception e) {
e.printStackTrace();
}
});
} else {
if (!hasTracks()) {
observableEmitter.b(parser.c(getEmptyCatalog()));
} else {
observableEmitter.b(parser.c(createVirtualCatalog(TracklistHelper.getTracks())));
}
}
});
}
private static JSONObject getEmptyCatalog() throws JSONException {
return new JSONObject("{\"catalog\":{\"default_section\":\"cache\",\"sections\":[{\"id\":\"cache\",\"title\":\"" + AndroidUtils.getString(R.string.cached_content_title) + "\",\"blocks\":[{\"data_type\":\"placeholder\",\"id\":\"0\",\"layout\":{\"name\":\"placeholder_big\"},\"placeholder_ids\":[\"_synth_trackEmpty\"]}]}]},\"audios\":[],\"playlists\":[],\"placeholders\":[{\"id\":\"_synth_trackEmpty\",\"title\":\"" + AndroidUtils.getString(R.string.cached_content_empty) + "\",\"text\":\"" + AndroidUtils.getString(R.string.cached_content_empty_desc) + "\",\"buttons\":[]}]}");
}
public static void injectIntoExistingCatalog(JSONObject catalogNode) {
Log.d("TracklistInjector", "injectIntoExistingCatalog");
if (!hasTracks()) return;
try {
var sectionsNode = catalogNode.getJSONObject("catalog")
.getJSONArray("sections");
var firstSection = sectionsNode.getJSONObject(0);
if (!firstSection.getString("url").equals("https://vk.com/audios" + AccountManagerUtils.getUserId() + "?section=all"))
return;
var foundPlaylistBlock = false;
var suitableIndex = 0;
var blocks = firstSection.getJSONArray("blocks");
for (int i = 0; i < blocks.length(); i++) {
var block = blocks.getJSONObject(i);
var dataType = block.getString("data_type");
if ("music_audios".equals(dataType)) {
suitableIndex = i - 1;
continue;
}
if (!"music_playlists".equals(dataType))
continue;
var playlistIds = block.getJSONArray("playlists_ids");
var newPlaylistIds = new JSONArray()
.put(AccountManagerUtils.getUserId() + "_-1");
for (int j = 0; j < playlistIds.length(); j++)
newPlaylistIds.put(playlistIds.get(j));
block.put("playlists_ids", newPlaylistIds);
// need test
blocks.remove(i);
blocks.put(i, block);
foundPlaylistBlock = true;
}
if (foundPlaylistBlock) {
var playlists = catalogNode.getJSONArray("playlists")
.put(0, PlaylistHelper.createCachedPlaylistMetadata().J());
catalogNode.put("playlists", playlists);
return;
}
var ids = new JSONArray()
.put(0, AccountManagerUtils.getUserId() + "_-1");
var playlistsBlock = new JSONObject()
.put("id", getRandomId())
.put("data_type", "music_playlists")
.put("url", "synth:cache:playlists")
.put("playlists_ids", ids);
var layout = new JSONObject()
.put("name", "large_slider")
.put("owner_id", AccountManagerUtils.getUserId());
playlistsBlock.put("layout", layout);
blocks.put(suitableIndex, playlistsBlock);
firstSection.put("blocks", blocks);
var playlists = new JSONArray()
.put(0, PlaylistHelper.createCachedPlaylistMetadata().J());
catalogNode.put("playlists", playlists);
} catch (JSONException e) {
e.printStackTrace();
}
}
public static JSONObject createVirtualCatalog(List<MusicTrack> tracks)
throws JSONException {
Log.d("TracklistInjector", "createVirtualCatalog");
var clickAction = new JSONObject()
.put("type", "open_url")
.put("target", "internal")
.put("url", "https://vkx.app/index.html?app=vt_ctg");
var catalogBanner = new JSONObject()
.put("id", 1234)
.put("image_mode", "cover")
.put("title", AndroidUtils.getString(R.string.vkx_integration_title))
.put("text", AndroidUtils.getString(R.string.vkx_integration_desc))
.put("click_action", new JSONObject().put("action", clickAction));
var catalogBanners = new JSONArray()
.put(catalogBanner);
var audiosBlock = new JSONObject()
.put("id", getRandomId())
.put("data_type", "music_audios")
.put("url", "synth:cache:list")
.put("audios_ids", TracklistHelper.tracksToIds(tracks));
var layout = new JSONObject()
.put("name", "list")
.put("owner_id", AccountManagerUtils.getUserId());
audiosBlock.put("layout", layout);
var blocks = new JSONArray()
.put(audiosBlock);
// var vkxPostirony = new JSONObject()
// .put("id", getRandomId())
// .put("data_type", "catalog_banners")
// .put("url", "synth:cache:vkx")
// .put("catalog_banner_ids", new JSONArray().put(1234));
//
// var vkxlayout = new JSONObject()
// .put("name", "large_list")
// .put("owner_id", Globals.getUserId())
// .put("infinite_repeat", true);
//
// vkxPostirony.put("layout", vkxlayout);
//
// if (eligibleForVkxAd())
// blocks.put(vkxPostirony);
var randomId = getRandomId();
var section = new JSONObject()
.put("id", randomId)
.put("title", AndroidUtils.getString(R.string.saved_tracks_title))
.put("url", "synth:cache")
.put("blocks", blocks);
var sections = new JSONArray()
.put(section);
var catalog = new JSONObject()
.put("sections", sections)
.put("default_section", randomId);
return new JSONObject()
.put("catalog", catalog)
.put("audios", TracklistHelper.tracksToJsons(tracks))
.put("catalog_banners", catalogBanners);
}
private static String getRandomId() {
return UUID.randomUUID().toString();
}
}
@@ -0,0 +1,95 @@
package ru.vtosters.lite.music.callback;
import android.util.Log;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.vtosters.lite.R;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.music.Callback;
import ru.vtosters.lite.utils.AndroidUtils;
public class MusicCallbackBuilder {
private static final NotificationManagerCompat notificationManager = NotificationChannels.getNotificationManager();
public static Callback buildOneTrackCallback(int notificationId, NotificationCompat.Builder notification) {
return new Callback() {
long startTime = 0;
long elapsedTime = 0;
@Override
public void onProgress(int progress) {
if (elapsedTime > 1000) {
notification.setProgress(100, progress, false);
notificationManager.notify(notificationId, notification.build());
startTime = System.currentTimeMillis();
elapsedTime = 0;
} else {
elapsedTime = System.currentTimeMillis() - startTime;
}
}
@Override
public void onSuccess() {
try {
notification
.setContentText(AndroidUtils.getString(R.string.player_download_finished))
.setProgress(0, 0, false)
.setSmallIcon(android.R.drawable.stat_sys_download_done);
notificationManager.notify(notificationId, notification.build());
} catch (UnsatisfiedLinkError e) {
Log.e("AudioDownloader", "native libs");
Log.e("AudioDownloader", e.getMessage());
onFailure();
}
}
@Override
public void onFailure() {
notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false);
notificationManager.notify(notificationId, notification.build());
}
@Override
public void onSizeReceived(long size, long header) {
}
};
}
public static Callback buildPlaylistCallback(int playlistSize, NotificationCompat.Builder notification, int notificationId) {
return new Callback() {
@Override
public void onProgress(int progress) {
if (progress == playlistSize) {
onSuccess();
} else {
notification.setContentText(String.format(AndroidUtils.getString(R.string.playlist_download_notf), progress, playlistSize));
notification.setProgress(playlistSize, progress, false);
}
notificationManager.notify(notificationId, notification.build());
}
@Override
public void onSuccess() {
notification.setContentText(AndroidUtils.getString(R.string.player_download_finished));
notification.setProgress(0, 0, false);
}
@Override
public void onFailure() {
notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false);
notificationManager.notify(notificationId, notification.build());
}
@Override
public void onSizeReceived(long size, long header) {
}
};
}
}
@@ -0,0 +1,86 @@
package ru.vtosters.lite.music.converter.playlist;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import com.vk.core.network.Network;
import com.vk.core.util.DeviceIdProvider;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import java8.util.concurrent.CompletableFuture;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
/**
* stuff for converting playlists DTO
*/
public class PlaylistConverter {
public static List<MusicTrack> getPlaylist(Playlist oldPlaylist) {
var tracks = requestPlaylist(0, oldPlaylist.b, oldPlaylist.Q, oldPlaylist.a);
return tracks.stream().filter(track -> !track.D.isEmpty()).collect(Collectors.toList());
}
private static List<MusicTrack> requestPlaylist(int offset, int ownerId, String accessKey, int id) {
var audioCount = 1000;
var requestUrl = "https://" + getApi() + "/method/execute.getPlaylist" +
"?v=5.119" +
"&https=1" +
"&audio_count=" + audioCount +
"&need_playlist=1" +
"&device_id=" + DeviceIdProvider.d(AndroidUtils.getGlobalContext()) +
"&owner_id=" + ownerId +
"&access_key=" + accessKey +
"&func_v=5" +
"&id=" + id +
"&lang=" + getLocale() +
"&audio_offset=" + offset +
"&need_owner=1" +
"&access_token=" + AccountManagerUtils.getUserToken();
var request = new Request.a()
.b(requestUrl)
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")).a();
try {
var response = CompletableFuture.supplyAsync(() -> {
try {
return new OkHttpClient().a(request).execute().a().g();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
).get();
var jsonObj = new JSONObject(response);
if (!jsonObj.has("response"))
return null;
var playlist = new JSONObject(response).getJSONObject("response").getJSONArray("audios");
var tracks = new ArrayList<MusicTrack>();
for (int i = 0; i < playlist.length(); i++) {
var track = new MusicTrack(playlist.getJSONObject(i));
tracks.add(track);
}
if (tracks.size() == audioCount) {
tracks.addAll(requestPlaylist(offset + audioCount, ownerId, accessKey, id));
}
return tracks;
} catch (JSONException | ExecutionException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
@@ -1,15 +1,19 @@
package ru.vtosters.lite.music;
package ru.vtosters.lite.music.converter.ts;
import android.util.Log;
import com.arthenica.ffmpegkit.FFmpegKit;
import com.arthenica.ffmpegkit.ReturnCode;
import com.vk.core.util.ToastUtils;
import com.vk.dto.music.Artist;
import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.stream.Collectors;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
@@ -17,6 +21,61 @@ import ru.vtosters.lite.utils.IOUtils;
public class FFMpeg {
private static final int BUFFER_SIZE = 2048;
/**
* @param in Merged .ts file via {@link ru.vtosters.lite.music.converter.ts.TSMerger}
* @param out Output .mp3 file
* @param track Track to be converted
* @return True if success, else false
*/
public static boolean convert(File in, String out, MusicTrack track) {
checkFFMpegLibs();
// convert .ts file to .mp3 file via ffmpeg
var sb = new StringBuilder();
sb.append("-y -i \"").append(in.getAbsolutePath()).append("\"");
sb.append(" -map 0 -dn ");
sb.append(" -loglevel error");
sb.append(" -hide_banner");
sb.append(" -write_id3v2 1");
String title = null;
if (track.f != null) {
title = track.f;
if (!track.g.isEmpty()) {
title += " (" + track.g + ")";
}
}
if (title != null) {
sb.append(" -metadata title=\"").append(IOUtils.getValidFileName(title)).append("\"");
}
if (track.L != null) {
sb.append(" -metadata artist=\"").append(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))).append("\"");
} else if (track.C != null) {
sb.append(" -metadata artist=\"").append(track.C).append("\"");
}
if (track.I != null) {
sb.append(" -metadata album=\"").append(track.I.getTitle()).append("\"");
}
sb.append(" -c copy \"").append(out).append("\"");
var command = sb.toString();
var session = FFmpegKit.execute(command);
var rc = session.getReturnCode();
if (ReturnCode.isSuccess(rc)) {
return true;
}
Log.e("FFMpeg", "FFmpegKit failed with return code " + rc);
return false;
}
private static void copyAssets() {
try {
String[] files = AndroidUtils.getGlobalContext().getAssets().list("ffmpeg");
@@ -41,44 +100,8 @@ public class FFMpeg {
private static void checkFFMpegLibs() {
var lib = new File(AndroidUtils.getGlobalContext().getFilesDir(), "libffmpegkit_abidetect.so");
if (!lib.exists()) {
ToastUtils.a("Копирование библиотеки ffmpegkit");
ToastUtils.a(R.string.ffmpegkit_copy);
copyAssets();
}
}
public static boolean convert(String in, String out) {
checkFFMpegLibs();
// write the list of all .ts files to a txt file in "in" directory
var list = new File(in);
var listFile = new File(list, "list.txt");
try {
listFile.createNewFile();
var writer = new java.io.FileWriter(listFile);
for (var file : list.listFiles()) {
if (file.getName().endsWith(".ts")) {
writer.write("file " + file.getName() + "\n");
}
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
// concatenate .ts files to a single .ts file
FFmpegKit.execute("-f concat -safe 0 -i " + in + "/list.txt -c copy " + in + "/all.ts");
// convert .ts file to .mp3 file via ffmpeg
var session = FFmpegKit.execute("-i " + in + "/all.ts -f mp3 -acodec mp3 -q:a 0 -y '" + out + "'");
var rc = session.getReturnCode();
if (ReturnCode.isSuccess(rc)) {
// remove temp files
IOUtils.deleteRecursive(new File(in));
return true;
}
Log.e("FFMpeg", "FFmpegKit failed with return code " + rc);
return false;
}
}
@@ -0,0 +1,65 @@
package ru.vtosters.lite.music.converter.ts;
import android.os.Build;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
import ru.vtosters.lite.utils.IOUtils;
public class TSMerger {
/**
* Merge multiple .ts files into one .ts file
*
* @param in Directory with .ts files
* @return True if success, else false
*/
public static boolean merge(File in, File out) {
var tsesList = in.listFiles();
if (tsesList == null) {
return false;
}
var mergedByteArrayStream = new ByteArrayOutputStream();
Arrays.sort(tsesList, (o1, o2) -> {
var index1 = Integer.parseInt(o1.getName().split("-")[1]);
var index2 = Integer.parseInt(o2.getName().split("-")[1]);
return index1 - index2;
});
for (var file : tsesList) {
if (file.getName().endsWith(".ts")) {
try {
mergedByteArrayStream.write(IOUtils.readAllBytes(file));
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try {
Files.write(out.toPath(), mergedByteArrayStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
return false;
}
} else {
try (FileOutputStream fos = new FileOutputStream(out)) {
fos.write(mergedByteArrayStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
return true;
}
}
@@ -0,0 +1,82 @@
package ru.vtosters.lite.music.downloader;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import android.util.Log;
import com.vk.core.network.Network;
import com.vk.core.util.DeviceIdProvider;
import com.vk.dto.music.MusicTrack;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import java8.util.concurrent.CompletableFuture;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.vtosters.lite.utils.AndroidUtils;
public class AudioGet {
public static List<MusicTrack> getAudios() {
var tracks = requestAudios(0);
return tracks != null ? tracks.stream().filter(track -> !track.D.isEmpty()).collect(Collectors.toList()) : null;
}
private static List<MusicTrack> requestAudios(int offset) {
var audioCount = 1000;
var requestUrl = "https://" + getApi() + "/method/audio.get" +
"?v=5.119" +
"&https=1" +
"&count=" + audioCount +
"&device_id=" + DeviceIdProvider.d(AndroidUtils.getGlobalContext()) +
"&owner_id=" + getUserId() +
"&access_key=" + getUserToken() +
"&lang=" + getLocale() +
"&offset=" + offset +
"&access_token=" + getUserToken();
var request = new Request.a()
.b(requestUrl)
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")).a();
try {
var response = CompletableFuture.supplyAsync(() -> {
try {
return new OkHttpClient().a(request).execute().a().g();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
).get();
var jsonObj = new JSONObject(response);
if (!jsonObj.has("response"))
return null;
Log.d("AudioGet", jsonObj.toString());
var audios = new JSONObject(response).getJSONObject("response").getJSONArray("items");
var tracks = new ArrayList<MusicTrack>();
for (int i = 0; i < audios.length(); i++) {
var track = new MusicTrack(audios.getJSONObject(i));
tracks.add(track);
}
if (tracks.size() == audioCount) {
tracks.addAll(requestAudios(offset + audioCount));
}
return tracks;
} catch (JSONException | ExecutionException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,74 @@
package ru.vtosters.lite.music.downloader;
import android.util.Log;
import com.vk.dto.music.MusicTrack;
import java.io.File;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import ru.vtosters.lite.music.Callback;
public class PlaylistDownloader {
public static void downloadPlaylist(List<MusicTrack> playlist, String playlistName, String path, Callback callback) {
File outDir = new File(path);
if (!outDir.exists())
if (outDir.mkdirs())
Log.v("PlaylistDownloader", "Directory created");
else
Log.e("PlaylistDownloader", "Directory creation failed");
var downloadedTracks = new AtomicInteger(0);
for (MusicTrack musicTrack : playlist) {
TrackDownloader.downloadTrack(musicTrack, path, new Callback() {
@Override
public void onProgress(int progress) {
}
@Override
public void onSuccess() {
var currentProgress = downloadedTracks.incrementAndGet();
callback.onProgress(currentProgress);
}
@Override
public void onFailure() {
callback.onFailure();
}
@Override
public void onSizeReceived(long size, long header) {
}
});
}
}
public static void cachePlaylist(List<MusicTrack> playlist, Callback callback) {
var downloadedTracks = new AtomicInteger(0);
for (MusicTrack musicTrack : playlist) {
TrackDownloader.cacheTrack(musicTrack, new Callback() {
@Override
public void onProgress(int progress) {
}
@Override
public void onSuccess() {
var currentProgress = downloadedTracks.incrementAndGet();
callback.onProgress(currentProgress);
}
@Override
public void onFailure() {
callback.onFailure();
}
@Override
public void onSizeReceived(long size, long header) {
}
});
}
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.music.downloader;
import com.vk.dto.music.MusicTrack;
import java.io.IOException;
import java.net.URL;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
import ru.vtosters.lite.utils.IOUtils;
public class ThumbnailDownloader {
public static void downloadThumbnails(MusicTrack track)
throws IOException {
var obj = track.J();
var trackId = LibVKXClient.asId(track);
if (!obj.has("album")) return;
var album = obj.optJSONObject("album");
if (!album.has("thumb")) return;
var thumb = album.optJSONObject("thumb");
if (thumb.has("sizes")) {
var sizes = thumb.optJSONArray("sizes");
for (int i = 0; i < sizes.length(); i++) {
var size = sizes.optJSONObject(i);
var width = size.optInt("width");
var src = size.optString("src");
downloadThumbnail(src, width, trackId);
}
} else {
var names = thumb.names();
for (int i = 0; i < names.length(); i++) {
var name = names.optString(i);
downloadThumbnail(thumb.optString(name), Integer.parseInt(name.substring(6)), trackId);
}
}
}
private static void downloadThumbnail(String url, int res, String trackId)
throws IOException {
var data = IOUtils.readAllBytes(new URL(url).openStream());
IOUtils.writeToFile(FileCacheImplementation.getTrackThumbnail(trackId, res), data);
}
}
@@ -0,0 +1,45 @@
package ru.vtosters.lite.music.downloader;
import android.util.Log;
import com.vk.dto.music.MusicTrack;
import java.io.File;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import ru.vtosters.lite.concurrent.VTExecutors;
import ru.vtosters.lite.music.Callback;
import ru.vtosters.lite.music.M3UDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
import ru.vtosters.lite.music.interfaces.ITrackDownloader;
public class TrackDownloader {
public static void downloadTrack(MusicTrack track, String path, Callback callback) {
download(track, path, callback, M3UDownloader.getInstance(), false);
}
public static void cacheTrack(MusicTrack track, Callback callback) {
if (CacheDatabaseDelegate.isCached(track.y1())) {
callback.onSuccess();
return;
}
var path = FileCacheImplementation.getTrackFolder(LibVKXClient.asId(track)).getAbsolutePath();
download(track, path, callback, M3UDownloader.getInstance(), true);
CacheDatabaseDelegate.insertTrack(track);
}
private static void download(MusicTrack track, String path, Callback callback, ITrackDownloader downloader, boolean cache) {
File outDir = new File(path);
if (!outDir.exists())
if (outDir.mkdir())
Log.v("TrackDownloader", "Directory created");
else
Log.e("TrackDownloader", "Directory creation failed");
VTExecutors.getMusicDownloadExecutor().execute(
() -> downloader.downloadTrack(track, outDir, callback, cache)
);
}
}
@@ -0,0 +1,21 @@
package ru.vtosters.lite.music.interfaces;
import com.vk.dto.music.MusicTrack;
import java.io.File;
import ru.vtosters.lite.music.Callback;
/**
* Interface for track downloaders
*/
public interface ITrackDownloader {
/**
* Download track
*
* @param track Music track
* @param outDir Directory where to download the track
* @param callback Callback to call when download status changes
*/
void downloadTrack(MusicTrack track, File outDir, Callback callback, boolean cache);
}
@@ -0,0 +1,72 @@
package ru.vtosters.lite.music.notification;
import android.app.Notification;
import android.os.Build;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
public class MusicNotificationBuilder {
private static final NotificationManagerCompat notificationManager = NotificationChannels.getNotificationManager();
public static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle(AndroidUtils.getString(R.string.audio_downloading))
.setContentText(track.toString())
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true)
.setProgress(100, 0, false);
notificationManager.notify(id, notificationBuilder.build());
return notificationBuilder;
}
public static NotificationCompat.Builder buildPlaylistDownloadNotification(String playlistName, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle(AndroidUtils.getString(R.string.playlist_downloading) + " «" + playlistName + "»")
.setContentText(playlistName)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true)
.setProgress(100, 0, false);
notificationManager.notify(id, notificationBuilder.build());
return notificationBuilder;
}
public static NotificationCompat.Builder buildAllAudiosDownloadNotification(int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle(AndroidUtils.getString(R.string.notf_audio_dl_user) + " " + AccountManagerUtils.getUsername())
.setContentText(AndroidUtils.getString(R.string.all_audio))
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true)
.setProgress(100, 0, false);
notificationManager.notify(id, notificationBuilder.build());
return notificationBuilder;
}
public static void notifySavingToCache(MusicTrack track) {
Notification.Builder builder;
if (Build.VERSION.SDK_INT >= 26) {
builder = new Notification.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID);
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
} else builder = new Notification.Builder(AndroidUtils.getGlobalContext());
builder.setSmallIcon(com.vtosters.lite.R.drawable.ic_download_outline_28)
.setShowWhen(false)
.setContentTitle(AndroidUtils.getString(R.string.cached_track) + ": " + track.toString());
notificationManager.notify(track.y1().hashCode(), builder.build());
}
}
@@ -0,0 +1,38 @@
package ru.vtosters.lite.proxy;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class GithubList {
private static final OkHttpClient mClient = new OkHttpClient();
public static ArrayList<String> getProxy(String url, String proxyname) throws IOException {
Request link = new Request.a()
.b(url)
.a();
try {
var response = mClient.a(link).execute().a().g();
if (!response.contains(":")) {
Log.d(proxyname, "No proxy found");
return null;
}
Log.d(proxyname, response);
return new ArrayList<>(Arrays.asList(response.split("\n")));
} catch (Exception e){
Log.d(proxyname, "Failed to fetch data, link: " + link);
return null;
}
}
}
@@ -0,0 +1,170 @@
package ru.vtosters.lite.proxy;
import static java.lang.System.clearProperty;
import static ru.vtosters.lite.proxy.api.VikaMobile.getApiHost;
import static ru.vtosters.lite.proxy.api.VikaMobile.getOauthHost;
import static ru.vtosters.lite.proxy.api.VikaMobile.getStaticHost;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.util.ArrayMap;
import android.util.Log;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import ru.vtosters.lite.proxy.http.CustomHttp;
import ru.vtosters.lite.proxy.https.CustomHttps;
import ru.vtosters.lite.proxy.socks.CustomSocks;
import ru.vtosters.lite.proxy.socks.Zaborona;
public class ProxyUtils {
public static String getApi() {
var proxyapi = getPrefsValue("proxyapi");
if (isVikaProxyEnabled()) {
proxyapi = getApiHost();
}
if (isAnyProxyEnabled() & !proxyapi.isEmpty()) {
return proxyapi;
}
return "api.vk.com";
}
public static String getOauth() {
var oauth = getPrefsValue("proxyoauth");
if (isVikaProxyEnabled()) {
oauth = getOauthHost();
}
if (isAnyProxyEnabled() & !oauth.isEmpty()) {
return oauth;
}
return "oauth.vk.com";
}
public static String getStatic() {
var staticapi = getPrefsValue("proxystatic");
if (isVikaProxyEnabled()) {
staticapi = getStaticHost();
}
if (isAnyProxyEnabled() & !staticapi.isEmpty()) {
return staticapi;
}
return "static.vk.com";
}
public static Boolean isAnyProxyEnabled() {
return isApiProxyEnabled() || isVikaProxyEnabled();
}
public static Boolean isZaboronaEnabled() {
return getPrefsValue("proxy").equals("zaborona");
}
public static Boolean isRandomProxyEnabled() {
return getPrefsValue("proxy").equals("randomproxy");
}
public static Boolean isApiProxyEnabled() {
return getPrefsValue("proxy").equals("apiproxy");
}
public static Boolean isVikaProxyEnabled() {
return getPrefsValue("proxy").equals("vika");
}
public static void forceProxyApplying() {
Log.d("Proxy", "Setting proxy...");
try {
var context = getGlobalContext().getApplicationContext();
Class<?> applicationClass = Class.forName("android.app.Application");
@SuppressLint("DiscouragedPrivateApi") @SuppressWarnings("JavaReflectionMemberAccess")
Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
mLoadedApkField.setAccessible(true);
Object mLoadedApkObject = mLoadedApkField.get(context);
@SuppressLint("PrivateApi")
Class<?> loadedApkClass = Class.forName("android.app.LoadedApk");
@SuppressLint("DiscouragedPrivateApi") Field mReceiversField = loadedApkClass.getDeclaredField("mReceivers");
mReceiversField.setAccessible(true);
ArrayMap<?, ?> receivers = (ArrayMap<?, ?>) mReceiversField.get(mLoadedApkObject);
if (receivers != null) {
for (Object receiverMap : receivers.values()) {
for (Object receiver : ((ArrayMap<?, ?>) receiverMap).keySet()) {
Class<?> receiverClass = receiver.getClass();
if (receiverClass.getName().contains("ProxyChangeListener")) {
Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class);
Intent intent = new Intent(android.net.Proxy.PROXY_CHANGE_ACTION);
onReceiveMethod.invoke(receiver, context, intent);
} else {
for (Field field : receiverClass.getDeclaredFields()) {
if (field.getType().getName().contains("ProxyChangeListener")) {
Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class);
Intent intent = new Intent(android.net.Proxy.PROXY_CHANGE_ACTION);
onReceiveMethod.invoke(receiver, context, intent);
}
}
}
}
}
}
Log.d("Proxy", "Setting proxy successful!");
} catch (Exception e) {
Log.d("Proxy", "Setting proxy failed!");
}
}
public static boolean hasProxy(String list) {
return list.contains(":"); // proxy format: ip:port
}
public static void setProxy() throws IOException {
switch (getPrefsValue("proxy")) {
case "zaborona":
Zaborona.loadProxy();
break;
case "randomproxy":
RandomProxy.loadProxy();
break;
case "socks":
CustomSocks.loadProxy();
break;
case "http":
CustomHttp.loadProxy();
break;
case "https":
CustomHttps.loadProxy();
break;
default:
resetProxy();
break;
}
}
public static void resetProxy() {
clearProperty("https.proxyHost");
clearProperty("https.proxyPort");
clearProperty("https.proxyUser");
clearProperty("https.proxyPassword");
clearProperty("http.proxyHost");
clearProperty("http.proxyPort");
clearProperty("http.proxyUser");
clearProperty("http.proxyPassword");
clearProperty("socksProxyHost");
clearProperty("socksPortHost");
} // Reset all proxies
}
@@ -0,0 +1,84 @@
package ru.vtosters.lite.proxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.resetProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.Preferences.preferences;
import java.io.IOException;
import ru.vtosters.lite.proxy.socks.Hookzof;
import ru.vtosters.lite.proxy.socks.Jetkai;
import ru.vtosters.lite.proxy.socks.Roosterkid;
import ru.vtosters.lite.proxy.socks.TheSpeedX;
public class RandomProxy {
public static String type = preferences.getString("random_type", "none");
public static String host = preferences.getString("random_host", "");
public static boolean showProxyResult = false;
public static void loadProxy() throws IOException {
if (host.isEmpty()) {
getProxy();
loadProxy();
return;
}
switch (type) {
case "socks":
System.setProperty("socksProxyHost", host.split(":")[0]);
System.setProperty("socksProxyPort", host.split(":")[1]);
break;
case "http":
System.setProperty("http.proxyHost", host.split(":")[0]);
System.setProperty("http.proxyPort", host.split(":")[1]);
break;
case "https":
System.setProperty("https.proxyHost", host.split(":")[0]);
System.setProperty("https.proxyPort", host.split(":")[1]);
break;
}
}
public static void setupNewProxy() throws IOException {
edit().putString("random_type", "none").putString("random_host", "").commit();
resetProxy();
forceProxyApplying();
showProxyResult = true;
getProxy();
edit().putString("proxy", "randomproxy").commit();
}
public static void getProxy() throws IOException {
var random = new java.util.Random();
var randomInt = random.nextInt(7);
switch (randomInt) {
case 0:
Hookzof.loadProxy();
break;
case 1:
TheSpeedX.loadProxy();
break;
case 2:
Jetkai.loadProxy();
break;
case 3:
Roosterkid.loadProxy();
break;
case 4:
ru.vtosters.lite.proxy.http.Jetkai.loadProxy();
break;
case 5:
ru.vtosters.lite.proxy.http.TheSpeedX.loadProxy();
break;
case 6:
ru.vtosters.lite.proxy.https.Jetkai.loadProxy();
break;
case 7:
ru.vtosters.lite.proxy.https.Roosterkid.loadProxy();
break;
}
}
}
@@ -0,0 +1,76 @@
package ru.vtosters.lite.proxy.api;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isVikaProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import android.util.Log;
public class ApiProxy {
public static String linkReplacer(String link) {
var vkapi = "api.vk.com";
var oauth = "oauth.vk.com";
var vkstatic = "static.vk.com";
var proxyapi = getPrefsValue("proxyapi");
var proxyoauth = getPrefsValue("proxyoauth");
var proxystatic = getPrefsValue("proxystatic");
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
proxyoauth = VikaMobile.getOauthHost();
proxystatic = VikaMobile.getStaticHost();
}
if (!isAnyProxyEnabled() || link.isEmpty()) {
return link;
}
if (proxyapi.isEmpty() || proxyoauth.isEmpty() || proxystatic.isEmpty()) {
Log.d("VTLite", "Proxy is not set" + " " + proxyapi + " " + proxyoauth + " " + proxystatic);
return link;
}
if (link.contains(vkapi)) {
return link.replaceAll(vkapi, proxyapi);
}
if (link.contains(oauth)) {
return link.replaceAll(oauth, proxyoauth);
}
if (link.contains(vkstatic)) {
return link.replaceAll(vkstatic, proxystatic);
}
return link;
}
public static String staticFix(String str) {
var string = getPrefsValue("proxystatic");
if (isVikaProxyEnabled()) {
string = VikaMobile.getStaticHost();
}
if (isAnyProxyEnabled() && !string.isEmpty()) {
return str.replaceAll(string, "static.vk.com");
}
return str;
}
public static String getAwayPhpCom() {
var proxyapi = getPrefsValue("proxyapi");
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
}
if (isAnyProxyEnabled() && !proxyapi.isEmpty()) {
return proxyapi;
}
return "m.vk.com";
}
}

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