Compare commits

...
1329 Commits
Author SHA1 Message Date
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 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 3e9058002b 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 086210718c rounding hook fixes 2022-08-06 13:40:40 +03:00
gdlbo bc1f11da61 code imp 2022-08-06 12:49:56 +03:00
gdlbo 63075ca216 code imp 2022-08-05 23:13:35 +03:00
gdlbo 4876a881d2 DownloadUtils fixes 2022-08-05 22:24:29 +03:00
gdlbo fef7082e66 DownloadUtils 2022-08-05 21:41:34 +03:00
gdlbo 4dc7223629 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
gdlbo a31d75ea41 more folders picker 2022-08-05 20:49:09 +03:00
gdlbo efa28aa3d6 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
gdlbo f49bc4d05d 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 09333dc64d 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
gdlbo 042595f238 come imp 2022-08-04 15:49:48 +03:00
gdlbo 174151b52b 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 79fd0350e4 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 f19a4275de 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
k1zn 0a7338bf89 Fix lower case bug 2022-08-04 01:55:18 +05:00
k1zn c1197e461b 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
gdlbo 0d75bec938 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 2011901666 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
aliveoutside bfd258ba54 fix #465
added a check for "Music" folder existence
2022-08-01 16:50:29 +03:00
Vologhat e499d98050 added "likes on right" displaying mode for posts and viewers 2022-08-01 13:33:58 +03:00
gdlbo 7299c9e33a some vkui improvements 2022-08-01 01:53:50 +03:00
gdlbo 4d0573ffe5 some fixes 2022-08-01 00:48:58 +03:00
gdlbo 83d13dce1e read to feature 2022-08-01 00:39:02 +03:00
k1zn 55dbb029c0 Add translate function to catch 2022-07-31 23:01:30 +03:00
k1zn 3df51d0685 Remove %
The percentage in the text breaks the translation process, so I remove it.
2022-07-31 23:01:30 +03:00
Erik Kiznov 9bc87a1d79 Another refactoring... 2022-07-31 23:01:30 +03:00
Erik Kiznov 94667ac741 Add @ support 2022-07-31 23:01:30 +03:00
Erik Kiznov 3a354b359a Fix bug 2022-07-31 23:01:30 +03:00
Erik Kiznov 09443d6ec1 Refactoring 2022-07-31 23:01:30 +03:00
Erik Kiznov ca27776aaf Don't translate mentions
Don't translate mentions in MessagesHook
2022-07-31 23:01:30 +03:00
gdlbo 3b6cdacf96 req dumper 2022-07-31 22:26:36 +03:00
gdlbo c7621c44d5 video history delete 2022-07-31 18:33:37 +03:00
aliveoutside 89997317bf fix #450 / #547 and speed up logout 2022-07-31 18:10:30 +03:00
gdlbo c87be6c9b8 about debug activation 2022-07-31 16:58:39 +03:00
gdlbo 4ae5ea8e57 settings moment 2022-07-31 14:04:23 +03:00
gdlbo b967e72a04 cache moment 2022-07-31 13:42:50 +03:00
gdlbo cc66af3e3a deepl ded 2022-07-31 13:34:24 +03:00
Erik Kiznov f82ef2f64e Fix strings about bombs 2022-07-31 13:34:24 +03:00
Vologhat 646329f93b added translation language as argument 2022-07-31 13:34:24 +03:00
gdlbo 3f7b9eb796 some imp 2022-07-31 13:34:24 +03:00
gdlbo a3d8a9ba70 fixed gtranslate + added reply’s translate 2022-07-31 13:34:24 +03:00
gdlbo 8d05973848 some imp 2022-07-31 13:34:24 +03:00
gdlbo 2b553d263c compiling fix 2022-07-31 13:34:23 +03:00
gdlbo 265d3afbff compiling fix 2022-07-31 13:34:23 +03:00
Vologhat 858fced1aa added new translators and choicing of that 2022-07-31 13:34:23 +03:00
gdlbo a01d12b012 Update MessagesSendApiCmd.smali 2022-07-31 13:34:23 +03:00
gdlbo 8bde61b059 some fixes 2022-07-31 13:34:23 +03:00
gdlbo 05eec57058 fixed dialog 2022-07-31 13:34:23 +03:00
gdlbo c2a1a4bb5f dialog fixes 2022-07-31 13:34:23 +03:00
gdlbo 5e01ebcff6 added bombs 2022-07-31 13:34:23 +03:00
gdlbo ffe0955ef1 updated icons 2022-07-31 13:34:23 +03:00
gdlbo f4ca7c9e66 Create ic_deepl_logo_icon.xml 2022-07-31 13:34:22 +03:00
gdlbo 57b19369a0 some icons 2022-07-31 13:34:22 +03:00
gdlbo 4019219293 migrated to vkalertdialog 2022-07-31 13:34:22 +03:00
gdlbo 5d6c001dfb Update DNRInjector.java 2022-07-31 13:34:22 +03:00
gdlbo 1f2b1b1180 china number one 2022-07-31 13:34:22 +03:00
gdlbo cb7862a0e2 updated translate dialog 2022-07-31 13:34:22 +03:00
gdlbo 1cd23341e2 Update Translate.java 2022-07-31 13:34:08 +03:00
gdlbo f85dac2ff8 fixed onclick 2022-07-31 13:34:08 +03:00
gdlbo 992b29894e message hook 2022-07-31 13:34:08 +03:00
gdlbo 9e67ded6bd code imp 2022-07-31 13:34:07 +03:00
Vologhat 24607e1ea5 added messages hook and base class for translators 2022-07-31 13:34:07 +03:00
Vologhat 8e260a9de4 fixed errors 2022-07-31 13:34:07 +03:00
gdlbo de045f749a dialog 2022-07-31 13:33:42 +03:00
gdlbo fde1628fac rebase 2022-07-31 13:33:31 +03:00
Vologhat fdeaa05360 removed deepl and added yandex 2022-07-31 13:32:49 +03:00
Vologhat d0197142cd replace net to okhttp 2022-07-31 13:32:48 +03:00
gdlbo 8257393909 DeepLApi test 2022-07-31 13:32:48 +03:00
k1zn 9542317b23 Update README.md 2022-07-30 18:32:54 +03:00
gdlbo de595c93f4 fixed msg 2022-07-30 17:54:26 +03:00
gdlbo 7596b4117a deviceinfo and geodata hide feature 2022-07-30 17:37:28 +03:00
iNotFlying 8b6ef6d3af Update README.md 2022-07-30 15:48:05 +03:00
gdlbo 1d71def416 fixed adding music catalog bug 2022-07-30 13:59:54 +03:00
iNotFlying 18799ce11c Refactoring 2022-07-30 02:33:23 +03:00
gdlbo b4e34e34b1 dialog pin/unpin system (api) 2022-07-30 01:13:52 +03:00
gdlbo cd6f975e56 updated stock icon 2022-07-29 23:54:37 +03:00
aliveoutside de73c6216b Merge pull request #539 from ricoshett/vtl-remaster
добавлена быстрая навигация
размер изображений в блоке Линукса и Винды теперь одинаков
2022-07-29 18:30:14 +03:00
gdlbo 129ae95121 code beautifying 2022-07-29 16:28:49 +03:00
ricoshett 78cd5cac9a update README.md 2022-07-29 16:23:44 +03:00
aliveoutside f7fab596ba update ffmpeg-kit 2022-07-29 18:39:39 +03:00
gdlbo 85afaa5057 some java moments 2022-07-29 16:14:24 +03:00
k1zn f1ed0fc221 Fix README.md 2022-07-29 15:20:07 +03:00
aliveoutside b64b17038d Merge pull request #536 from k1zn/vtl-remaster
<!> Ignore *.md files in Github Actions
2022-07-29 14:49:54 +03:00
aliveoutside e5b5bf9d48 Update README.md (Update README.md)
Update README.md (Update README.md) (Update README.md)
2022-07-29 14:49:44 +03:00
k1zn c58e511040 Update build.yml 2022-07-29 16:41:30 +05:00
iNotFlying a067a35040 Update README.md 2022-07-29 12:52:35 +04:00
iNotFlying dbee2a5a42 Update README.md 2022-07-29 12:50:27 +04:00
iNotFlying 104ca05772 Update README.md 2022-07-29 12:30:41 +04:00
iNotFlying ad5eca635a Update README.md 2022-07-29 12:29:31 +04:00
iNotFlying 6c86b49e97 Update README.md 2022-07-29 12:17:27 +04:00
iNotFlying ad8f2b5b5a Update README.md 2022-07-29 12:15:21 +04:00
iNotFlying 3058c220a8 Update README.md 2022-07-29 12:13:31 +04:00
aliveoutside 6531a21fb4 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 3366d28e7e Fix locals + fix fields 2022-07-29 03:13:58 +05:00
k1zn 39b08702d5 Set MessagesGetConversationsApiCmd fields to public 2022-07-29 02:29:00 +05:00
k1zn b90b27e8ce 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 9b03299c7b Update README.md 2022-07-28 23:15:47 +03:00
iNotFlying a9343c6777 Update README.md 2022-07-28 23:15:47 +03:00
k1zn a03505f27f Update README.md 2022-07-28 23:15:47 +03:00
k1zn b9126aa184 Update README.md 2022-07-28 23:15:47 +03:00
k1zn 613a101c82 Update README.md 2022-07-28 23:15:47 +03:00
k1zn 43fe0577cd Update README.md 2022-07-28 23:15:47 +03:00
gdlbo 6208c966d0 added music grabber 2022-07-28 20:16:01 +03:00
gdlbo 636341b4f2 icon changed 2022-07-28 18:02:20 +03:00
gdlbo 576ce7d6b0 Revert "Temporary fix for pinned dialogs"
This reverts commit e74001e17e.
2022-07-28 17:48:31 +03:00
k1zn e74001e17e 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 48f6b35abe cache sett refactoring 2022-07-28 15:49:24 +03:00
gdlbo 5beea5d273 screenshot detect 2022-07-28 13:21:37 +03:00
gdlbo 842130628e some code improvements 2022-07-28 11:46:08 +03:00
gdlbo ab26bab35d some settings logic reworked 2022-07-28 02:24:38 +03:00
gdlbo 6ffcbe8329 some improvements of scrobbler 2022-07-28 01:41:21 +03:00
gdlbo ca3d1e9585 fixed hint text 2022-07-28 01:40:51 +03:00
gdlbo 05a9e9a12c Update Scrobbler.java 2022-07-28 00:49:39 +03:00
gdlbo 9e2f3bb048 Update Scrobbler.java 2022-07-28 00:46:52 +03:00
gdlbo 91aef33725 lastfm test 2022-07-28 00:15:41 +03:00
gdlbo 32c5aa9ac2 fixed crashreporter 2022-07-28 00:15:41 +03:00
Vologhat e32c3ec74b The great refactoring 2022-07-27 21:05:15 +03:00
gdlbo 3fea0e9c40 podcasts are dead + returned old vk pay 2022-07-27 18:03:45 +03:00
gdlbo c9c5c96d63 some pic fixes 2022-07-27 16:42:50 +03:00
gdlbo 2a91238b4f upped conv api ver 2022-07-27 15:51:30 +03:00
gdlbo e4d740061d upped vk hardcoded build number 2022-07-27 13:52:12 +03:00
gdlbo f96f2cb7d7 some music fixes 2022-07-27 13:33:47 +03:00
gdlbo 0482f75172 some default prefs fix 2022-07-26 19:21:08 +03:00
gdlbo eaed8fc752 default prefs + fix default fragment 2022-07-26 19:09:38 +03:00
gdlbo f871e63002 temp fix for a10+ 2022-07-26 18:50:45 +03:00
gdlbo 189d699d48 some deobf FileUtils (why?) 2022-07-26 18:42:13 +03:00
k1zn f3b6b3c1b0 Fix access_token regex (again) 2022-07-26 18:14:32 +03:00
k1zn 519722d613 Fix access_token regex 2022-07-26 18:14:32 +03:00
gdlbo 3aaca80da1 fix comments 2022-07-26 18:13:40 +03:00
gdlbo b889015368 fixed video catalog + deleted useless feature 2022-07-25 21:59:55 +03:00
Erik Kiznov 1d3463df0c Add VK Video new icon 2022-07-25 21:49:54 +03:00
Erik Kiznov 60ac497e6d Updated VK Music icon for all DPI 2022-07-25 21:49:54 +03:00
Erik Kiznov f8192c7169 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 3f2e0c9b98 New "Music" logo in dockbar 2022-07-25 21:49:54 +03:00
Erik Kiznov 2a9ea90df5 VK Rebranding (Part 2)
* Updated VK Logo
* Updated VK Music logo
* Updated VK Pay logo
2022-07-25 21:49:54 +03:00
gdlbo aa40bbb390 dockbar improved 2022-07-25 21:19:18 +03:00
gdlbo 4782401f0a speedup settings 2022-07-25 21:19:18 +03:00
gdlbo 0255cfb1b9 fixed open music catalog 2022-07-25 21:19:18 +03:00
gdlbo 764b68d47f fixed tgs dialog 2022-07-25 21:19:18 +03:00
gdlbo 126154fc9b deleted getAdvertisingId check + deleted vigo tracker 2022-07-25 21:19:18 +03:00
gdlbo ec2df87e42 deleted my target lib (fully) 2022-07-25 21:19:18 +03:00
gdlbo e963080385 del ad audio lib 2022-07-25 21:19:18 +03:00
Erik Kiznov 23286a21f0 VK Rebranding
This commit updates VK logo in all (maybe) pictures
2022-07-25 18:50:25 +03:00
gdlbo 4e48faec16 dockbar fixes 2022-07-25 01:53:12 +03:00
gdlbo 666c562092 some migration to VkAlertDialog 2022-07-25 01:45:32 +03:00
gdlbo 4f5cbe426a dockbar fixes 2022-07-24 22:32:35 +03:00
gdlbo 5635cd4139 size text labels 2022-07-24 20:35:56 +03:00
gdlbo 4bb31d492a bold text labels 2022-07-24 20:11:11 +03:00
gdlbo f85fe81881 dockbar colors fix 2022-07-24 19:43:26 +03:00
gdlbo 5295e465e9 some profile inj fixes 2022-07-24 16:16:17 +03:00
gdlbo 7f30e66c0c new profile buttons injector 2022-07-24 15:24:21 +03:00
Vologhat d55361fd72 added new way of music downloading 2022-07-24 02:17:20 +03:00
gdlbo 63d1c1a3b0 unlocked dockbar_tab_titles 2022-07-24 00:31:21 +03:00
gdlbo 4cc6bfabd0 fixes
foaf time is now with local timezone
fixed music starting
2022-07-24 00:02:46 +03:00
gdlbo 802f639633 foaf online 2022-07-23 21:36:37 +03:00
Vologhat 8a90602328 Update JsonInjectors.java 2022-07-22 15:52:04 +03:00
gdlbo 6f607e9ae8 Update StandartFilter.txt 2022-07-22 15:06:28 +03:00
gdlbo dd0f238701 fixed parseRepostItem fetch bug 2022-07-22 15:01:09 +03:00
gdlbo 600a9da953 speedup adblock 2022-07-22 14:42:25 +03:00
gdlbo d14dec88bc speedup adblock + logs 2022-07-22 13:55:43 +03:00
Vologhat 6e216830d1 optimized new newsfeed adblocker 2022-07-22 02:31:20 +03:00
Vologhat 2b6012b1e7 optimized new newsfeed adblocker 2022-07-22 01:42:32 +03:00
gdlbo ded283df35 speedup stories adblock 2022-07-22 00:34:47 +03:00
gdlbo 86a5c60f7f some fixes 2022-07-22 00:29:56 +03:00
gdlbo 1d964762ca new adblock (alpha) 2022-07-21 23:35:03 +03:00
gdlbo 4a2d2b23f2 unlocked custom newsfeed 2022-07-21 22:08:26 +03:00
gdlbo a06d129c8d fuck vk 2022-07-21 21:45:23 +03:00
gdlbo a0b1adbfe9 some ad fixes 2022-07-21 19:38:20 +03:00
Vologhat 0093463fae fixes in stories adblocker 2022-07-21 16:56:05 +03:00
gdlbo 9e572d7844 some ad fixes 2022-07-21 16:34:55 +03:00
gdlbo 900dbcfe0a some ad fixes 2022-07-21 15:35:13 +03:00
gdlbo e3e06d1638 new stories adblock 2022-07-21 15:30:21 +03:00
gdlbo 69a4cfa715 def catalog music 2022-07-21 14:16:22 +03:00
gdlbo 21d9c13fdf convBarRecomm 2022-07-21 12:50:46 +03:00
gdlbo 09bf8e26ce whatsnew block hide 2022-07-21 12:24:09 +03:00
Vologhat 21c0ccd9fc added feature of item state changing by swipe to dockbar and superapp editors 2022-07-21 12:00:46 +03:00
gdlbo aa95b368f8 fix superapp 2022-07-20 23:12:28 +03:00
Vologhat 4be234632c fixed chat preview 2022-07-20 22:30:23 +03:00
gdlbo 00d37e3721 some settings sorting 2022-07-20 18:40:19 +03:00
gdlbo 4c4a3ae11c vkme warn 2022-07-20 18:21:35 +03:00
gdlbo 7e09e6d4e6 google moment fix 2022-07-20 18:08:07 +03:00
Vologhat b92fa69628 added state changing by swipe for unmoved items to adapter 2022-07-20 17:55:54 +03:00
gdlbo d127a84b07 dockbar_accent is true 2022-07-20 16:50:00 +03:00
gdlbo 95916b4289 some dockbar fixes + accent 2022-07-20 16:42:28 +03:00
gdlbo 5cb5d06993 hide beta feature (need to rework tbh) 2022-07-20 15:54:32 +03:00
gdlbo f0da269968 some dockbar and superapp editor fixes 2022-07-20 15:50:37 +03:00
Vologhat 2fb021ad05 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 1981bc9d14 vkpay/games/miniapps hide feature 2022-07-20 12:24:58 +03:00
gdlbo c60cce5467 fixed vkx cringe logging 2022-07-19 21:46:38 +03:00
gdlbo 2035d513f1 updated some wrappers 2022-07-19 21:39:27 +03:00
gdlbo 3849569794 updated some wrappers 2022-07-19 21:38:17 +03:00
gdlbo 9f2f6d6f60 added playlists 2022-07-19 20:58:30 +03:00
gdlbo 586a82a15f disabled stats 2022-07-19 19:02:55 +03:00
gdlbo eba922871f music tricks kekw 2022-07-19 19:02:30 +03:00
gdlbo 337aa7493e music tricks 2022-07-19 16:52:59 +03:00
gdlbo 1ed9f871c3 Update LogWriterService.java 2022-07-19 16:52:59 +03:00
aliveoutside 083d96707c fix #453 2022-07-19 17:21:35 +03:00
aliveoutside 10e0bd50da update .gitignore 2022-07-19 15:58:57 +03:00
gdlbo 2864056186 IconsFragment fixes 2022-07-18 22:42:52 +03:00
gdlbo 8876a66449 icooooooooons! 2022-07-18 22:27:28 +03:00
gdlbo 41a1d29c4b some fixes 2022-07-18 21:44:03 +03:00
gdlbo 1bb10807c4 fix superappitems counter 2022-07-18 21:25:44 +03:00
gdlbo 7f8100660a icons 2022-07-18 15:31:25 +03:00
Vologhat 274a1b9fa8 temporary hooks disabling 2022-07-18 14:26:27 +03:00
gdlbo 03c5f83a42 fix proxy? 2022-07-18 12:50:41 +03:00
gdlbo f394bdfec5 fixed vk me mode 2022-07-18 10:38:05 +03:00
gdlbo 19c9dd102f added some new counters 2022-07-18 03:21:48 +03:00
gdlbo d38038f848 fixed friends hide with birthday 2022-07-18 01:53:56 +03:00
Vologhat 8ab5cdd860 fixed dockbar counters #449 2022-07-18 01:35:26 +03:00
Vologhat 2f30d070ec fixed scroll to top feature 2022-07-18 01:13:14 +03:00
gdlbo 401fc44e91 fixed ExternalLinkHandler 2022-07-17 23:31:43 +03:00
Vologhat 028b3aad59 fix external player crash in vkplayer 2022-07-17 22:31:29 +03:00
gdlbo 8a7c21c549 updated some strings 2022-07-17 21:18:27 +03:00
Vologhat 918967f502 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 95636ad4f4 some settings summ fixes 2022-07-17 16:59:36 +03:00
gdlbo 561afe8765 counters 2022-07-17 15:21:19 +03:00
gdlbo 929e481b3d fixed stickers dialog 2022-07-17 15:21:06 +03:00
gdlbo 69266ed31f fixed live tab + imports 2022-07-17 13:54:23 +03:00
gdlbo 742e0c46b3 some dockbar fixes 2022-07-17 13:21:46 +03:00
gdlbo 319f3c421a updated StandartFilter.txt 2022-07-17 11:37:18 +03:00
gdlbo 3b5eb3cd10 some dockbar fixes 2022-07-17 11:14:45 +03:00
gdlbo 55f71bfd8b added tgsbotkey check if not valid 2022-07-17 11:08:32 +03:00
gdlbo 1ac755a98b some dockbar fixes 2022-07-17 11:03:45 +03:00
gdlbo 00d0b9d237 fixed saving settings 2022-07-17 10:56:04 +03:00
Vologhat edd04586ea make shorter external player string in action menu 2022-07-17 08:42:17 +03:00
gdlbo 98b1cf8db3 some settings fixes 2022-07-17 00:18:22 +03:00
gdlbo d20296d4b8 some settings fixes 2022-07-16 23:42:10 +03:00
gdlbo 7c8627f9f6 dockbar fixes 2022-07-16 23:26:19 +03:00
gdlbo 2e2be2fe4a added disabler of OnlineFormatter 2022-07-16 23:02:38 +03:00
Vologhat 673d5fe16c fix #443 2022-07-16 18:07:54 +03:00
aliveoutside 4a949e7d45 [musicdownloader] increase the audio quality 2022-07-16 20:01:25 +03:00
aliveoutside 39391a4ace [musicdownloader] fix previous commit 2022-07-16 19:43:16 +03:00
aliveoutside 9a9552c369 [musicdownloader] show the download progress in notifications 2022-07-16 19:39:10 +03:00
Vologhat 6b9f80284c dockbar editor fixes 2022-07-15 17:39:25 +03:00
gdlbo 15dd2b2fde some hooks refactoring 2022-07-15 11:09:15 +03:00
aliveoutside 4b2a537e3b fix vkx integration 2022-07-15 02:39:17 +03:00
gdlbo a94ca687eb Update CopyrightAds.txt 2022-07-14 23:00:00 +03:00
gdlbo 06f0864cc3 fix getVoiceListened 2022-07-14 22:33:13 +03:00
gdlbo 1ddc2f6b14 fixed dialog style in tgs and PreferencesUtil 2022-07-14 22:12:23 +03:00
Vologhat ad6c350e69 changed dockbar editor logic
- Changed data storage method
- Added json config check
- Some optimizations
2022-07-14 22:10:37 +03:00
gdlbo dadbc37189 Update MsgMarkAsListenedJob.smali 2022-07-14 21:50:40 +03:00
gdlbo d646a0cd19 getVoiceListened inj 2022-07-14 21:48:58 +03:00
gdlbo ae145691c5 Fixed vkx inj + some fixes 2022-07-14 21:15:29 +03:00
Vologhat a6cbf35350 fix #416 2022-07-14 20:09:46 +03:00
Vologhat aba12ad48a added base fragment with toolbar implementation 2022-07-14 20:09:20 +03:00
Vologhat 32ebf0e4f4 added layout helper 2022-07-14 20:08:52 +03:00
gdlbo 099de74ac1 miniapps hide feature 2022-07-14 19:27:53 +03:00
gdlbo dd490abf69 hide friends recomm in friends 2022-07-14 18:27:10 +03:00
gdlbo 3468b9352e android:debuggable="false" 2022-07-14 12:15:00 +03:00
gdlbo af0efb7184 Update build.gradle 2022-07-14 02:44:53 +03:00
gdlbo 592d25bf6d Update build.gradle 2022-07-14 02:36:36 +03:00
gdlbo a53f1d7299 disabled force miui dark theme 2022-07-14 01:43:15 +03:00
gdlbo ea3707cebd added check for android sdk 26 to get adaptive icon 2022-07-14 01:37:27 +03:00
gdlbo b2ba9774bc some codebase to future update with support no adaptive icons 2022-07-14 01:34:11 +03:00
gdlbo 7205c78839 Update DockBarEditorFragment.java 2022-07-14 01:12:55 +03:00
gdlbo 26672cfbc2 Update build.gradle 2022-07-14 01:12:52 +03:00
gdlbo 941335ec02 added splashscreen for < Android 12
pls check
2022-07-14 00:35:14 +03:00
gdlbo 8bbf0ebb1f added cleaning web cache for theme changing 2022-07-14 00:13:56 +03:00
gdlbo 9d16d4e57e deleted some useless and dead vk features 2022-07-13 23:45:57 +03:00
gdlbo cece5a2a55 disabled feature 2022-07-13 19:07:42 +03:00
gdlbo fb907d68a4 dnt inj 2022-07-13 19:03:44 +03:00
gdlbo dac2e10a52 recomm disabler 2022-07-13 18:49:45 +03:00
gdlbo 0e472e985b fixed crash + added notifs about verif 2022-07-13 18:41:41 +03:00
gdlbo e349193afb Update IconsFragment.java 2022-07-13 18:06:31 +03:00
Vologhat 066beb14f1 Update IconsFragment.java 2022-07-13 17:57:48 +03:00
gdlbo 15f8af1e3e icon manager test dead 2022-07-13 17:41:44 +03:00
gdlbo 599ee3dfab VideoDownloader fix 2022-07-13 17:26:29 +03:00
gdlbo 9d005cd2e0 Update TokenConfirmationHandlerChainCall.smali 2022-07-13 15:29:07 +03:00
gdlbo c8747ea957 fix 2022-07-13 15:18:31 +03:00
gdlbo 6bc33dbb31 some connection fixes 2022-07-13 15:05:13 +03:00
Vologhat 303fe83ff9 added vk video opening externally 2022-07-13 13:21:40 +03:00
Vologhat cb122bb6c8 added external player redirection 2022-07-13 05:34:22 +03:00
Vologhat bb73aaa580 fixed toolbar visibility 2022-07-13 04:20:02 +03:00
gdlbo 7e7730e825 codebase for future multiple list pref with appnames and icons 2022-07-13 01:28:15 +03:00
aliveoutside 8f291b058f [musicdownloader] hook track bottomsheet 2022-07-13 04:23:58 +03:00
gdlbo 0f9ab88e68 Update OtherFragment.java 2022-07-13 01:10:50 +03:00
gdlbo 36c244be15 some backup fixes 2022-07-13 01:03:04 +03:00
gdlbo 71d4cd09fc added some icons 2022-07-13 00:50:17 +03:00
Vologhat 037f1809e8 added restore prefs from file 2022-07-13 00:30:37 +03:00
Vologhat 3513844ca5 optimizations 2022-07-12 23:58:00 +03:00
Vologhat 2e180d2c9c added vkme mode checker 2022-07-12 23:49:53 +03:00
Vologhat fd3eae0283 fixed dockbar counter 2022-07-12 23:14:51 +03:00
gdlbo 048a835b2b icons fix 2022-07-12 23:11:45 +03:00
Vologhat e144390d4f refactored icon switcher 2022-07-12 23:08:41 +03:00
gdlbo 320892cdf5 added all to manifest 2022-07-12 23:04:29 +03:00
gdlbo 1716aa51dd some fixes 2022-07-12 22:45:14 +03:00
gdlbo 7157a0c664 icon changer test
appname cursed
2022-07-12 21:55:20 +03:00
gdlbo 34787ffb5b added resources 2022-07-12 19:32:50 +03:00
gdlbo d44b363d1d null check 2022-07-12 18:29:59 +03:00
gdlbo 3972ceba5b network check 2022-07-12 18:27:35 +03:00
gdlbo 505a2d4553 some fragments in dockbar fixes 2022-07-12 17:42:46 +03:00
gdlbo 84da0b422a superapp disabler fix 2022-07-12 17:34:04 +03:00
gdlbo ab19f6b71a new vkpay lol 2022-07-12 17:25:02 +03:00
gdlbo 9c8f962e5f some sticker fixes 2022-07-12 16:28:00 +03:00
gdlbo ad706355cd some filter fixes 2022-07-12 16:15:11 +03:00
gdlbo efac38a871 added some effects) 2022-07-12 15:49:02 +03:00
gdlbo 049940f3bb some filters fix + added more filters codebase 2022-07-12 15:21:05 +03:00
aliveoutside 5f68809d9c use track id as a temp folder name 2022-07-12 17:37:08 +03:00
gdlbo 930792f983 monochrome wp 2022-07-12 14:14:10 +03:00
gdlbo 5e7eb51127 mosaic effect 2022-07-12 13:46:04 +03:00
gdlbo 99a387f9a0 fixed crash 2022-07-12 12:42:09 +03:00
gdlbo 679960045a some fragments fixes 2022-07-12 12:12:48 +03:00
gdlbo 1dc1436082 restart app when dark theme changed to amoled 2022-07-12 11:11:47 +03:00
gdlbo 2ba602ae9f restart app when milkshake val changed 2022-07-12 11:00:18 +03:00
gdlbo 98aa6ef0f8 disabled force dark theme for miui 2022-07-12 10:58:17 +03:00
gdlbo b8f5b0179a fixed milkshake changer 2022-07-12 00:00:54 +03:00
gdlbo 877670bb84 Update DockBarManager.java 2022-07-11 23:21:48 +03:00
Vologhat 5859b93612 Update DockBarManager.java 2022-07-11 21:59:05 +03:00
gdlbo 0f33dfc395 codesyle cringe 2022-07-11 21:14:02 +03:00
gdlbo 0330b8ad8e lmao 2022-07-11 21:11:17 +03:00
gdlbo 7d85d61eb5 fix dockbar 2022-07-11 20:58:45 +03:00
aliveoutside 28ee64fc30 create notifications for music downloading 2022-07-11 23:02:10 +03:00
gdlbo 19bc27059d Update BottomNavigationMenu.smali 2022-07-11 20:00:53 +03:00
gdlbo 457822de7d Update CopyrightAds.txt 2022-07-11 19:57:37 +03:00
Vologhat 4c5d83fccc refactored dockbar editor 2022-07-11 19:57:03 +03:00
gdlbo 92c9ea2222 Update WallpaperMenuFragment.java 2022-07-11 19:35:07 +03:00
gdlbo e6b7ea8c2c Update WallpaperMenuFragment.java 2022-07-11 19:34:28 +03:00
gdlbo 81bc85a0aa added stickers background if wallpaper is not null 2022-07-11 19:28:48 +03:00
gdlbo f9b02b1cce fix dark toast lmao 2022-07-11 19:17:23 +03:00
gdlbo 2cb6321776 fixed dialog style 2022-07-11 19:11:51 +03:00
gdlbo bbf0ada834 fixed auth proxy dialog 2022-07-11 17:56:03 +03:00
aliveoutside 8c63ff69c7 check if ffmpeg converted successfully 2022-07-11 20:14:34 +03:00
aliveoutside 94c72eb490 finish music downloader 2022-07-11 19:55:04 +03:00
aliveoutside d1f2a78a48 fix ts to mp3 converter 2022-07-11 19:26:05 +03:00
aliveoutside 2983afcda5 update ffmpeg libs for mp3 support 2022-07-11 19:25:41 +03:00
aliveoutside fe87a5dd64 fix ffmpeg loading 2022-07-11 18:07:22 +03:00
gdlbo 9daa346e31 dialog design fixes 2022-07-11 14:36:22 +03:00
gdlbo 816683ac8a disabled dockbar hook 2022-07-11 13:30:02 +03:00
gdlbo b90fd41bf2 added dev ver mark 2022-07-11 13:18:32 +03:00
gdlbo 991f1f9eb8 Update Globals.java 2022-07-11 13:13:17 +03:00
gdlbo 2ae9df03e1 fixed player on gappless phones 2022-07-11 13:08:37 +03:00
gdlbo 665e2dda05 added proxy button at start 2022-07-11 13:02:31 +03:00
gdlbo a5134f1cd5 writebar coloring 2022-07-11 11:26:05 +03:00
gdlbo 3680ff44a2 Some animation fixes 2022-07-11 02:58:43 +03:00
gdlbo 34ae44016d some wp fixes 2022-07-11 02:20:19 +03:00
gdlbo a0ebc913d1 fixed some cringe blur 2022-07-11 01:38:22 +03:00
gdlbo 1afa317e7b Wallpaper in msg
Upgraded dialogs opening
2022-07-11 01:29:55 +03:00
aliveoutside 84c194d318 try to do ffmpeg convert 2022-07-11 01:34:28 +03:00
aliveoutside 56cd2b2d39 add some missing classes 2022-07-11 01:34:28 +03:00
aliveoutside b001517a63 add some missing classes 2022-07-11 01:34:27 +03:00
aliveoutside cd389af2bd update build.gradle 2022-07-11 01:34:27 +03:00
aliveoutside 69a2f03656 add ffmpeg wrapper 2022-07-11 01:34:27 +03:00
aliveoutside 047b547449 add ffmpeg lib 2022-07-11 01:34:27 +03:00
aliveoutside 0912f57184 add libs to assets 2022-07-11 01:34:27 +03:00
gdlbo 568f69db60 Update GroupApiParser.smali 2022-07-10 19:16:43 +03:00
aliveoutside 511c16771d fix permissions in AudioDownloader 2022-07-10 22:08:58 +03:00
gdlbo 321273c54a Renames for profiles and groups 2022-07-10 19:01:25 +03:00
gdlbo f6e0a7edb4 Fix 2022-07-10 17:49:59 +03:00
gdlbo dd9b2a8a58 menu inj test 2022-07-10 17:48:39 +03:00
Vologhat 77f80883ae add method check 2022-07-10 17:31:09 +03:00
Vologhat ec5b8b3455 added asyns downloading 2022-07-10 16:37:31 +03:00
gdlbo cd611afbd3 Update vt_ui_oled.css 2022-07-10 16:03:42 +03:00
gdlbo 943c612581 amoled theme wtf 2022-07-10 16:01:04 +03:00
aliveoutside 2ed8082df2 test m3u8 downloader 2022-07-10 18:32:02 +03:00
gdlbo 4806d97e29 fixed crash at start 2022-07-10 15:25:19 +03:00
gdlbo c603c9844a updated jars + added amoled theme values to code 2022-07-10 14:52:23 +03:00
aliveoutside a3b1220f18 move some stuff to music package 2022-07-10 17:35:10 +03:00
gdlbo 18582c535a reformated code 2022-07-10 14:32:27 +03:00
Vologhat d002d05b2a M3U8 Dumper 2022-07-10 14:11:27 +03:00
gdlbo c198a14e0c Some online fixes 2022-07-10 10:54:25 +03:00
gdlbo deda04cbf8 Update OnlineFormatter.java 2022-07-10 04:05:03 +03:00
gdlbo 021e85d5b8 Update OnlineFormatter.java 2022-07-10 03:21:35 +03:00
gdlbo 0921485959 added appid saving + some fixes 2022-07-10 01:38:14 +03:00
aliveoutside 82aacf32b7 - Дашь списать домашку?
- Да, только не списывай точь-в-точь
-
2022-07-10 04:14:55 +03:00
gdlbo e7b0ae0225 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-07-10 01:08:41 +03:00
aliveoutside 2fb7778717 m3u8 shit 2022-07-10 04:07:02 +03:00
gdlbo a993993773 imports 2022-07-10 01:08:19 +03:00
gdlbo 6f49e35b22 Added local caching appid names 2022-07-10 01:07:55 +03:00
gdlbo ea277c303f VideoDownloader inj 2022-07-09 22:40:56 +03:00
gdlbo a7652e4e71 Fixed bug with reload mgs on old design on sdk 28+ 2022-07-09 22:18:28 +03:00
gdlbo 5cb7306613 Update StoryDownloader.java 2022-07-09 22:03:20 +03:00
gdlbo 1ddecb47af Stories video downloader 2022-07-09 21:59:42 +03:00
gdlbo ac2c972b9b some stories download fixes 2022-07-09 21:24:35 +03:00
gdlbo 86798ffb59 disabled fixGapps 2022-07-09 20:47:18 +03:00
gdlbo a85a7d84b2 isMusicRestricted must be true by default 2022-07-09 20:26:49 +03:00
gdlbo 1ed90da1b8 Update VideoDownloader.java 2022-07-09 20:22:38 +03:00
gdlbo a2b231f365 Update VideoDownloader.java 2022-07-09 20:19:05 +03:00
gdlbo a618b2cc5b check if link is not valid 2022-07-09 20:18:31 +03:00
gdlbo 4e4c287111 Video downloader in settings 2022-07-09 20:09:02 +03:00
gdlbo 060f24b6c6 updated jars 2022-07-09 19:48:22 +03:00
gdlbo d3840bf9fd renamed music to media settings + some settings refactoring 2022-07-09 19:48:06 +03:00
gdlbo ba216cb06b Update Newsfeed.java 2022-07-09 19:31:11 +03:00
gdlbo 917f5b565f Some settings logic fixes 2022-07-09 18:47:32 +03:00
gdlbo 938c6ff633 fixed poll if 2022-07-09 16:03:28 +03:00
gdlbo 56bf382618 show poll results 2022-07-09 15:58:38 +03:00
gdlbo eb3cc75a98 updated jars 2022-07-09 15:58:18 +03:00
gdlbo f3e3cdf79a fix msg db 2022-07-09 15:26:37 +03:00
gdlbo ad808263d1 Story downloader test
video download dead xd
2022-07-09 15:13:13 +03:00
gdlbo 53616c8bc6 updated jars 2022-07-09 15:12:45 +03:00
gdlbo 466105d69c Update NavigationDelegateBottom.smali 2022-07-08 14:29:07 +03:00
gdlbo 64c9cff0bb VK Me mode inject 2022-07-08 14:10:27 +03:00
gdlbo 8fbbf8b6be kostil for dockbak lol 2022-07-08 13:58:26 +03:00
gdlbo 6c0d5619e4 inj dockbar 2022-07-08 13:36:25 +03:00
gdlbo c3c41f9d2e Fixed feed cache toggle 2022-07-08 11:03:15 +03:00
gdlbo a154138fb5 Video redesign optional 2022-07-08 11:00:03 +03:00
gdlbo 0bf6821a4b Update Toggles.java 2022-07-08 10:55:08 +03:00
gdlbo 470ac9dd4d VTSettings fixes
fixed design
fixed proxy type null
2022-07-08 10:49:12 +03:00
gdlbo b68b10f776 Update DockBarManager.java 2022-07-08 10:35:26 +03:00
gdlbo c06f2588a8 Update DockBarManager.java 2022-07-08 10:31:35 +03:00
gdlbo f6ade7a059 Update DockBarManager.java 2022-07-07 21:38:42 +03:00
gdlbo 08d7851de3 Fixed dockbar color?, fixed double vt icons 2022-07-07 20:37:49 +03:00
gdlbo 78902110eb fixed R.java.......... 2022-07-07 20:14:37 +03:00
gdlbo b7b9de4ba4 Revert "Update public.xml"
This reverts commit 487cb6c076.
2022-07-07 19:48:48 +03:00
gdlbo 83014931dc IconManager manifest inject 2022-07-07 19:18:02 +03:00
gdlbo 46edd53cb6 Fixed AndroidManifest 2022-07-07 19:12:31 +03:00
Vologhat 87b1251f5a Update R.java 2022-07-07 19:02:00 +03:00
gdlbo 4ce73d9e55 Update IconManager.java
fixed logic
2022-07-07 16:41:58 +03:00
gdlbo 4541ef61c1 Update IconManager.java 2022-07-07 16:40:40 +03:00
gdlbo 4f3f26e3f5 Update IconManager.java 2022-07-07 16:33:14 +03:00
gdlbo 1f235bfc4a Update IconManager.java 2022-07-07 16:30:24 +03:00
gdlbo 548a029db2 IconManager codebase 2022-07-07 16:26:19 +03:00
aliveoutside 6d1b964239 hook dockbar 2022-07-07 16:37:26 +03:00
gdlbo 487cb6c076 Update public.xml 2022-07-07 13:16:36 +03:00
gdlbo 5a372f6c60 Update R.java 2022-07-07 11:51:39 +03:00
gdlbo 81f954d25a fix download icon for tgs 2022-07-07 11:39:29 +03:00
aliveoutside ec3248f5c3 telegram stickers doesn't look like shit now 2022-07-07 04:58:27 +03:00
gdlbo c959d5e5d6 tgs inj 2022-07-06 18:07:49 +03:00
Vologhat 49798694b2 fixed crashes in StickersFragment 2022-07-06 17:39:39 +03:00
gdlbo 3879555297 some music fixes 2022-07-06 11:40:02 +03:00
gdlbo fc11e2d055 Update VTSettings.java 2022-07-06 10:04:57 +03:00
gdlbo 4905e8fed0 updated superapp in settings 2022-07-06 09:58:04 +03:00
Vologhat 9a02f2a7c3 fixed superapp injector 2022-07-05 20:51:02 +03:00
Vologhat 03014f245c fixed profile hiding 2022-07-05 20:43:20 +03:00
Vologhat 13f247467c optimizations 2022-07-05 20:11:06 +03:00
gdlbo 5116f507c5 Update ProfileHide.java 2022-07-05 16:28:17 +03:00
gdlbo 228e6ea282 profile hide inj test
profiles dead lmao
2022-07-05 16:25:01 +03:00
gdlbo 7663d4cee2 Update JsonInjectors.java 2022-07-05 15:11:24 +03:00
gdlbo 4e003d355e Update JsonInjectors.java 2022-07-05 15:00:31 +03:00
gdlbo 75982656b1 upgraded convBar ext + added debug link 2022-07-05 14:51:44 +03:00
gdlbo 2f12cb188f Update Proxy.java 2022-07-05 13:11:24 +03:00
gdlbo 46cd9c0582 Update Proxy.java 2022-07-05 13:07:32 +03:00
gdlbo 8be76aa871 proxy fixes 2022-07-05 13:02:24 +03:00
gdlbo 9d9c02bec5 Some settings + proxy fixes 2022-07-03 14:11:33 +03:00
gdlbo 30faa329e9 Fix proxy summ for vt settings 2022-07-03 13:39:22 +03:00
gdlbo 0a9322741c Fix crash for android 5, 5.1, 6 + added cute icon for superapp editor 2022-07-03 13:33:27 +03:00
gdlbo f68cc4a6bd fixed scaling pic 2022-07-02 14:00:54 +03:00
gdlbo 0717fd960e Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-07-02 12:55:27 +03:00
gdlbo 0dcb2b8fd7 fixed rounding pic 2022-07-02 12:55:17 +03:00
gdlbo 2581b5a1a2 Merge pull request #410 from k1zn/vtl-remaster 2022-07-02 08:19:27 +03:00
k1zn 36cd21f7f6 Fix Russian music subscription string 2022-07-02 02:00:06 +05:00
k1zn e09a6291fe Fix Ukrainian music subscription string 2022-07-02 01:59:30 +05:00
gdlbo f800dffb5f music subs warning 2022-07-01 15:41:35 +03:00
gdlbo 86ba91a77e deleted useless feature 2022-07-01 15:37:59 +03:00
gdlbo 6aade65b4b fixed loopedanimstickers pref 2022-07-01 14:55:31 +03:00
gdlbo ba1aeeb4b1 Loop anim stickers test 2022-07-01 14:45:05 +03:00
gdlbo 4467abc181 added more font sizes 2022-07-01 14:29:52 +03:00
gdlbo 75960a7631 Fixes
Deleted unused code
Fixed some settings
Sorted toggles features
2022-07-01 14:24:16 +03:00
Vologhat 8209aa6fdf added backup settings in test mode 2022-06-30 19:47:11 +03:00
gdlbo 38bcd40ad6 fixed some toggles 2022-06-30 17:55:09 +03:00
gdlbo dbc358d0a0 superapp editor test 2022-06-30 17:40:20 +03:00
gdlbo dcb2244498 Update JsonInjectors.java 2022-06-30 14:33:05 +03:00
Vologhat e3b6bd8219 fixed fox1d code 2022-06-30 14:20:31 +03:00
aliveoutside 07f1f62fb7 fix ne4italki popup menu 2022-06-30 01:59:33 +03:00
aliveoutside 89f94df42b yes milkshake 2022-06-30 01:44:28 +03:00
gdlbo b3197aa921 startfragment inj 2022-06-29 20:31:31 +03:00
gdlbo cfc2c67efc Update SuperAppPresenter.smali 2022-06-29 20:29:27 +03:00
gdlbo d3b1e6e075 superapp inj
without superapp editor
2022-06-29 20:20:49 +03:00
gdlbo b221a8d55d no shopping v2 2022-06-29 18:49:15 +03:00
gdlbo 9cc6d4f8e0 no shopping anymore in stock menu 2022-06-29 18:03:02 +03:00
gdlbo 1a0a24df45 Fixed crash in interface sett 2022-06-29 17:56:32 +03:00
gdlbo f74b2b1acf fixed translation 2022-06-29 17:46:33 +03:00
gdlbo c7b5b7d6ca More animations :) 2022-06-29 17:42:51 +03:00
gdlbo 215d747dad Test fix anim crash in My Stickers 2022-06-29 17:41:29 +03:00
gdlbo c10b3e5619 anim inj 2022-06-29 17:08:51 +03:00
gdlbo f03d4892a2 fixed imports 2022-06-29 16:49:15 +03:00
gdlbo 6c84540a5d fix 2022-06-29 16:40:44 +03:00
gdlbo 664e1fe428 deleted some unused code 2022-06-29 16:08:29 +03:00
gdlbo 328b2caecb do not seen stories inj 2022-06-29 16:03:17 +03:00
gdlbo 0799757097 showmenu inj 2022-06-29 15:46:25 +03:00
gdlbo 8c9fee306f disable videofeed inj 2022-06-29 15:39:50 +03:00
gdlbo c23624ab11 milkshake disabled by default + disabled welcome banner on milkshake 2022-06-29 15:29:13 +03:00
gdlbo ea4315274b fixed msgs 2022-06-29 13:49:43 +03:00
gdlbo 947183ff02 Maybe fix msg 2022-06-29 13:28:22 +03:00
gdlbo dbe80696d6 Update StandartFilter.txt 2022-06-29 12:02:39 +03:00
gdlbo 1296ab56a7 Refactored reposts adblock + updated filter 2022-06-29 11:53:24 +03:00
gdlbo bda751e692 updated filters 2022-06-29 11:47:44 +03:00
gdlbo 5135cfa347 some important fixes 2022-06-29 01:21:05 +03:00
aliveoutside c450ef7f87 update apktool 2022-06-28 19:57:25 +03:00
aliveoutside bd470aba41 inject ne4italki into dialog menu 2022-06-28 19:57:25 +03:00
gdlbo 3435531cb2 Updated Toggles 2022-06-28 01:27:44 +03:00
gdlbo e784f8a27b Update Toggles.java 2022-06-28 01:05:45 +03:00
gdlbo 96e9579bbf fixed crash in music + added disabler milkshake 2022-06-27 23:55:57 +03:00
aliveoutside 36432e0c80 ne4italki 2022-06-27 20:54:04 +03:00
gdlbo b58a918f27 toggles redirect 2022-06-27 19:45:51 +03:00
gdlbo e8753831b6 ServerDialog disabler 2022-06-27 18:40:11 +03:00
gdlbo 7068600d3d covbar inj test 2 2022-06-27 17:58:30 +03:00
gdlbo b9443f0d78 covbar inj test 2022-06-27 16:47:41 +03:00
gdlbo 3ca54043d8 fixed adfilter 2022-06-27 15:26:37 +03:00
gdlbo e672a6dcf4 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 453d90827b Update build.yml 2022-06-26 20:55:30 +03:00
gdlbo 13f68a3b12 Messages -> Chats 2022-06-26 20:50:36 +03:00
gdlbo 07a26092ae Merge pull request #392 from iNotFlying/vtl-remaster 2022-06-26 17:49:40 +03:00
iNotFlying 57b6ba04b3 Telegram icon fix 2022-06-26 18:47:55 +04:00
gdlbo cf744757b6 Update FriendsGetRecommendationsWithMutual.smali 2022-06-26 17:04:33 +03:00
gdlbo 59afe0a412 Merge pull request #391 from iNotFlying/vtl-remaster 2022-06-26 16:40:12 +03:00
iNotFlying 488eb7c0ea New icons 2022-06-26 16:35:03 +04:00
gdlbo 2a7af94f10 Update OnlineFormatter.java 2022-06-25 20:29:41 +03:00
gdlbo 1922863723 Update OnlineFormatter.java 2022-06-25 20:27:02 +03:00
gdlbo 1259231653 Update OnlineFormatter.java 2022-06-25 20:15:28 +03:00
gdlbo ba8d3c42a1 updated Online Formatter 2022-06-25 20:13:58 +03:00
gdlbo ab851d3600 Custom online detection
need to do make requests to get appid name from vk
2022-06-25 19:39:34 +03:00
gdlbo b80213a017 ServerDialog upgraded 2022-06-25 15:36:44 +03:00
gdlbo 8cb4bb0a55 ServerDialog upgraded 2022-06-25 15:36:10 +03:00
gdlbo 58cddd18e2 ServerDialog null check 2022-06-25 14:50:12 +03:00
gdlbo 67c0a3eed4 ServerDialog impl 2022-06-25 14:41:42 +03:00
gdlbo e7c7dae411 fixed verifications 2022-06-25 12:39:17 +03:00
gdlbo f66d2af98a fixed number rounding in groups 2022-06-25 12:28:12 +03:00
gdlbo dc3e6293ee fixed number rounding in groups 2022-06-25 12:24:31 +03:00
gdlbo 05397f69d0 fixed crash 2022-06-25 12:13:18 +03:00
gdlbo 9f341eb485 fixes of music and debug 2022-06-25 12:05:22 +03:00
gdlbo e944f5bdf5 fixes of music and debug 2022-06-25 12:05:15 +03:00
gdlbo a0a34d138f fixed crashreport icon 2022-06-25 12:01:26 +03:00
gdlbo 4b55279c84 added install permission 2022-06-25 11:57:57 +03:00
gdlbo b5a7852f2e fixed ota requests 2022-06-25 11:55:56 +03:00
gdlbo b675834a6f deleted benchmark tracker + fixes 2022-06-25 11:46:05 +03:00
gdlbo 09e509e48f deleted music tracker 2022-06-25 11:33:37 +03:00
gdlbo e2b6a3a75e fixed profile open 2022-06-25 11:11:34 +03:00
gdlbo dc4c31d66a fixed libvoip lib 2022-06-25 11:00:11 +03:00
gdlbo abeb31f4f0 fixes of LinkProcessorKt 2022-06-25 10:52:05 +03:00
gdlbo c7b91b62e6 added some redirects to settings 2022-06-25 10:30:56 +03:00
gdlbo 648369b7cd added support to open links from m.vk.com 2022-06-25 09:23:01 +03:00
gdlbo 3f834cc83b Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-25 09:19:06 +03:00
gdlbo 4dd5f13b3a gmap fix + added needed activities and services 2022-06-25 09:18:56 +03:00
gdlbo faea96a786 gmap fix 2022-06-25 09:11:33 +03:00
aliveoutside 7882968a05 vkx integration 2022-06-25 04:05:11 +03:00
gdlbo d6595f54f1 newsfeed filter inj to NewsfeedCustomGet 2022-06-25 01:06:00 +03:00
gdlbo 6f1ba0ca9f stories ads inj 2022-06-25 00:30:01 +03:00
gdlbo daee7c8665 awayphp inj 2022-06-25 00:28:08 +03:00
gdlbo dd591ee78b added donate button 2022-06-25 00:22:15 +03:00
gdlbo f72ff25ebe inj refresh newsfeed 2022-06-24 23:44:39 +03:00
gdlbo 04cf3b1b8a swipe stories inj 2022-06-24 23:41:28 +03:00
gdlbo 0cd82deaa6 dockcounter inj 2022-06-24 23:41:13 +03:00
gdlbo 826b566540 alteremoji inj 2022-06-24 23:33:31 +03:00
gdlbo a2018f85b4 system emoji inj 2022-06-24 23:26:06 +03:00
aliveoutside f48e05badb fix init 2022-06-24 23:21:45 +03:00
gdlbo 21ad47b45b fixed some settings logic for stupid users 2022-06-24 23:20:43 +03:00
gdlbo ea54706e8b added date formatter + deleted some unused code 2022-06-24 23:14:51 +03:00
gdlbo db6c23d511 chat count load inj + fixes 2022-06-24 22:54:56 +03:00
gdlbo d06396a51d date formatter in chats 2022-06-24 22:53:28 +03:00
gdlbo bc5cc9b6f6 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-24 22:37:47 +03:00
gdlbo b05d6fb22b value rounding 2022-06-24 22:37:40 +03:00
aliveoutside 3144dd07e8 hooked stories disabler 2022-06-24 22:13:48 +03:00
gdlbo 247627fe08 shortpost 2022-06-24 22:07:18 +03:00
gdlbo 32668111e1 fixed dialogs load 2022-06-24 20:27:43 +03:00
gdlbo c3848fdbba upped vk ver 2022-06-24 20:02:23 +03:00
gdlbo 834367ea65 getDrawableFromUrl fix 2022-06-24 19:41:08 +03:00
gdlbo 7f9e5aa11e fix summ in feed 2022-06-24 13:31:16 +03:00
gdlbo 5554b5197a added filter for copyright links 2022-06-24 13:27:59 +03:00
aliveoutside a0e504a834 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-24 13:03:11 +03:00
gdlbo f5d4892ba6 added filter for copyright links 2022-06-24 11:54:35 +03:00
gdlbo 32e807e130 fixed ads in discover 2022-06-24 11:43:38 +03:00
gdlbo d7ff759cde added app version to about 2022-06-24 10:49:25 +03:00
gdlbo fc4f8056c5 renamed some strings 2022-06-24 10:39:31 +03:00
gdlbo 7b073523fa added proxied static and oauth + refactored by copilot 2022-06-24 10:37:49 +03:00
gdlbo 7205be3749 vk api proxy inj 2022-06-24 09:38:57 +03:00
gdlbo e1915e19a3 voice inject 2022-06-24 09:31:29 +03:00
gdlbo 4da341ccf8 pic compress inject 2022-06-24 09:27:27 +03:00
gdlbo 6ef958a606 pic compress inject 2022-06-24 09:27:18 +03:00
aliveoutside a5811047d9 implement messages undeleter (via reflection for now) 2022-06-24 03:56:12 +03:00
gdlbo 75e562e92f changed codestyle 2022-06-23 17:31:32 +03:00
gdlbo 75d537f36a added reload msg feature 2022-06-23 00:56:32 +03:00
gdlbo b68812109c added multiacc + updated jars 2022-06-23 00:19:57 +03:00
gdlbo 44d0f31f93 fixed ru locale 2022-06-22 23:27:42 +03:00
gdlbo b5d5b87779 fixed ssl by default 2022-06-22 23:22:14 +03:00
gdlbo cf180f5146 fixed some settings 2022-06-22 23:21:02 +03:00
gdlbo 430c1686c0 ru locale 2022-06-22 23:20:32 +03:00
gdlbo d1d4bb1f5b fixed auto detect theme + fixes of debug 2022-06-22 23:09:05 +03:00
gdlbo 03561407a3 fixed workflow compiling 2022-06-22 23:00:55 +03:00
gdlbo a9c2c6945b fixed windows compiling 2022-06-22 23:00:26 +03:00
gdlbo 6ae59e0557 fixed proxy tab 2022-06-22 22:59:33 +03:00
gdlbo b1c2c785f3 fixed auth + added old prefs to debug 2022-06-22 22:52:28 +03:00
gdlbo aa0c2a7093 updated jars 2022-06-22 20:44:08 +03:00
gdlbo 987379b7a2 updated themes and disabled auto theme (dead) 2022-06-22 20:43:57 +03:00
gdlbo 7ee38e27d3 fixes themes 2022-06-22 19:34:20 +03:00
gdlbo 60be976861 fixed cringe logs 2022-06-22 19:16:13 +03:00
gdlbo 14e1c736b3 added vkui inj + upgraded vkui coloring and theme changing 2022-06-22 18:55:45 +03:00
gdlbo fc6945a72d fixed opening vk id and bugtracker 2022-06-22 18:33:00 +03:00
aliveoutside b73e8b5c99 fix crashing tgstickers fragment 2022-06-22 18:12:17 +03:00
gdlbo 7fad5f2db8 fixed icons 2022-06-22 18:04:46 +03:00
gdlbo 6119610d7f added new params 2022-06-22 17:58:57 +03:00
gdlbo 401685c1b6 added old icons 2022-06-22 17:56:34 +03:00
aliveoutside bf0f78b391 update icons in settings 2022-06-22 17:29:51 +03:00
gdlbo 0f40e271db fixed FriendsGetRecommendationsWithMutual.smali 2022-06-22 16:49:13 +03:00
gdlbo 990a392b83 newsfeed inj 2022-06-22 16:43:18 +03:00
gdlbo 9e1d0077f6 added offline and news injector 2022-06-22 16:41:41 +03:00
gdlbo 68c3619f7f fixed auto cleaning cache 2022-06-22 14:51:22 +03:00
gdlbo 0419316f32 fixed settings opening 2022-06-22 14:47:26 +03:00
gdlbo fb8252eebe verifications 2022-06-22 14:21:52 +03:00
gdlbo 8a7763c356 navbar coloring (s0v@ killer tbh) 2022-06-22 12:37:44 +03:00
gdlbo 6187eecac5 deleted video/msg reporter 2022-06-22 12:14:22 +03:00
gdlbo 4d3f262d59 fix network 2022-06-22 12:08:56 +03:00
gdlbo 95feb481a9 deleted vk ui analytics and anr 2022-06-22 11:52:38 +03:00
gdlbo 1a42c24dab deleted app start duration checker 2022-06-22 11:41:29 +03:00
gdlbo 833e02bfb2 deleted vk analytics reporter 2022-06-22 11:35:00 +03:00
gdlbo 705d6bf639 deleted my tracker 2022-06-22 11:29:40 +03:00
gdlbo 1186cd4a8d Deleted crashlytics 2022-06-22 11:17:00 +03:00
gdlbo 4b19b59b3a fixed strings compiling 2022-06-22 10:25:27 +03:00
gdlbo 066a1ed161 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-22 10:21:33 +03:00
gdlbo cc9a826f1d inited new version + app name 2022-06-22 10:21:17 +03:00
aliveoutside 8dd7b2d368 add settings 2022-06-22 04:58:42 +03:00
gdlbo d82609304a added Toggles.java with hook 2022-06-22 01:23:00 +03:00
aliveoutside 831ba0a774 fix not loading messages 2022-06-22 04:06:51 +03:00
aliveoutside 15fe52d83f update jars 2022-06-22 03:55:21 +03:00
aliveoutside bce20b9ad6 hide DeletedMessagesHandler for now 2022-06-22 03:54:57 +03:00
aliveoutside 291273aef5 update buildscripts 2022-06-22 03:54:34 +03:00
aliveoutside 8248418fe2 fix ModalBottomSheetWrapper 2022-06-22 03:44:08 +03:00
gdlbo 99629f0a3e added Toggles.java with hook 2022-06-22 00:42:42 +03:00
gdlbo 9405ee352d fix Toggles.java 2022-06-22 00:17:14 +03:00
gdlbo 4dd055b9b1 added Toggles.java 2022-06-22 00:13:13 +03:00
aliveoutside 7769a76bea fix galo4ki 2022-06-22 02:07:39 +03:00
aliveoutside 27b8b57625 fix OTAHelper 2022-06-22 02:07:39 +03:00
gdlbo 682ed1c8c5 fixed imports and Themes.java 2022-06-21 23:05:33 +03:00
Vologhat f6c30a4953 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:55:08 +03:00
aliveoutside 4c352713ca fix DeletedMessagesHandler 2022-06-22 01:52:15 +03:00
Vologhat 20efb909ae extended ReflectionUtils 2022-06-21 22:54:44 +03:00
gdlbo fc6f528541 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:38:15 +03:00
aliveoutside 1d97000bef fix DockBarFragment 2022-06-22 01:31:01 +03:00
aliveoutside ade116fa03 fix otadownloader 2022-06-22 01:24:48 +03:00
aliveoutside ec40c99c95 fix net/request 2022-06-22 01:18:00 +03:00
aliveoutside ab66804d87 fix ExternalLinkHandler 2022-06-22 01:13:58 +03:00
gdlbo 126d8c7926 debuggable true 2022-06-21 22:36:49 +03:00
gdlbo b936327eec fixed setup with official vk 2022-06-21 22:36:18 +03:00
gdlbo 7499aadec6 Merge branch 'vtl-remaster' of https://github.com/vtosters/lite into vtl-remaster 2022-06-21 20:40:46 +03:00
aliveoutside ed5f82cbd2 fix dnr and dnt 2022-06-21 23:39:00 +03:00
aliveoutside 596b71ce56 remove okhttp request 2022-06-21 23:39:00 +03:00
aliveoutside af6aaf341e fix foaf 2022-06-21 23:39:00 +03:00
gdlbo 4f51cdec0a fixes refl theme 2022-06-21 20:40:29 +03:00
gdlbo e4f68f4024 fixes refl theme 2022-06-21 20:38:10 +03:00
aliveoutside b2f78987f7 fix materialfragment is settings 2022-06-21 23:14:56 +03:00
aliveoutside a567d044c6 add activity to manifest 2022-06-21 23:14:56 +03:00
aliveoutside 5e6fff7b8d fix materialfragment 2022-06-21 23:14:56 +03:00
gdlbo f4766d0a11 Update R.java 2022-06-21 20:14:42 +03:00
aliveoutside 5b95b17703 update jars 2022-06-21 23:00:13 +03:00
aliveoutside 534e33ee46 Revert "fixes private/public"
This reverts commit 94a6b5aa96.
2022-06-21 22:51:21 +03:00
aliveoutside 3d0b8cf0a2 dev mode 2022-06-21 22:37:24 +03:00
aliveoutside 764f026ab9 ssl 2022-06-21 22:28:30 +03:00
gdlbo 056fdc3b2c Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 19:16:12 +03:00
aliveoutside d4641d88c0 enable music 2022-06-21 22:13:58 +03:00
aliveoutside 6a82aee5cc disable calls 2022-06-21 22:13:57 +03:00
gdlbo ffa64a0125 fixes analytics 2022-06-21 19:16:07 +03:00
gdlbo 856eafe8de fixes private/public 2022-06-21 19:11:41 +03:00
gdlbo 94a6b5aa96 fixes private/public 2022-06-21 19:08:51 +03:00
aliveoutside 42b02add89 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:01:12 +03:00
aliveoutside 034bf2dd2c спустя два дня пофиксили 2022-06-21 21:58:55 +03:00
aliveoutside 0eccfbf5ea Revert "deobf"
This reverts commit 755268de
2022-06-20 00:31:48 +03:00
aliveoutside 23c3bd8852 partially ifx 2022-06-20 00:19:11 +03:00
gdlbo 037444d813 fixes 2022-06-19 23:37:59 +03:00
gdlbo 44de228f9f fixes 2022-06-19 20:44:33 +03:00
gdlbo 7b25221fee fixes 2022-06-19 20:13:27 +03:00
gdlbo 363afa251a added new fonts 2022-06-19 20:13:18 +03:00
gdlbo 052e3114bf fix 2022-06-19 19:28:04 +03:00
gdlbo d73c5133d3 fix 2022-06-19 19:17:30 +03:00
gdlbo 8d0b63ad72 fixes 2022-06-19 15:32:24 +03:00
aliveoutside 5766d03767 update r.java 2022-06-19 18:21:48 +03:00
gdlbo 7ee2f8ab46 fixes 2022-06-19 14:52:27 +03:00
gdlbo 1840c76a26 fixes 2022-06-19 14:38:22 +03:00
aliveoutside 51e8219306 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 17:17:50 +03:00
aliveoutside 82d16c6a0c Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 17:01:32 +03:00
aliveoutside da087054cc fix preferences 2022-06-19 16:57:53 +03:00
aliveoutside 5781df15d3 fix preferences 2022-06-19 16:54:07 +03:00
gdlbo 4c1cb174b8 fixes 2022-06-19 14:17:37 +03:00
gdlbo fa1ef6dfa5 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 14:01:28 +03:00
gdlbo 1389a39bea fixes 2022-06-19 14:01:24 +03:00
gdlbo 0491afacec fixed all res 2022-06-19 13:11:07 +03:00
gdlbo de62447522 added resources + fixed animfrag 2022-06-19 12:47:35 +03:00
aliveoutside 3ba9b8c4e4 add assests 2022-06-19 07:05:35 +03:00
aliveoutside c1760a48ca update jars 2022-06-19 07:03:08 +03:00
aliveoutside 32b854baf8 remove multiacc (it's already in the client) 2022-06-19 07:02:55 +03:00
aliveoutside 5b91699c69 fix StickersPreferencesFragment 2022-06-19 06:59:52 +03:00
aliveoutside 1f42bb9ec6 fix DeletedMessagesHandler 2022-06-19 06:52:32 +03:00
aliveoutside 8330f7fe89 add update jars script 2022-06-19 06:49:32 +03:00
aliveoutside 74bbb9eed9 fix verifications 2022-06-19 05:57:58 +03:00
aliveoutside 78960e7827 fix vkx 2022-06-19 05:53:17 +03:00
aliveoutside 3dfe10fc87 fix settings 2022-06-19 05:49:10 +03:00
aliveoutside 807c3b95c4 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 05:44:34 +03:00
aliveoutside 4f408e4cfa Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 05:30:56 +03:00
aliveoutside 0d0caa9d83 fix messages settings 2022-06-19 05:03:00 +03:00
aliveoutside d33e382b49 fix 2022-06-19 04:54:56 +03:00
aliveoutside 20b7e77be2 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 04:48:03 +03:00
aliveoutside 3652e8c593 fix video downloader 2022-06-19 04:42:43 +03:00
aliveoutside 755268de6b deobf 2022-06-19 04:32:02 +03:00
gdlbo 4473e68f7e fixes 2022-06-19 02:44:29 +03:00
gdlbo 65aac426b2 fixes 2022-06-19 02:13:23 +03:00
gdlbo a186fd35be Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 02:06:52 +03:00
gdlbo c651074d91 fixes 2022-06-19 02:06:47 +03:00
gdlbo 34335d723a fixes 2022-06-19 01:47:55 +03:00
gdlbo 6cd0cd4730 fixes 2022-06-19 00:27:34 +03:00
gdlbo 3125ba2f8a dev mode 2022-06-18 23:52:54 +03:00
gdlbo 638ddd0518 music + ssl v2 2022-06-18 23:29:48 +03:00
gdlbo 429f8214b0 ssl + debug check 2022-06-18 23:29:05 +03:00
aliveoutside bdd5c80504 rename 2022-06-18 23:01:03 +03:00
aliveoutside c11d763760 disable calls 2022-06-18 20:04:41 +03:00
aliveoutside d2df533c1d fix music 2022-06-18 20:01:17 +03:00
aliveoutside db3944b8d6 fix buildscripts 2022-06-18 20:01:07 +03:00
aliveoutside 0d0e5fdd37 add new files 2022-06-18 19:27:15 +03:00
aliveoutside 2273d2f346 init new ver 2022-06-18 19:12:50 +03:00
gdlbo 7df03fd5e6 fixed deleting acc 2022-06-17 22:52:50 +03:00
gdlbo 7dd30d5169 shakal mode 2022-06-17 19:49:41 +03:00
gdlbo c7820e2571 fixed multi account 2022-06-17 19:27:35 +03:00
gdlbo cf058d65fd updated gh actions script 2022-06-17 19:13:27 +03:00
gdlbo 3eabe1f659 added compress disabler 2022-06-17 19:10:57 +03:00
gdlbo f442f089bf added compress disabler 2022-06-17 19:08:37 +03:00
gdlbo 82abf48b18 Merge remote-tracking branch 'origin/master' 2022-06-17 18:35:06 +03:00
gdlbo 7729614f8b added auto cleaning cache 2022-06-17 18:35:01 +03:00
gdlbo 9b86678daf Merge pull request #342 from k1zn/master
Fix avatar position on tablet
2022-06-17 18:27:20 +03:00
gdlbo 9d356e7d9d added auto cleaning cache 2022-06-17 18:21:10 +03:00
Erik Kiznov 6ac6819d5d Fix README.md 2022-06-17 20:09:03 +05:00
Erik Kiznov e859baf6e5 Fix avatar position on tablet 2022-06-17 19:36:42 +05:00
Vologhat ac137e1fb6 changed buttons style 2022-06-17 17:12:26 +03:00
gdlbo 997d861f83 fix foxbin.f0x1d.com/enotik 2022-06-17 15:12:59 +03:00
gdlbo 91cde36777 fix 2022-06-17 14:54:47 +03:00
gdlbo ebf7a4070c fix 99% problems on android 11 and lower 2022-06-17 14:19:27 +03:00
gdlbo c63a31ddd8 fixed colors 2022-06-17 13:58:41 +03:00
gdlbo 8a0000b678 fix vk icon in menu 2022-06-17 13:53:17 +03:00
gdlbo 2fc79dbdb8 fixed crash android 5.1 2022-06-17 13:34:40 +03:00
gdlbo 037ea45448 fix crash MusicFragment 2022-06-16 23:30:08 +03:00
gdlbo e389f7d353 gcmfix v2 is here 2022-06-16 22:46:07 +03:00
gdlbo 6cdba67118 gcmfix v2 is here 2022-06-16 22:32:00 +03:00
gdlbo 3bb32dfd44 gcmfix v2 is here 2022-06-16 22:30:00 +03:00
gdlbo d7d3ef7549 counters is back 2022-06-16 21:58:13 +03:00
gdlbo 95a029ab6f fix rounded msg + improved vkme msg mode 2022-06-16 21:25:41 +03:00
gdlbo f284a96587 fixed bg stickers issue 2022-06-16 21:14:13 +03:00
gdlbo ca91b16647 VKID Protection alert in music settings 2022-06-16 20:25:02 +03:00
gdlbo 35e5a97266 VKID Protection alert 2022-06-16 19:38:18 +03:00
gdlbo 6678a361ba VKID Protection alert 2022-06-16 19:35:45 +03:00
gdlbo 1e8bd2afc7 fix sharing action buttons 2022-06-16 17:05:42 +03:00
gdlbo ad5f658423 small fixes 2022-06-16 16:51:27 +03:00
gdlbo 24e81159f3 small fixes 2022-06-16 16:37:35 +03:00
gdlbo b6e60e3461 verif icon coloring in dialogs 2022-06-16 16:24:23 +03:00
gdlbo 203b4b166b toolbar fixes 2022-06-16 16:02:19 +03:00
gdlbo d586eea977 writebar fix 2022-06-16 14:16:46 +03:00
gdlbo d33e25f95d fix msg loading 2022-06-16 14:03:39 +03:00
gdlbo b9508d9be4 online fixes 2022-06-16 13:18:09 +03:00
gdlbo 5b39f797b1 fix 2022-06-16 09:12:39 +03:00
gdlbo 6ceb91e8b6 added signature check to detect github actions builds and etc 2022-06-16 01:26:07 +03:00
gdlbo 94259ce68c fixes 2022-06-16 01:06:11 +03:00
gdlbo 0f035ebc13 fixes 2022-06-16 00:33:40 +03:00
gdlbo dc605a7292 fixed toast 2022-06-16 00:15:31 +03:00
Vologhat 15ef4b5419 Merge branch 'ota' 2022-06-16 00:09:40 +03:00
Vologhat fc6cf416dc Final fixes 2022-06-16 00:04:34 +03:00
gdlbo 0a28430c5a impossible color fix 2022-06-15 23:08:58 +03:00
gdlbo 3207290d77 kill androidx 2022-06-15 21:47:21 +03:00
Vologhat b0fa321606 final changes
added apk downloading and installing features, bottomshit wrapper with mirroring
2022-06-15 21:29:09 +03:00
gdlbo 2bffa59a10 color fixes 2022-06-15 21:11:30 +03:00
gdlbo 7f080970e4 wtf debuggable must be false 2022-06-15 17:20:01 +03:00
gdlbo f1c2527ca3 fixes 2022-06-15 17:13:18 +03:00
Vologhat 33d210af7f added ota 2022-06-15 16:41:21 +03:00
gdlbo d7378e4674 fixed auto theme 2022-06-15 07:59:10 +03:00
gdlbo 8e40b622f7 fixes 2022-06-15 02:36:25 +03:00
gdlbo 92e4c55cb5 upgraded new settings
refactored multi account counter
2022-06-15 02:13:33 +03:00
gdlbo f498e7af73 fixes 2022-06-14 23:48:07 +03:00
gdlbo bacf196a31 isdarktheme now should work depending on the dark theme of the app v2 2022-06-14 13:26:47 +03:00
gdlbo 2f4603af26 Merge pull request #313 from iNotFlying/master
New VK logo
2022-06-14 13:10:11 +03:00
gdlbo 203a7d00f2 isdarktheme now should work depending on the dark theme of the app 2022-06-14 13:08:20 +03:00
iNotFlying f8c351cd0b Some fixes 2022-06-14 10:48:25 +03:00
iNotFlying 93ab8d368b Merge branch 'vtosters:master' into master 2022-06-14 11:41:47 +04:00
gdlbo e38d93fa2b injected new setting to default theme 2022-06-14 01:19:20 +03:00
gdlbo 59518fa4ce fixed dark theme in new settings 2022-06-14 01:07:17 +03:00
gdlbo c7b7ccfb8b fixed amoled css 2022-06-14 00:15:25 +03:00
gdlbo e0f9ac1ea3 amoled theme now is fully amoled theme 2022-06-14 00:11:33 +03:00
gdlbo 2fa9f76d16 fixes 2022-06-13 23:57:53 +03:00
gdlbo 7eceb08e8c fixes 2022-06-13 22:49:22 +03:00
gdlbo 41f558c34c fixes 2022-06-13 22:40:10 +03:00
gdlbo dd5963b172 vkme mode updated 2022-06-13 22:34:35 +03:00
iNotFlying c1e3a03412 New VK logo 2022-06-13 21:45:29 +03:00
gdlbo ffd60ded27 vkme mode updated 2022-06-13 21:07:16 +03:00
gdlbo b5e02b04b7 vkme mode updated 2022-06-13 21:06:36 +03:00
gdlbo 4077621891 vkme mode updated 2022-06-13 21:04:16 +03:00
gdlbo 2d2a835bbe vkme mode updated 2022-06-13 18:18:38 +03:00
gdlbo 526c2a3b8a vkme mode updated 2022-06-13 12:38:50 +03:00
gdlbo 0bee2560d5 vkme mode updated 2022-06-13 12:20:21 +03:00
gdlbo c4796fb9c7 vkme mode updated 2022-06-13 12:01:04 +03:00
gdlbo 504aa22064 vkme mode test 2022-06-13 01:03:10 +03:00
gdlbo 7882532361 test coloring bottomsheet 2022-06-12 20:02:15 +03:00
gdlbo f4786f0479 mini refactoring 2022-06-12 16:19:45 +03:00
gdlbo 2dc814eacb fix https://github.com/vtosters/lite/issues/156 2022-06-12 15:44:05 +03:00
gdlbo 289d82e5bc fix 2022-06-12 01:49:10 +03:00
gdlbo 1157d96589 fix hardcoded text 2022-06-12 01:29:19 +03:00
gdlbo e1044a288d fix 2022-06-12 01:12:01 +03:00
gdlbo 2cba8fd9ef dropdown menu text color fix 2022-06-12 00:36:18 +03:00
gdlbo 1d9285d371 dropdown menu coloring!!!!!!! 2022-06-11 23:51:48 +03:00
gdlbo f8d342ba93 fixes 2022-06-11 23:08:16 +03:00
gdlbo eae02f4f4a fixes 2022-06-11 22:57:52 +03:00
gdlbo f8c397e57f fixes 2022-06-11 22:45:55 +03:00
gdlbo 87c53c8a42 fixes 2022-06-11 20:16:10 +03:00
gdlbo 8615d33da9 Animation fragment injector (beta) 2022-06-11 19:46:22 +03:00
gdlbo 59702a47f0 fixed games button 2022-06-11 17:29:05 +03:00
gdlbo cd69714985 upgraded ColorStateList recoloring 2022-06-11 16:42:39 +03:00
gdlbo f4e51b79fd some fixes of color inj 2022-06-11 15:24:04 +03:00
gdlbo b6fde08278 Merge remote-tracking branch 'origin/master' 2022-06-11 14:26:43 +03:00
gdlbo 4773f7faef fixed search color 2022-06-11 14:26:39 +03:00
gdlbo 33e4637b60 Fix string 2022-06-10 22:22:46 +03:00
gdlbo e676c5c4f1 fixed crash docs 2022-06-10 21:49:12 +03:00
gdlbo 58741f88f6 fixed crash docs 2022-06-10 21:37:52 +03:00
gdlbo 12077ba07a some improves 2022-06-10 21:00:37 +03:00
gdlbo 748cb47b4b fixed issue with undelete by default (oops) 2022-06-10 19:42:20 +03:00
gdlbo c0470012eb fixed issue with dateformat value 2022-06-10 19:00:26 +03:00
gdlbo cf3eacc14f 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 083dc40ad9 improved disabling number shortening 2022-06-10 17:26:40 +03:00
gdlbo 72001373b9 fixed pic rounding 2022-06-10 16:40:50 +03:00
gdlbo 1eb33b6cc5 fixed serach text coloring 2022-06-10 16:19:00 +03:00
gdlbo 908047fbe2 fixed casino moment 2022-06-10 16:17:32 +03:00
gdlbo 2ac791344a fixed casino moment 2022-06-10 15:29:46 +03:00
gdlbo 0b28a4d20b fixed rounded msgs colors monet 2022-06-10 15:26:40 +03:00
gdlbo 62fbdab39a added pref disableanimstickers to debug 2022-06-09 00:04:14 +03:00
gdlbo 282c82282e fixed some accents 2022-06-08 23:44:58 +03:00
gdlbo 4b7eeed21c fixed accent vkim link 2022-06-08 23:26:30 +03:00
gdlbo d6d50bdc41 fixed load friends page 2022-06-08 22:58:52 +03:00
gdlbo 3be46106a1 added shadow in dialogs vkme 2022-06-08 21:18:05 +03:00
gdlbo ea2cda888d disabled divider in dialogs 2022-06-08 21:09:12 +03:00
gdlbo 1d59d4c5ed fixed shadow 2022-06-08 20:55:19 +03:00
gdlbo be47db75aa fixed shadow on 31 sdk+ 2022-06-08 20:47:52 +03:00
gdlbo 41b81641ce sdk 31 rounded msgs 2022-06-08 20:29:30 +03:00
gdlbo 1faebbb490 amoled theme for rounded msgs 2022-06-08 19:55:11 +03:00
gdlbo 7036c3e613 some fixes 2022-06-08 19:32:29 +03:00
gdlbo aa1fece7b5 init rounded msg for light theme 2022-06-08 19:26:01 +03:00
gdlbo 896b420c28 added applying theme after restart 2022-06-08 19:25:01 +03:00
gdlbo ac4fe43aef init rounded msg for dark theme 2022-06-08 18:50:28 +03:00
gdlbo 98e5bfb2bb init rounded theme 2022-06-08 18:41:03 +03:00
gdlbo ae722e689e fixed stickers time color 2022-06-08 18:28:56 +03:00
gdlbo 3abff8cad1 fixes some themes logic 2022-06-08 17:22:11 +03:00
gdlbo 155fa80c95 fixes + more translations 2022-06-08 15:14:34 +03:00
gdlbo a5a2179399 fixes + more translations 2022-06-08 14:02:45 +03:00
gdlbo 8aee5a78a4 fixes 2022-06-07 17:50:02 +03:00
gdlbo 06ce8a7e6f New feature open news settings via settings lmao 2022-06-07 11:56:23 +03:00
gdlbo 1cc4d7624a fixed news logic 2022-06-07 11:26:29 +03:00
gdlbo dd817960e1 Fixed some translations + fixed settings logic 2022-06-07 11:24:44 +03:00
gdlbo 92e0f3b55b Fixed links 2022-06-07 10:51:24 +03:00
gdlbo 03bdf92ae2 Casino update from 7 to 5 2022-06-04 22:14:36 +03:00
gdlbo 5492d69445 Added randomize to disable donate alert 2022-06-04 21:18:50 +03:00
gdlbo 83779a1698 fixed links + disable recomms 2022-06-04 20:36:00 +03:00
gdlbo 49c70e8162 Added donate banners lmao 2022-06-04 20:04:28 +03:00
gdlbo 654ba13dea Fixed market colors 2022-06-04 11:25:38 +03:00
gdlbo e4c0b7be6c Fix dark accent color on monet 2022-06-04 10:25:41 +03:00
gdlbo 0ee809a721 Merge pull request #283 from bxkr/master 2022-06-04 09:32:58 +03:00
Andrew 683e17bee4 Update R.java 2022-06-04 06:10:16 +03:00
gdlbo b9d35c2343 Fix pull requests building 2022-06-04 04:54:54 +03:00
Andrew 6b6c69fb19 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 960980022f Fix actions compiling 2022-06-03 20:36:56 +03:00
gdlbo f72da4bec1 Fix actions compiling 2022-06-03 20:33:29 +03:00
gdlbo 08e35a811f fix some strings 2022-06-03 19:43:23 +03:00
gdlbo a34c41870c color fixes 2022-06-03 17:47:29 +03:00
gdlbo 25428464b7 Update build.gradle 2022-06-03 16:00:11 +03:00
gdlbo 97c65f9585 Color article fixes 2022-06-02 19:45:49 +03:00
gdlbo 302fa7e6af Color fixes 2022-06-02 19:28:16 +03:00
gdlbo ab067f242b Disabled discover ads 2022-06-02 19:04:24 +03:00
gdlbo 30e5ff6f64 Fix https://github.com/vtosters/lite/issues/266 2022-06-02 17:38:28 +03:00
gdlbo 2838dc5e7e Fixes 2022-06-02 16:42:45 +03:00
gdlbo 6f4f073ed3 Fixed comments load 2022-06-02 14:25:32 +03:00
gdlbo 564eb85575 Updated gitignore 2022-06-02 14:02:37 +03:00
gdlbo a6de8e0be4 Fixed icon changing 2022-06-02 13:25:19 +03:00
gdlbo abc87c0254 Fixed crash + fixed msg cache 2022-06-02 13:06:55 +03:00
gdlbo aec302d7f2 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 d27d9227bc 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 a1c23aeaaa Refactoring 2022-05-31 16:55:19 +03:00
gdlbo 6b05544716 added more documentations 2022-05-31 16:43:58 +03:00
gdlbo 161ea1d318 Added our git links 2022-05-26 20:25:51 +03:00
gdlbo f500f34e78 Fixed statusbar and navbar light coloring 2022-05-17 23:08:12 +03:00
gdlbo e3716b759a Poll fix 2022-05-17 20:05:16 +03:00
gdlbo abc37de666 Fixes 2022-05-17 18:40:56 +03:00
gdlbo e09994cd30 reworked statusbar coloring 2022-05-17 00:35:39 +03:00
gdlbo e1dfd9bd99 fix music tabs 2022-05-16 22:38:57 +03:00
gdlbo b4ac86ef35 reworked do not read 2022-05-16 21:50:32 +03:00
gdlbo 3e40286e5d fixes 2022-05-16 21:27:59 +03:00
gdlbo 4a2d307410 copyright posts detect 2022-05-16 21:21:39 +03:00
gdlbo 878d68a655 Fixes + some imp of custom msg loader 2022-05-16 00:11:00 +03:00
gdlbo a56c92f87f Fixes 2022-05-15 21:23:48 +03:00
gdlbo 9095629f96 Reworked some cringe code 2022-05-15 21:11:25 +03:00
gdlbo 8755c2df34 fixed white screamers (maybe) 2022-05-13 20:28:20 +03:00
gdlbo 888a1af9b4 fixes 2022-05-13 19:59:36 +03:00
gdlbo e0450d3835 Fix summ 2022-05-13 15:36:42 +03:00
gdlbo 4e56fdf5aa Color fixes 2022-05-13 15:12:02 +03:00
gdlbo c332d5c97f Some corrections 2022-05-13 14:13:36 +03:00
gdlbo 2977a19532 color fix header 2022-05-13 14:10:18 +03:00
gdlbo a9365a8ba8 Fixes 2022-05-13 14:05:00 +03:00
gdlbo a6ddcdb759 Fix open notifs 2022-05-13 12:40:42 +03:00
gdlbo d9dccd53f0 Fixes 2022-05-13 11:59:15 +03:00
gdlbo 3b2f964961 Fix article custom verifs 2022-05-12 18:47:42 +03:00
gdlbo 2d8bd820a5 Monet dockbar icons coloring 2022-05-12 18:04:12 +03:00
gdlbo 56a979970c Added more summaries 2022-05-12 16:50:30 +03:00
gdlbo 836676eb18 System theme at start 2022-05-11 20:59:37 +03:00
gdlbo 86a013b619 Some color fixes + upped default app version 2022-05-10 22:34:56 +03:00
gdlbo e57a76790f Added another cringe feature 2022-05-10 22:12:40 +03:00
gdlbo b4cec48bbb Fixed doc upload 2022-05-10 21:27:25 +03:00
gdlbo 96676721c9 Fixed stats crash 2022-05-10 21:07:29 +03:00
gdlbo eeb8785d42 Custom opus lib bridges 2022-05-10 20:22:39 +03:00
gdlbo 993a1a7f86 Custom opus lib bridges 2022-05-10 20:18:59 +03:00
gdlbo 0b6f29dc70 Crashreporter fix 2022-05-10 14:35:33 +03:00
gdlbo 26007f97f3 Amoled monet accent + color fixes 2022-05-10 14:11:14 +03:00
gdlbo 5a55cca59d Disabled stats.track*** 2022-05-10 13:53:14 +03:00
gdlbo cb425fd18e Fixed vk cringe refl 2022-05-10 13:26:00 +03:00
gdlbo 5889dc675e Beautify code 2022-05-07 18:31:07 +03:00
gdlbo df8e7e4b54 Deleted unused code 2022-05-07 11:16:22 +03:00
gdlbo e07d253a5e Decrypt 2022-05-06 14:50:02 +03:00
gdlbo 81f4e6503a Fixes 2022-05-06 14:05:23 +03:00
gdlbo d7ff250faf Undelete feature + fixes 2022-05-06 13:43:42 +03:00
gdlbo 1d12a5f171 Merge branch 'master' of https://github.com/vtosters/lite 2022-05-06 01:58:35 +03:00
gdlbo 485d3d884a Encryption + Undelete code base 2022-05-06 01:57:33 +03:00
gdlbo e78754e39e color fixes 2022-05-04 16:41:59 +03:00
gdlbo 0b6c11f0d0 Fixed crash 2022-05-04 14:23:25 +03:00
gdlbo d25604ed66 Added proxy user/pass auth 2022-05-04 13:12:39 +03:00
gdlbo 4f3167064c Update README.md 2022-05-03 23:45:37 +03:00
gdlbo f0d4bec116 Updated build gradle 2022-05-03 22:19:23 +03:00
gdlbo 76a1872f74 Merge remote-tracking branch 'origin/master' 2022-05-03 22:11:35 +03:00
gdlbo 1158cb4aeb Fix 2022-05-03 22:11:19 +03:00
Vologhat 41ab384e1f fix #204 (null pointer while account deleting) 2022-05-02 18:07:04 +03:00
gdlbo 3839e721db Fix dockbar issue 2022-05-02 13:30:51 +03:00
gdlbo d1b84461e6 Fixed store stickers colors 2022-05-02 12:54:58 +03:00
gdlbo 3c79cb3ef5 Reworked some about menu 2022-05-02 12:40:57 +03:00
gdlbo ea7641278a Disabled anim stickers 2022-05-02 12:31:30 +03:00
gdlbo 23032e8409 Fixed bug with new feed design 2022-05-02 11:03:39 +03:00
gdlbo 1d687a01c1 Fixes + new update feed logic 2022-05-02 10:44:57 +03:00
gdlbo 0b751964fa Oh sh*t I am sorry (for refactoring) 2022-05-02 09:44:30 +03:00
gdlbo 59eb43c33f Color fixes 2022-04-30 14:25:40 +03:00
gdlbo dfdb056e07 Refactoring + renaming 2022-04-30 13:48:04 +03:00
gdlbo cd38eba184 Refactoring + renaming 2022-04-30 13:17:32 +03:00
gdlbo a4063b978f Updated README.md + version null fix 2022-04-29 22:22:07 +03:00
gdlbo af51775844 Github Actions test 2022-04-29 21:51:56 +03:00
gdlbo f4039abae3 Github Actions test 2022-04-29 21:48:08 +03:00
gdlbo 1b64f46588 gh actions test 3 2022-04-29 21:42:51 +03:00
gdlbo ad40368639 gh actions test 2 2022-04-29 21:38:24 +03:00
gdlbo d15159d9b0 fix 2022-04-29 21:29:20 +03:00
gdlbo c837f6eacc gh actions test 2022-04-29 21:27:25 +03:00
gdlbo 14b884daf7 Updated README.md 2022-04-29 20:56:14 +03:00
gdlbo 63ca14bbe6 color fixes 2022-04-29 16:49:30 +03:00
gdlbo 2605566f90 color fixes 2022-04-28 22:02:35 +03:00
gdlbo 0bcd59d5ba color fixes 2022-04-28 21:56:54 +03:00
gdlbo a9744bb577 Some fixes 2022-04-28 21:21:20 +03:00
gdlbo 9b4dae4af5 Clean up code 2022-04-28 21:11:04 +03:00
gdlbo 319d657ab4 Fixes 2022-04-28 20:57:57 +03:00
gdlbo d9896257c5 Backup system fixes 2022-04-28 19:07:11 +03:00
gdlbo b5d5e85ee2 Reset/Save prefs system init 2022-04-28 18:29:31 +03:00
gdlbo 9dcaddd7fd Reset/Save prefs system init 2022-04-28 18:29:21 +03:00
gdlbo d1bec2e815 fixes 2022-04-27 23:06:43 +03:00
gdlbo 96d7f28db9 fixes for music popup 2022-04-27 21:34:14 +03:00
gdlbo 90c4ca88e0 https://github.com/vtosters/lite/issues/181 + color fixes for tabs 2022-04-27 21:09:29 +03:00
gdlbo 942fe202d7 Fixed crash
https://github.com/vtosters/lite/issues/192
2022-04-27 20:29:18 +03:00
gdlbo e17f888598 Deleted exit button :) 2022-04-27 20:25:29 +03:00
gdlbo b089c7d7f9 Added debug feature for clear all sticks cache 2022-04-27 20:15:47 +03:00
gdlbo afc2a5b258 Fixed pic theme 2022-04-27 20:08:23 +03:00
gdlbo 1f0adb7510 Fixed header coloring 2022-04-27 19:37:48 +03:00
gdlbo aba62966b0 Max tabs updated 2022-04-26 14:28:37 +03:00
gdlbo aaff05685c Updated icons 2022-04-25 19:37:14 +03:00
gdlbo 9c1bbab253 Fixed msg strange bug + fixes 2022-04-25 17:24:13 +03:00
gdlbo def1c699e0 Improved Dark theme 2022-04-25 16:47:43 +03:00
gdlbo e6639a63b7 Improved player progress color 2022-04-25 16:31:02 +03:00
gdlbo 1b14761e9e Refactored vkui injector + added headers coloring 2022-04-25 15:51:07 +03:00
gdlbo 07a070a4fe Monet fixes 2022-04-25 14:23:18 +03:00
gdlbo 8b13fcfd68 Update preferences_themes.xml 2022-04-24 22:44:06 +03:00
gdlbo 4088ea68fa Update DockBarManager.java 2022-04-24 22:32:39 +03:00
gdlbo 2e95ed13ce Improved dark theme 2022-04-24 19:22:35 +03:00
gdlbo f79091bc9c added more info + reformated xml 2022-04-24 18:42:17 +03:00
gdlbo ebfc19c1f7 Update ThemesFragment.java 2022-04-24 18:28:12 +03:00
gdlbo bdb8f3cf6f Improved Theme changing 2022-04-24 18:16:24 +03:00
gdlbo 4b998f2b97 fixed comments 2022-04-24 17:57:26 +03:00
gdlbo aa1d254a49 Fixes + Added comments sorting 2022-04-24 17:43:02 +03:00
gdlbo 897b3300e6 fixes 2022-04-24 16:58:17 +03:00
gdlbo 9c6c9489ff 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 6d147b081e Improved Amoled Theme 2022-04-23 00:03:37 +03:00
gdlbo 78432057ca Revert "Improved navbar coloring"
This reverts commit 21b0ed8925.
2022-04-22 23:01:45 +03:00
gdlbo 21b0ed8925 Improved navbar coloring 2022-04-22 19:29:18 +03:00
gdlbo 1040e50b32 Update preferences_themes.xml 2022-04-22 18:59:48 +03:00
gdlbo 3806a05f4a Amoled Theme feature 2022-04-22 18:51:42 +03:00
gdlbo 82d45915c6 Improved Amoled Theme + Added support for SSFS 2022-04-22 18:04:56 +03:00
gdlbo 80e5145742 Amoled Theme Styles for VKIM + fixed vk refl 2022-04-22 17:39:37 +03:00
gdlbo f1b7a52f0c Test Amoled Theme Styles + Updated R.java 2022-04-22 17:03:41 +03:00
gdlbo 924952128f Updated Libs 2022-04-22 16:08:23 +03:00
gdlbo 2fcd04a55f Updated gradle + amoled inject 2022-04-22 14:07:56 +03:00
gdlbo deb6e86854 Improved dark theme 2022-04-16 18:41:11 +03:00
gdlbo 086fa37e86 Fixed bot keyboard 2022-04-16 17:58:12 +03:00
gdlbo e87ecf2f4f Custom load of msg 2022-04-16 01:56:12 +03:00
gdlbo 3dc01dd945 Fixed all issues with msgs 2022-04-16 00:23:32 +03:00
gdlbo da21999192 Fixed video downloading 2022-04-16 00:01:21 +03:00
gdlbo 161efaeb52 Downgraded msg api 2022-04-15 23:41:18 +03:00
gdlbo 1759fbe8d5 Zaborona fix 2022-04-15 23:40:06 +03:00
gdlbo b1525266a8 Improved dark theme 2022-04-12 17:34:09 +03:00
gdlbo 28ede39c26 Fixed vk refl 2022-04-12 16:37:52 +03:00
gdlbo 6b25eb37ba Fixed msg loading null 2022-04-12 15:07:35 +03:00
gdlbo e12dcdf86a Fixed strange twitter crash 2022-04-12 13:49:11 +03:00
gdlbo 4bab1490ae Fixed strange statusbar coloring 2022-04-12 13:29:32 +03:00
gdlbo 2374785ae7 Improved white theme 2022-04-12 13:17:45 +03:00
gdlbo b338da4359 Fixed crash 2022-04-11 22:56:11 +03:00
gdlbo d808f453d9 haha bruh dev->beta
1989 китай ничего не было
2022-04-11 22:38:51 +03:00
gdlbo b869f713eb Fixed bugs 2022-04-11 22:22:13 +03:00
gdlbo 2f9cf4751d Improved dark theme 2022-04-11 21:46:32 +03:00
gdlbo 6c7e796e17 deleted confidential logging 2022-04-11 21:12:00 +03:00
gdlbo ff40c7e576 Update MultiAccountAdapter.java 2022-04-11 21:10:16 +03:00
gdlbo 0ccc8b2607 fixes + disabled debuggable mode 2022-04-11 21:07:08 +03:00
Vologhat 8febcfdfb7 update multi account 2022-04-11 20:57:52 +03:00
gdlbo 9d05d077b5 Improved dark theme 2022-04-11 16:27:10 +03:00
gdlbo 63ad926078 Improved coloring 2022-04-11 14:24:50 +03:00
gdlbo e241848426 Msg fixes 2022-04-11 01:23:12 +03:00
gdlbo a82b652bc1 Fixes 2022-04-11 01:01:08 +03:00
gdlbo e59aecdc75 FIxed authactiviry cringe accent color on sdk31+ 2022-04-11 00:54:21 +03:00
gdlbo e56ba6b41a Improved dark theme 2022-04-11 00:29:28 +03:00
gdlbo cfd12483ae Improved dark theme 2022-04-11 00:13:21 +03:00
gdlbo fd18837f1b Deleted new video feature 2022-04-10 23:54:53 +03:00
gdlbo 4f3e37349d Improved dark theme 2022-04-10 23:47:51 +03:00
gdlbo 20653847f4 Improved dark theme 2022-04-10 23:10:12 +03:00
gdlbo 3e294a3ba4 Improved dark theme 2022-04-10 22:52:05 +03:00
gdlbo 20ca6f96f9 multiaccount fixes 2022-04-10 22:00:21 +03:00
Vologhat 70a30a5f33 multi account refactoring 2022-04-10 20:17:47 +03:00
gdlbo b9f170e668 Improved dark theme 2022-04-10 19:53:51 +03:00
gdlbo 809dfbe338 Update Prefs.java 2022-04-10 19:02:23 +03:00
Vologhat af25a82eca fix notifications updater 2022-04-10 16:08:08 +03:00
gdlbo 50b1fcadb4 Update InterfaceFragment.java 2022-04-09 20:40:06 +03:00
gdlbo aefe1b2f07 Improved dark theme 2022-04-09 19:28:53 +03:00
gdlbo 28bc30bd83 Improved dark theme 2022-04-09 18:26:11 +03:00
gdlbo 0aeffcd79d Improved dark theme 2022-04-09 17:57:00 +03:00
gdlbo f3863811bd Improved dark theme 2022-04-09 16:50:33 +03:00
gdlbo e4aab2fd15 Improved dark theme 2022-04-08 21:58:08 +03:00
gdlbo 5f72a6b855 Improved dark theme 2022-04-08 21:29:00 +03:00
gdlbo 31a0444409 Improved dark theme 2022-04-08 20:45:47 +03:00
gdlbo 4522935545 Improved dark theme 2022-04-08 15:03:42 +03:00
gdlbo 67c13bd416 Improved dark theme 2022-04-08 13:46:35 +03:00
gdlbo 28d5af5fa0 Improved dark theme 2022-04-08 13:31:09 +03:00
gdlbo 15d7e71e7f Improved dark theme 2022-04-08 13:14:44 +03:00
gdlbo 49bac975d2 Fixed crash crop 2022-04-08 11:57:33 +03:00
gdlbo 3878c9a1e2 Fixed installing app 2022-04-07 20:43:15 +03:00
gdlbo a5053c4418 Fixed win script 2022-04-07 20:30:26 +03:00
gdlbo 4cb844dea8 Fixed win script 2022-04-07 20:28:38 +03:00
gdlbo 04afad2fd3 Updated keystore 2022-04-07 19:47:02 +03:00
gdlbo 149efe3199 Fixed versioning null 2022-04-07 19:44:20 +03:00
gdlbo 6f05867563 Updated scripts 2022-04-07 19:15:46 +03:00
gdlbo 4442fd3265 Updated README.md 2022-04-07 19:10:11 +03:00
gdlbo 6e49856474 Fixed podcasts colors 2022-04-07 18:55:01 +03:00
gdlbo cc379b71de Added old icons feature 2022-04-07 18:40:04 +03:00
gdlbo c2a1bb4a5a Improved external video link parser 2022-04-07 18:23:57 +03:00
gdlbo cc58c33e37 Disabled monet coloring for dockbar 2022-04-07 17:38:52 +03:00
gdlbo 012f03f7e7 Fixed some color issues 2022-04-07 17:32:52 +03:00
gdlbo 28a7a3c389 Fixed some color issues 2022-04-07 16:44:55 +03:00
gdlbo 6417279d65 Fixed miniplayer text color issues 2022-04-07 15:30:39 +03:00
gdlbo 07db680ad3 Fixed settings stickers color issues 2022-04-07 15:26:02 +03:00
gdlbo d7c97b6589 Fixed docs text color issue 2022-04-07 15:01:51 +03:00
gdlbo af12289d7e Fixed a11+ issue 2022-04-07 14:55:34 +03:00
gdlbo afeafba67d Fixed crash 2022-04-07 13:54:15 +03:00
gdlbo f56e49da5c Fixed crash on sdk31+ 2022-04-07 13:17:17 +03:00
gdlbo d233897c73 Deleted libverify button 2022-04-04 20:45:48 +03:00
gdlbo 273f1c3d07 Fixed crash 2022-04-04 20:34:38 +03:00
gdlbo d34812b77b Update LinkProcessor1.smali 2022-04-03 18:30:23 +03:00
Vologhat 375a60bafc fix recycler view wrong resizing 2022-04-03 17:09:59 +03:00
gdlbo 156bd57461 Update DockBarManager.java 2022-04-03 14:15:12 +03:00
gdlbo dacc1b8eeb Update DockBarManager.java 2022-04-03 14:05:08 +03:00
gdlbo b3bb023852 Update StandartFilter.txt 2022-04-03 13:44:58 +03:00
gdlbo 8ca8272bc4 Fixed crash
https://github.com/vtosters/lite/issues/103
2022-04-03 13:17:55 +03:00
Vologhat fc36f7ad77 add saving and resetting 2022-04-03 12:26:17 +03:00
Vologhat 496bdf5b54 fix dockbar tabs limit 2022-04-03 12:23:42 +03:00
gdlbo 877d625945 Fixes fixes fixes 2022-04-02 23:53:54 +03:00
gdlbo 458710e9f0 Fixes dockbar 2022-04-02 23:41:20 +03:00
gdlbo fa6e7e44a0 Fixes 2022-04-02 22:30:51 +03:00
gdlbo bc12220d7a Merge branch 'master' of https://github.com/vtosters/lite 2022-04-02 22:05:09 +03:00
gdlbo 9d7b879e1f Some improvements 2022-04-02 22:04:16 +03:00
Vologhat e4ff8a169b add outline icons 2022-04-02 22:00:04 +03:00
Vologhat 5a62aea978 add inability to unselect menu tab 2022-04-02 22:00:04 +03:00
Vologhat b4d9de74c3 add possibility to choice alternative fragments for "news" and "discover" 2022-04-02 22:00:04 +03:00
Vologhat aa37d8b4b3 level down min tabs count 2022-04-02 22:00:04 +03:00
Vologhat e334bc6440 fix color palette and tab items 2022-04-02 22:00:04 +03:00
Vologhat 9f6b9923b0 fix dockbar 2022-04-02 22:00:04 +03:00
Vologhat 85415ae7fc add dockbar injector 2022-04-02 22:00:03 +03:00
Vologhat f5382e9649 migration to android support due to androidx instability 2022-04-02 22:00:03 +03:00
Vologhat 3ca786b820 докбар 2022-04-02 22:00:03 +03:00
gdlbo c13908f096 Updated README.md 2022-04-02 22:00:02 +03:00
gdlbo d11de94e0b Updated README.md https://github.com/vtosters/lite/pull/89 2022-04-02 22:00:02 +03:00
Daniil Isakov e2c10f7e87 Grammar check, a bit of rephrasing 2022-04-02 22:00:02 +03:00
gdlbo b05c717981 updated multiacc 2022-04-02 22:00:02 +03:00
gdlbo 38db5dfee4 updated adblock filter 2022-04-02 22:00:02 +03:00
gdlbo 151eeb5ec1 updated resources + R.java again 2022-04-02 22:00:02 +03:00
gdlbo 0d150765b8 translation fixes 2022-04-02 22:00:02 +03:00
gdlbo cd6ee3048c Updated R.java + some fixes 2022-04-02 22:00:02 +03:00
gdlbo 0ed9e62283 Added multi account feature 2022-04-02 22:00:02 +03:00
gdlbo fdb89fbf64 Improved adblock 2022-04-02 22:00:02 +03:00
gdlbo 3fd11831f6 Improvements of multiacc + added migrating from old type of accounts to new type 2022-04-02 22:00:01 +03:00
gdlbo cd81fc8b38 Improvements of multiacc + deleted old accs xD 2022-04-02 22:00:01 +03:00
gdlbo b512b7d5f7 Improvements of multiacc 2022-04-02 22:00:01 +03:00
gdlbo 883cb34bdb Multiaccount impl test 2022-04-02 22:00:01 +03:00
gdlbo c683947d20 fixed picker crash 2022-04-02 22:00:01 +03:00
gdlbo 483204a811 Updated README.md 2022-04-01 19:05:57 +03:00
gdlbo 0b5b7bcae2 Updated README.md https://github.com/vtosters/lite/pull/89 2022-04-01 18:56:52 +03:00
gdlbo e1d517f9c2 Merge pull request #84 from oplexz/patch-1 2022-04-01 09:53:41 +03:00
Daniil Isakov b80b869823 Grammar check, a bit of rephrasing 2022-04-01 09:40:25 +03:00
gdlbo 386a6cbb6c updated multiacc 2022-04-01 08:43:52 +03:00
gdlbo 9ce4c0ee90 updated adblock filter 2022-04-01 08:39:04 +03:00
gdlbo 1351b5ff90 updated resources + R.java again 2022-03-31 21:09:42 +03:00
gdlbo 84960a6107 translation fixes 2022-03-31 20:41:10 +03:00
gdlbo 5d3fdc0abd Updated R.java + some fixes 2022-03-31 20:19:28 +03:00
gdlbo 0d491f0d41 Added multi account feature 2022-03-31 19:22:37 +03:00
gdlbo 955ae91110 Improved adblock 2022-03-30 18:03:52 +03:00
gdlbo 85fa63d2a1 Improvements of multiacc + added migrating from old type of accounts to new type 2022-03-30 17:16:23 +03:00
gdlbo 6d8f02435e Improvements of multiacc + deleted old accs xD 2022-03-30 17:01:50 +03:00
gdlbo fc0600dfd8 Improvements of multiacc 2022-03-30 14:51:50 +03:00
gdlbo 1494579353 Multiaccount impl test 2022-03-30 00:22:49 +03:00
gdlbo 834d7e1da1 fixed picker crash 2022-03-28 10:13:12 +03:00
gdlbo 08b64834cf Update SettingsListFragment$b.smali 2022-03-27 21:12:45 +03:00
Vologhat 8265c5adec fix script for windows 2022-03-27 20:31:31 +03:00
gdlbo be4f2398a9 fixed compilation on windows 2022-03-27 18:04:47 +03:00
gdlbo b8f2d36f5e fixed compilation on windows 2022-03-27 18:01:02 +03:00
aliveoutside 49a2526528 fix icons in dropdown menu in newsfeed 2022-03-27 12:19:11 +03:00
aliveoutside a755d3d55e fix text color in dropdown menu in newsfeed 2022-03-27 12:19:11 +03:00
gdlbo 41a6ddb62a fixed proxy issue 2022-03-27 11:50:14 +03:00
gdlbo e32acd17ba fixed video catalog issue 2022-03-27 11:40:32 +03:00
gdlbo 0de0add858 fixed pic edit crash 2022-03-27 11:35:30 +03:00
gdlbo 9a90ca4c53 Fix doc upload crash 2022-03-26 23:38:53 +03:00
gdlbo 86b1fa6276 Fix graffiti crash 2022-03-26 23:15:47 +03:00
gdlbo 08d5fb50a7 Updated shit Filter 2022-03-26 22:57:17 +03:00
gdlbo 6fca7c7940 Updated ADBlock Filter + new test filter 2022-03-26 22:41:07 +03:00
gdlbo fad14b26b6 Updated ADBlock Filter 2022-03-26 21:37:17 +03:00
gdlbo d33fe6e185 Now some new features are enabled by default 2022-03-26 21:32:24 +03:00
gdlbo a1db85e50f updated README.md 2022-03-26 21:25:43 +03:00
gdlbo e67f1a649c fixed some color issues 2022-03-26 21:16:15 +03:00
gdlbo e88fe21802 fixed some crashes and other problems 2022-03-26 21:07:27 +03:00
gdlbo 21875b8dd5 fixed some issues 2022-03-26 20:38:38 +03:00
aliveoutside 8f4c6a5b32 fix animated stickers 2022-03-26 19:59:29 +03:00
gdlbo ba696abe0c fixed some issues 2022-03-26 17:43:49 +03:00
gdlbo 7f32d8d136 updated prefs 2022-03-26 17:03:58 +03:00
gdlbo e0af365ef3 updated README.md 2022-03-26 16:52:38 +03:00
gdlbo caa85cef49 updated debug 2022-03-26 16:44:55 +03:00
gdlbo 0cb6902519 updated README.md 2022-03-26 16:28:15 +03:00
gdlbo 7226473dcb Improvements + updated R.java and README.md 2022-03-26 16:27:02 +03:00
aliveoutside 222fdf51b5 fix pinned dialogs loading 2022-03-26 16:17:37 +03:00
aliveoutside 381ba0f69a fix "popular" videos 2022-03-26 15:44:24 +03:00
gdlbo e4170b5f16 libverify preference 2022-03-25 19:43:52 +03:00
gdlbo 81294ac9be fix fix 2fa auth........ 2022-03-25 19:15:28 +03:00
gdlbo 5ae0110153 fixed versioning on macos/linux 2022-03-25 18:45:11 +03:00
gdlbo 930c2ef9bb fixed versioning on macos/linux 2022-03-25 18:30:26 +03:00
gdlbo f109fb33d0 updated README.md 2022-03-25 17:51:00 +03:00
gdlbo eae4f99b34 added bug report button 2022-03-25 17:28:14 +03:00
gdlbo 241f0bec43 fixed ssfs domain 2022-03-25 16:52:36 +03:00
gdlbo 01ea68560f fix Jetifier 2022-03-25 16:45:49 +03:00
gdlbo 03ae42c98a fixed 2fa, fixed some issues with proxy, deleted xtrafrancyz proxy, fixed compiling, some other fixes 2022-03-25 16:42:25 +03:00
aliveoutside ab060b0981 update framework and add apksigner.jar 2022-03-25 16:16:13 +03:00
aliveoutside 89ef96f2b4 fix crash when music download button clicked 2022-03-24 22:31:43 +03:00
aliveoutside b7a1af9f64 fix serverside features 2022-03-24 22:30:52 +03:00
aliveoutside 102db1f46d Update README.md 2022-03-24 19:59:23 +03:00
aliveoutside cc35404c7f Update README.md 2022-03-24 19:41:44 +03:00
aliveoutside c07fccf607 init 2022-03-24 19:37:43 +03:00
288 changed files with 5471 additions and 3660 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++)**
**Остальные мысли о предложенной функции**
+1
View File
@@ -29,3 +29,4 @@ smali2/build/resources.zip
smali/build/resources.zip smali/build/resources.zip
smali/assets/version.properties smali/assets/version.properties
*.keystore *.keystore
gradle.properties
+5 -1
View File
@@ -66,6 +66,7 @@
* Округление чисел * Округление чисел
* Сокращение постов **(Показать полностью)** * Сокращение постов **(Показать полностью)**
* Результаты опросов без участия * Результаты опросов без участия
* Возможность указывать папку для загрузки фото/видео/музыки/всего
* Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга) * Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга)
* Новый раздел музыки * Новый раздел музыки
* Возможность скачивать видео * Возможность скачивать видео
@@ -90,6 +91,7 @@
* Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger * Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger
* Отключить уведомление о том, что вы сделали скриншот в беседе * Отключить уведомление о том, что вы сделали скриншот в беседе
* Отключение редиректа через away.php * Отключение редиректа через away.php
* Отключение отправки метрики
* Внешний вид * Внешний вид
* **Milkshake** тема (дизайн новых версий ВК) * **Milkshake** тема (дизайн новых версий ВК)
* Название заголовков в докбаре * Название заголовков в докбаре
@@ -103,8 +105,10 @@
* Возможность отключить блок историй наверху ленты * Возможность отключить блок историй наверху ленты
* Возможность отключить боковую камеру в разделе «Новости» * Возможность отключить боковую камеру в разделе «Новости»
* Возможность отключить блок «Что у вас нового?» в разделе «Новости» * Возможность отключить блок «Что у вас нового?» в разделе «Новости»
* Возможность менять раздел, который запускается при запуске * Возможность показывать лайки у постов справа
* Возможность менять стартовый раздел при запуске приложения
* Анимации фрагментов * Анимации фрагментов
* Возможность изменять размер закругления картинок (аватарок и прочего)
* Возможность отключить редизайн видеопостов * Возможность отключить редизайн видеопостов
* Возможность отключить блок миниаппов/VK Pay/Superapp * Возможность отключить блок миниаппов/VK Pay/Superapp
* Возможность отключить сокращение названий разделов в меню * Возможность отключить сокращение названий разделов в меню
+3 -5
View File
@@ -69,16 +69,15 @@ task exportDex {
android { android {
compileSdkVersion 32 compileSdkVersion 32
buildToolsVersion '32.0.0' buildToolsVersion '33.0.0'
defaultConfig { defaultConfig {
applicationId "ru.vtosters.lite.utils.lite" applicationId "ru.vtosters.lite.utils.lite"
minSdkVersion 21 minSdk 22
targetSdkVersion 32 targetSdkVersion 32
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
multiDexEnabled false
multiDexEnabled true
} }
compileOptions { compileOptions {
@@ -89,7 +88,6 @@ android {
} }
dependencies { dependencies {
implementation "androidx.multidex:multidex:2.0.1"
implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.exifinterface:exifinterface:1.3.3' implementation 'androidx.exifinterface:exifinterface:1.3.3'
implementation 'androidx.preference:preference:1.2.0' implementation 'androidx.preference:preference:1.2.0'
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
ea0425fab4379ae5f7e9db05a22d4b7afd709560
Binary file not shown.
@@ -1 +0,0 @@
3b92d8876dd59d5afc60a53bb23b103cede6a194
Binary file not shown.
Binary file not shown.
@@ -16,6 +16,7 @@ import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import ru.vtosters.lite.utils.AndroidUtils;
/** /**
* Created by Aefyr on 20.05.2018. * Created by Aefyr on 20.05.2018.
@@ -39,7 +40,7 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds = new HashMap<>(); downloadingPacksNotificationsIds = new HashMap<>();
if (oreo()) { if (oreo()) {
NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Сервис стикеров Telegram в VTosters", NotificationManager.IMPORTANCE_HIGH); NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, AndroidUtils.getString("telegram_stickers_service"), NotificationManager.IMPORTANCE_HIGH);
((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChan); ((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChan);
} }
} }
@@ -49,8 +50,8 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds.put(pack, notificationId); downloadingPacksNotificationsIds.put(pack, notificationId);
Notification.Builder builder = commonBuilder(); Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + ": загрузка" : pack.title + ": обновление"); builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString("telegram_stickers_downloading") : pack.title + AndroidUtils.getString("telegram_stickers_updating"));
builder.setContentText("Получение информации"); builder.setContentText(AndroidUtils.getString("telegram_stickers_gettinginfo"));
builder.setOngoing(true); builder.setOngoing(true);
manager.notify(notificationId, builder.build()); manager.notify(notificationId, builder.build());
@@ -63,7 +64,7 @@ public class NotificationsHelper {
lastNotificationTime.set(System.currentTimeMillis()); lastNotificationTime.set(System.currentTimeMillis());
Notification.Builder builder = commonBuilder(); Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + ": загрузка" : pack.title + ": обновление"); builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString("telegram_stickers_downloading") : pack.title + AndroidUtils.getString("telegram_stickers_updating"));
builder.setContentText(downloadProgress + "/" + pack.stickersCount); builder.setContentText(downloadProgress + "/" + pack.stickersCount);
builder.setProgress(pack.stickersCount, downloadProgress, false); builder.setProgress(pack.stickersCount, downloadProgress, false);
builder.setOngoing(true); builder.setOngoing(true);
@@ -77,13 +78,13 @@ public class NotificationsHelper {
Notification.Builder builder = commonBuilder(); Notification.Builder builder = commonBuilder();
builder.setProgress(0, 0, false); builder.setProgress(0, 0, false);
builder.setOngoing(false); builder.setOngoing(false);
builder.setContentTitle("Сервис стикеров Telegram в VTosters"); builder.setContentTitle(AndroidUtils.getString("telegram_stickers_service"));
String text; String text;
if (success) if (success)
text = wasUpdate ? pack.title + " успешно обновлен" : pack.title + " успешно загружен"; text = wasUpdate ? pack.title + AndroidUtils.getString("telegram_stickers_updated") : pack.title + AndroidUtils.getString("telegram_stickers_downloaded");
else else
text = wasUpdate ? pack.title + ": ошибка при обновлении" : pack.title + ": ошибка при загрузке"; text = wasUpdate ? pack.title + AndroidUtils.getString("telegram_stickers_error_update") : pack.title + AndroidUtils.getString("telegram_stickers_error_download");
if (e instanceof TelegramStickersGrabber.TSGException) { if (e instanceof TelegramStickersGrabber.TSGException) {
text = pack.title + ": " + e.getMessage(); text = pack.title + ": " + e.getMessage();
@@ -14,7 +14,6 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import com.facebook.common.i.MediaUtils; import com.facebook.common.i.MediaUtils;
import com.facebook.x.g.EncodedImage; import com.facebook.x.g.EncodedImage;
@@ -51,7 +50,7 @@ public class DownloadUtils {
ToastUtils.a(context.getString(R.string.error) + " [" + e2.getMessage() + "]"); ToastUtils.a(context.getString(R.string.error) + " [" + e2.getMessage() + "]");
} }
} }
private static void b(final Context context, String str, String str2, boolean z) { private static void b(final Context context, String str, String str2, boolean z) {
if (TextUtils.isEmpty(str2)) { if (TextUtils.isEmpty(str2)) {
return; return;
@@ -59,13 +58,15 @@ public class DownloadUtils {
String file = a(str, str2); String file = a(str, str2);
File b2; File b2;
boolean pic = false;
boolean c2 = MediaUtils.c(MediaUtils.b(str2)); boolean c2 = MediaUtils.c(MediaUtils.b(str2));
if (str.endsWith("png") || str.endsWith("jpg") || str.endsWith("jpeg")) { if (file.endsWith(".jpg") || file.endsWith(".png") || file.endsWith(".jpeg")) {
b2 = new File(getPhotosDir(), file); b2 = new File(getPhotosDir(), file);
} else if (str.endsWith("mp3") || str.endsWith("wav") || str.endsWith("ogg") || str.endsWith("aac") || str.endsWith("flac") || str.endsWith("m4a")) { pic = true;
} else if (file.endsWith(".mp3") || file.endsWith(".wav") || file.endsWith(".ogg") || file.endsWith(".aac") || file.endsWith(".flac") || file.endsWith(".m4a")) {
b2 = new File(getMusicDir(), file); b2 = new File(getMusicDir(), file);
} else if (str.endsWith("mp4") || str.endsWith("mkv") || str.endsWith("avi") || str.endsWith("flv") || str.endsWith("wmv") || str.endsWith("mov") || str.endsWith("3gp")) { } else if (file.endsWith(".mp4") || file.endsWith(".mkv") || file.endsWith(".avi") || file.endsWith(".flv") || file.endsWith(".wmv") || file.endsWith(".mov") || file.endsWith(".3gp")) {
b2 = new File(getVideosDir(), file); b2 = new File(getVideosDir(), file);
} else { } else {
b2 = new File(getDownloadsDir(), file); b2 = new File(getDownloadsDir(), file);
@@ -76,16 +77,23 @@ public class DownloadUtils {
final InputStream h = c3 == null ? null : c3.h(); final InputStream h = c3 == null ? null : c3.h();
if (h != null) { if (h != null) {
try { try {
if (b2.exists() || FileUtils.b(b2)) { if (b2.getParentFile() != null) {
b2.createNewFile();
}
if (b2.exists()) {
VkExecutors.x.a().execute(() -> ToastUtils.a(context.getString(R.string.file_saved, b2.getAbsoluteFile()))); VkExecutors.x.a().execute(() -> ToastUtils.a(context.getString(R.string.file_saved, b2.getAbsoluteFile())));
} }
} catch (Exception e2) { } catch (Exception e2) {
L.a(e2); L.a(e2);
} }
CameraUtils.a(context, b2, null); CameraUtils.a(context, b2, null);
return; return;
} }
} }
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(str2)); DownloadManager.Request request = new DownloadManager.Request(Uri.parse(str2));
request.setDestinationUri(Uri.fromFile(b2)); request.setDestinationUri(Uri.fromFile(b2));
request.setMimeType(FileUtils.f(new File(str))); request.setMimeType(FileUtils.f(new File(str)));
@@ -98,6 +106,9 @@ public class DownloadUtils {
} }
try { try {
long enqueue = a2.enqueue(request); long enqueue = a2.enqueue(request);
if (pic) {
CameraUtils.a(context, b2, null);
}
if (!z) { if (!z) {
return; return;
} }
@@ -180,7 +191,7 @@ public class DownloadUtils {
String f2 = FileUtils.f(file); String f2 = FileUtils.f(file);
if (!TextUtils.isEmpty(f2)) { if (!TextUtils.isEmpty(f2)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(FileUtils.n(file), f2); intent.setDataAndType(FileUtils.uriFromFile(file), f2);
context.startActivity(intent); context.startActivity(intent);
return true; return true;
} }
@@ -34,4 +34,7 @@ public enum DialogAction {
DNT_OFF, DNT_OFF,
pinmsg, pinmsg,
unpinmsg, unpinmsg,
ENCRYPT_SETT,
ENCRYPT,
DOWNLOAD
} }
@@ -81,6 +81,7 @@ public final class DialogActionsHelper {
CollectionExt.a(arrayList, DialogAction.NOTIFICATIONS_OFF, dialog.b(b2)); CollectionExt.a(arrayList, DialogAction.NOTIFICATIONS_OFF, dialog.b(b2));
return arrayList; return arrayList;
} }
return new ArrayList<>(); return new ArrayList<>();
} }
@@ -0,0 +1,106 @@
package com.vk.profile.ui.community;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.util.AttributeSet;
import com.vk.core.ui.themes.Themable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.ContextExtKt;
import com.vk.dto.stories.model.StoriesContainer;
import com.vk.stories.view.BorderedCircleImageView;
import com.vtosters.lite.R;
public final class CommunityBorderedImageView extends BorderedCircleImageView implements Themable{
private boolean f0;
private int g0;
private int h0;
private PorterDuffColorFilter i0;
private PorterDuffColorFilter j0;
private int unread;
private int read;
public CommunityBorderedImageView(Context context){
this(context, null, 0, 6);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet){
this(context, attributeSet, 0, 4);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i, int i2){
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i){
super(context, attributeSet, i);
this.g0 = VKThemeHelper.d((int) R.attr.accent);
this.h0 = ContextExtKt.a(context, (int) R.color.gray_200);
this.i0 = new PorterDuffColorFilter(this.g0, PorterDuff.Mode.SRC_IN);
this.j0 = new PorterDuffColorFilter(this.h0, PorterDuff.Mode.SRC_IN);
}
public final void c(int unread, int read){ // get unread and read resid
this.unread = unread;
this.read = read;
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
}
public final int getPrimaryColor(){
return this.g0;
}
public final void setPrimaryColor(int i){
this.g0 = i;
this.i0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
}
public final int getWasViewedColor(){
return this.h0;
}
public final void setWasViewedColor(int i){
this.h0 = i;
this.j0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
}
public final void o(){
this.f0 = false;
l();
}
@Override // com.vk.stories.view.ClippedImageView, android.widget.ImageView, android.view.View
public void onDraw(Canvas canvas){
super.onDraw(canvas);
if (this.f0) {
a(canvas);
}
}
public final void setStoryContainer(StoriesContainer storiesContainer){
if (storiesContainer.L1()) {
this.f0 = true;
m();
if (storiesContainer.K1()) {
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
setBorderColorFilter(this.i0);
b(getWidth(), getHeight());
invalidate();
return;
}
this.T = BitmapFactory.decodeResource(getResources(), this.read);
setBorderColorFilter(this.j0);
b(getWidth(), getHeight());
invalidate();
return;
}
o();
}
@Override // com.vk.core.ui.themes.Themable
public void v(){
}
}
@@ -11,7 +11,6 @@ import android.graphics.BitmapShader;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.LinearGradient; import android.graphics.LinearGradient;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Shader; import android.graphics.Shader;
@@ -36,8 +35,6 @@ import com.vtosters.lite.a0;
import java.util.Arrays; import java.util.Arrays;
import ru.vtosters.lite.utils.AndroidUtils;
@UiThread @UiThread
public class TargetImageView extends VKMultiImageView { public class TargetImageView extends VKMultiImageView {
private static final int I = Screen.a(2); private static final int I = Screen.a(2);
@@ -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();
}
}
}
+20 -20
View File
@@ -3560,26 +3560,26 @@ public class R {
public static final int stickers_notifications_size = 0x7f070285; public static final int stickers_notifications_size = 0x7f070285;
public static final int stickers_tabs_padding = 0x7f070286; public static final int stickers_tabs_padding = 0x7f070286;
public static final int stickers_tabs_size = 0x7f070287; public static final int stickers_tabs_size = 0x7f070287;
public static final int stiсkers_catalog_button_padding_bottom = 0x7f070288; public static final int stickers_catalog_button_padding_bottom = 0x7f070288;
public static final int stiсkers_catalog_button_padding_left = 0x7f070289; public static final int stickers_catalog_button_padding_left = 0x7f070289;
public static final int stiсkers_catalog_button_padding_right = 0x7f07028a; public static final int stickers_catalog_button_padding_right = 0x7f07028a;
public static final int stiсkers_catalog_button_padding_top = 0x7f07028b; public static final int stickers_catalog_button_padding_top = 0x7f07028b;
public static final int stiсkers_catalog_double_stacked_slider_image_bg_size = 0x7f07028c; public static final int stickers_catalog_double_stacked_slider_image_bg_size = 0x7f07028c;
public static final int stiсkers_catalog_double_stacked_slider_image_corner_radius = 0x7f07028d; public static final int stickers_catalog_double_stacked_slider_image_corner_radius = 0x7f07028d;
public static final int stiсkers_catalog_double_stacked_slider_image_size = 0x7f07028e; public static final int stickers_catalog_double_stacked_slider_image_size = 0x7f07028e;
public static final int stiсkers_catalog_large_slider_image_bg_height = 0x7f07028f; public static final int stickers_catalog_large_slider_image_bg_height = 0x7f07028f;
public static final int stiсkers_catalog_large_slider_image_bg_width = 0x7f070290; public static final int stickers_catalog_large_slider_image_bg_width = 0x7f070290;
public static final int stiсkers_catalog_large_slider_image_corner_radius = 0x7f070291; public static final int stickers_catalog_large_slider_image_corner_radius = 0x7f070291;
public static final int stiсkers_catalog_large_slider_image_size = 0x7f070292; public static final int stickers_catalog_large_slider_image_size = 0x7f070292;
public static final int stiсkers_catalog_small_slider_image_bg_size = 0x7f070293; public static final int stickers_catalog_small_slider_image_bg_size = 0x7f070293;
public static final int stiсkers_catalog_small_slider_image_corner_radius = 0x7f070294; public static final int stickers_catalog_small_slider_image_corner_radius = 0x7f070294;
public static final int stiсkers_catalog_small_slider_image_size = 0x7f070295; public static final int stickers_catalog_small_slider_image_size = 0x7f070295;
public static final int stiсkers_catalog_triple_stacked_slider_image_bg_size = 0x7f070296; public static final int stickers_catalog_triple_stacked_slider_image_bg_size = 0x7f070296;
public static final int stiсkers_catalog_triple_stacked_slider_image_corner_radius = 0x7f070297; public static final int stickers_catalog_triple_stacked_slider_image_corner_radius = 0x7f070297;
public static final int stiсkers_catalog_triple_stacked_slider_image_size = 0x7f070298; public static final int stickers_catalog_triple_stacked_slider_image_size = 0x7f070298;
public static final int stiсkers_catalog_vertical_list_image_bg_size = 0x7f070299; public static final int stickers_catalog_vertical_list_image_bg_size = 0x7f070299;
public static final int stiсkers_catalog_vertical_list_image_corner_radius = 0x7f07029a; public static final int stickers_catalog_vertical_list_image_corner_radius = 0x7f07029a;
public static final int stiсkers_catalog_vertical_list_image_size = 0x7f07029b; public static final int stickers_catalog_vertical_list_image_size = 0x7f07029b;
public static final int story_author_title_top_space = 0x7f07029c; public static final int story_author_title_top_space = 0x7f07029c;
public static final int story_cadre_bottom_btn_top_padding = 0x7f07029d; public static final int story_cadre_bottom_btn_top_padding = 0x7f07029d;
public static final int story_camera_tabs_height = 0x7f07029e; public static final int story_camera_tabs_height = 0x7f07029e;
@@ -1,5 +1,6 @@
package com.vtosters.lite.ui.bottomnavigation; package com.vtosters.lite.ui.bottomnavigation;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock; import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock;
import android.annotation.SuppressLint; 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.setScaleY(mLargeLabel, !mStaticModeEnabled && !checked ? mLargeScale : 1.0f);
ViewCompat.setScaleX(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f); ViewCompat.setScaleX(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
ViewCompat.setScaleY(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); mLargeLabel.setTypeface(null, Typeface.BOLD);
mSmallLabel.setTypeface(null, Typeface.BOLD); mSmallLabel.setTypeface(null, Typeface.BOLD);
// make mLargeLabel and mSmallLabel text size is 10sp int textsize;
mLargeLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
mSmallLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10); 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); mLargeLabel.setVisibility(/*checked ? VISIBLE :*/ INVISIBLE);
mSmallLabel.setVisibility(VISIBLE);//checked ? INVISIBLE : VISIBLE); mSmallLabel.setVisibility(VISIBLE);//checked ? INVISIBLE : VISIBLE);
@@ -1,5 +1,7 @@
package ru.vtosters.lite.deviceinfo; package ru.vtosters.lite.deviceinfo;
import androidx.annotation.NonNull;
public class Device { public class Device {
private String androidId; private String androidId;
private String bluetoothMac; private String bluetoothMac;
@@ -86,6 +88,7 @@ public class Device {
return this; return this;
} }
@NonNull
public String toString() { public String toString() {
return "Device{serialId='" + this.serialId + "', androidId='" + this.androidId + "', wifiMac='" + this.wifiMac + "', bluetoothMac='" + this.bluetoothMac + "'}"; return "Device{serialId='" + this.serialId + "', androidId='" + this.androidId + "', wifiMac='" + this.wifiMac + "', bluetoothMac='" + this.bluetoothMac + "'}";
} }
@@ -1,5 +1,6 @@
package ru.vtosters.lite.deviceinfo; package ru.vtosters.lite.deviceinfo;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.content.Context; import android.content.Context;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
@@ -28,6 +29,7 @@ public class DeviceInfoCollector {
private String serialId() { private String serialId() {
String str; String str;
try { try {
@SuppressLint("PrivateApi")
Class<?> cls = Class.forName("android.os.SystemProperties"); Class<?> cls = Class.forName("android.os.SystemProperties");
Method method = cls.getMethod("get", String.class); Method method = cls.getMethod("get", String.class);
str = (String) method.invoke(cls, "gsm.sn1"); str = (String) method.invoke(cls, "gsm.sn1");
@@ -53,6 +55,7 @@ public class DeviceInfoCollector {
return null; return null;
} }
@SuppressLint("HardwareIds")
private String androidId(Context context) { private String androidId(Context context) {
return Settings.Secure.getString(context.getContentResolver(), "android_id").toLowerCase(); return Settings.Secure.getString(context.getContentResolver(), "android_id").toLowerCase();
} }
@@ -99,7 +102,7 @@ public class DeviceInfoCollector {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
int length = hardwareAddress.length; int length = hardwareAddress.length;
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
sb.append(String.format("%02X:", Byte.valueOf(hardwareAddress[i]))); sb.append(String.format("%02X:", hardwareAddress[i]));
} }
if (sb.length() > 0) { if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1);
@@ -1,93 +1,263 @@
package ru.vtosters.lite.dnr; package ru.vtosters.lite.dnr;
import static com.vk.im.engine.h.im_ic_done;
import static com.vk.im.engine.h.im_ic_edit_msg;
import static com.vk.im.engine.h.im_ic_more_vertical;
import static com.vk.im.engine.h.im_ic_pinned_msg_hide;
import static com.vk.im.engine.h.im_ic_pinned_msg_show;
import static com.vk.im.ui.c.im_ic_keyboard;
import static ru.vtosters.lite.dnr.DNRModule.hookDNR; import static ru.vtosters.lite.dnr.DNRModule.hookDNR;
import static ru.vtosters.lite.dnr.DNRModule.hookDNT; import static ru.vtosters.lite.dnr.DNRModule.hookDNT;
import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor; import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor; 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.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.getDownloadsDir;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.os.Environment;
import android.util.Log; import android.util.Log;
import com.vk.core.network.Network; 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.dialogs.Dialog;
import com.vk.im.engine.models.messages.Msg; import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser; import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.common.DialogAction; import com.vk.im.ui.components.common.DialogAction;
import com.vk.im.ui.components.common.MsgAction; import com.vk.im.ui.components.common.MsgAction;
import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg; import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg;
import com.vk.im.ui.views.dialog_actions.DialogActionsListView;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import okhttp3.Headers; import okhttp3.Headers;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; 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.ui.dialogs.Translate;
public class DNRInjector { public class DNRInjector {
public static void inject(Dialog dialog, List<DialogAction> list) { public static void inject(Dialog dialog, List<DialogAction> list) {
int peerId = dialog.getId(); int peerId = 0;
list.add(DialogAction.valueOf("pinmsg")); if (dialog != null) {
list.add(DialogAction.valueOf("unpinmsg")); peerId = dialog.getId();
}
list.add(DialogAction.DOWNLOAD);
list.add(DialogAction.pinmsg);
list.add(DialogAction.unpinmsg);
if (isDnrEnabledFor(peerId)) { if (isDnrEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNR_OFF")); list.add(DialogAction.DNR_OFF);
} else { } else {
list.add(DialogAction.valueOf("DNR_ON")); list.add(DialogAction.DNR_ON);
} }
if (isDntEnabledFor(peerId)) { if (isDntEnabledFor(peerId)) {
list.add(DialogAction.valueOf("DNT_OFF")); list.add(DialogAction.DNT_OFF);
} else { } 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) { public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) {
hashMap.put(DialogAction.valueOf("DNR_ON"), getIdentifier("DNR_ON", "string")); hashMap.put(DialogAction.DOWNLOAD, getIdentifier("download_dl", "string"));
hashMap.put(DialogAction.valueOf("DNR_OFF"), getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.valueOf("DNT_ON"), getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.valueOf("DNT_OFF"), getIdentifier("DNT_OFF", "string"));
hashMap.put(DialogAction.DNR_ON, getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.DNR_OFF, getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.DNT_ON, getIdentifier("DNT_ON", "string"));
hashMap.put(DialogAction.DNT_OFF, getIdentifier("DNT_OFF", "string"));
// hashMap.put(DialogAction.valueOf("pinmsg"), getIdentifier("pinmsg", "string")); hashMap.put(DialogAction.ENCRYPT, getIdentifier("encryption", "string"));
// hashMap.put(DialogAction.valueOf("unpinmsg"), getIdentifier("unpinmsg", "string")); hashMap.put(DialogAction.ENCRYPT_SETT, getIdentifier("encryption_sett", "string"));
// hashMap.put(DialogAction.pinmsg, getIdentifier("pinmsg", "string"));
// hashMap.put(DialogAction.unpinmsg, getIdentifier("unpinmsg", "string"));
return hashMap; return hashMap;
} }
public static boolean onClick(Dialog dialog, DialogAction action) { @SuppressLint("ResourceType")
var id = dialog.getId(); public static List<Object> injectToList(List<Object> actions) {
var list = new ArrayList<>(actions);
list.add(new DialogActionsListView.b.a(DialogAction.DOWNLOAD, 1, getIdentifier("im_ic_msgdl", "attr"), getIdentifier("download_dl", "string"))); // DialogAction, Int, Icon, String
if (action == DialogAction.valueOf("MARK_AS_READ")) { list.add(new DialogActionsListView.b.a(DialogAction.DNR_ON, 2, im_ic_pinned_msg_hide, getIdentifier("DNR_ON", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNR_OFF, 2, im_ic_pinned_msg_show, getIdentifier("DNR_OFF", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNT_ON, 2, im_ic_edit_msg, getIdentifier("DNT_ON", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNT_OFF, 2, im_ic_edit_msg, getIdentifier("DNT_OFF", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT, 3, im_ic_keyboard, getIdentifier("encryption", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT_SETT, 3, im_ic_more_vertical, getIdentifier("encryption_sett", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.MARK_AS_READ, 4, im_ic_done, getIdentifier("vkim_dialogs_list_option_mark_as_read", "string"))); // DialogAction, Int, Icon, String
return list;
}
public static void forceInvalidateDialogActions(Dialog d) {
EntityIntMap<Dialog> map = new EntityIntMap<>();
map.a(d.getId(), d);
ImEngine1.a().a(new OnDialogUpdateEvent(null, map));
}
public static List<DialogAction> injectToListAccess(List<DialogAction> actions, Dialog dialog) {
int peerId = 0;
if (dialog != null) {
peerId = dialog.getId();
}
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) {
peerId = dialog.getId();
}
if (action == DialogAction.MARK_AS_READ) {
DNRModule.hookRead(dialog);
forceInvalidateDialogActions(dialog);
}
if (action == DialogAction.DOWNLOAD) {
File out = new File(Environment.getExternalStoragePublicDirectory(getDownloadsDir().getName()), "dialog-" + peerId + ".html");
try {
new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out);
} catch (Exception e) {
sendToast(getString("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) {
peerId = dialog.getId();
}
if (action == DialogAction.MARK_AS_READ) {
DNRModule.hookRead(dialog); DNRModule.hookRead(dialog);
} }
if (action == DialogAction.valueOf("DNR_ON")) { if (action == DialogAction.DOWNLOAD) {
File out = new File(Environment.getExternalStoragePublicDirectory(getDownloadsDir().getPath()), 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); setDnr(dialog, true);
return true; return true;
} else if (action == DialogAction.valueOf("DNR_OFF")) { } else if (action == DialogAction.DNR_OFF) {
setDnr(dialog, false); setDnr(dialog, false);
return true; return true;
} }
if (action == DialogAction.valueOf("DNT_ON")) { if (action == DialogAction.DNT_ON) {
setDnt(dialog, true); setDnt(dialog, true);
return true; return true;
} else if (action == DialogAction.valueOf("DNT_OFF")) { } else if (action == DialogAction.DNT_OFF) {
setDnt(dialog, false); setDnt(dialog, false);
return true; return true;
} }
if (action == DialogAction.valueOf("pinmsg")) { if (action == DialogAction.pinmsg) {
pinnedMsg(id, true); pinnedMsg(peerId, true);
return true; return true;
} else if (action == DialogAction.valueOf("unpinmsg")) { } else if (action == DialogAction.unpinmsg) {
pinnedMsg(id, false); 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; return true;
} }
@@ -102,6 +272,7 @@ public class DNRInjector {
public static boolean onClickMsg(Context context, MsgAction action, Msg msg) { public static boolean onClickMsg(Context context, MsgAction action, Msg msg) {
var text = ((MsgFromUser) msg).f(); var text = ((MsgFromUser) msg).f();
var peerId = msg.v1();
var fullMsg = ((MsgFromUser) msg).j2(); // text + reply var fullMsg = ((MsgFromUser) msg).j2(); // text + reply
var reply = fullMsg.substring(text.length() + 1); var reply = fullMsg.substring(text.length() + 1);
@@ -113,15 +284,24 @@ public class DNRInjector {
var isTextExist = !text.isEmpty() && !text.equals(" "); var isTextExist = !text.isEmpty() && !text.equals(" ");
var isReplyExist = !reply.isEmpty() && !reply.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 (action == MsgAction.valueOf("TRANSLATE")) {
if (isTextExist && isReplyExist) { if (isTextExist && isReplyExist) {
Translate.showTranslatedText(context, text + "\n\nРеплай:\n" + reply); Translate.showTranslatedText(context, text + "\n\n" + getString("translator_reply") + "\n" + reply);
} else if (isReplyExist) { } else if (isReplyExist) {
Translate.showTranslatedText(context, "Реплай:\n" + reply); Translate.showTranslatedText(context, getString("translator_reply") + "\n" + reply);
} else if (isTextExist) { } else if (isTextExist) {
Translate.showTranslatedText(context, text); Translate.showTranslatedText(context, text);
} else { } else {
sendToast("Нет текста для перевода"); sendToast(getString("translator_no_text"));
} }
} }
@@ -132,7 +312,7 @@ public class DNRInjector {
Thread thread = new Thread(() -> { Thread thread = new Thread(() -> {
try { try {
var request = new Request.a() 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(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
.a(); .a();
@@ -149,15 +329,27 @@ public class DNRInjector {
thread.start(); thread.start();
sendToast("Диалог успешно " + (needToBePinned ? "закреплен" : "откреплен")); sendToast(getString("pin_dialog") + " " + getString(needToBePinned ? "dialog_pinned" : "dialog_unpinned"));
} }
public static void setDnr(Dialog dialog, boolean value) { 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) { 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; package ru.vtosters.lite.dnr;
import static ru.vtosters.lite.net.Request.makeRequest; import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.ProxyUtils.getApi;
import android.util.Log; import android.util.Log;
@@ -1,6 +1,7 @@
package ru.vtosters.lite.downloaders; package ru.vtosters.lite.downloaders;
import android.os.Environment; import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import android.util.Log; import android.util.Log;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
@@ -31,11 +32,11 @@ public class AudioDownloader {
public static void downloadM3U8(MusicTrack track) { public static void downloadM3U8(MusicTrack track) {
if (track.D == null) { if (track.D == null) {
ToastUtils.a("Не удалось найти ссылку на аудиозапись"); ToastUtils.a(AndroidUtils.getString("link_audio_error"));
return; return;
} }
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath(); var musicPath = getMusicDir().getAbsolutePath();
var musicDir = new File(musicPath); var musicDir = new File(musicPath);
if (!musicDir.exists()) { if (!musicDir.exists()) {
if (musicDir.mkdirs()) { if (musicDir.mkdirs()) {
@@ -64,7 +65,7 @@ public class AudioDownloader {
var success = FFMpeg.convert(downloadPath, musicPath + File.separator + fileName + ".mp3"); var success = FFMpeg.convert(downloadPath, musicPath + File.separator + fileName + ".mp3");
if (success) { if (success) {
notification notification
.setContentText("Загрузка завершена") .setContentText(AndroidUtils.getString("player_download_finished"))
.setProgress(0, 0, false) .setProgress(0, 0, false)
.setSmallIcon(android.R.drawable.stat_sys_download_done); .setSmallIcon(android.R.drawable.stat_sys_download_done);
notificationManager.notify(tempId, notification.build()); notificationManager.notify(tempId, notification.build());
@@ -72,7 +73,7 @@ public class AudioDownloader {
onFailure(); onFailure();
} }
} catch (UnsatisfiedLinkError e) { } catch (UnsatisfiedLinkError e) {
Log.e("AudioDownloader", "Опять эти нативные либы"); Log.e("AudioDownloader", "native libs");
Log.e("AudioDownloader", e.getMessage()); Log.e("AudioDownloader", e.getMessage());
onFailure(); onFailure();
} }
@@ -80,7 +81,7 @@ public class AudioDownloader {
@Override @Override
public void onFailure() { public void onFailure() {
notification.setContentText("Не удалось загрузить аудиозапись").setProgress(0, 0, false); notification.setContentText(AndroidUtils.getString("load_audio_error")).setProgress(0, 0, false);
notificationManager.notify(tempId, notification.build()); notificationManager.notify(tempId, notification.build());
} }
@@ -109,7 +110,7 @@ public class AudioDownloader {
private static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) { private static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID) var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download) .setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle("Загрузка аудиозаписи") .setContentTitle(AndroidUtils.getString("audio_downloading"))
.setContentText(track.toString()) .setContentText(track.toString())
.setPriority(NotificationCompat.PRIORITY_LOW) .setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS) .setCategory(NotificationCompat.CATEGORY_PROGRESS)
@@ -0,0 +1,604 @@
package ru.vtosters.lite.downloaders;
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.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import android.util.SparseArray;
import android.widget.Toast;
import androidx.annotation.Nullable;
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;
public class MessagesDownloader{
private static SimpleDateFormat sdformat;
private static SparseArray<MiniUser> usersArray;
private static final String VK_DOMAIN = "vk.com";
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();
}
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();
Toast.makeText(getGlobalContext(), "Сохранено как " + out.getAbsolutePath(), Toast.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>Экспорт из VTLite</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\">Экспорт истории чата (" + 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\">Вложения: " + 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\">от <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 = "Вложение";
}
return "<a href=\"#" + messageId + "\" class=\"msg-attach-link\">" +
"<div class=\"msg-reply\">" +
"<p class=\"reply-header\">Пересланное сообщение</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) ? "Вложения: " + 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 = {"сообщение", "сообщения", "сообщений"};
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("Обновил фотографию беседы");
break;
case "chat_photo_remove":
htmlAction.append("Удалил фотографию беседы");
break;
case "chat_create":
var name = action.optString("text");
htmlAction.append("Создал беседу").append((!name.isEmpty()) ? " с названием \"" + name + "\"" : "");
break;
case "chat_title_update":
var newName = action.optString("text");
htmlAction.append("Сменил название беседы").append((!newName.isEmpty()) ? " на \"" + newName : "\"");
break;
case "chat_invite_user":
var newUserId = action.optInt("member_id");
htmlAction.append("Добавил ").append((newUserId > 0) ? "пользователя" : "группу");
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("Исключил ").append((removedUserId > 0) ? "пользователя" : "группу");
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("Закрепил сообщение").append((!message.isEmpty()) ? (" с текстом: \"" + message + "\"") : "");
break;
case "chat_unpin_message":
htmlAction.append("Открепил сообщение");
break;
case "chat_invite_user_by_link":
htmlAction.append("Вступил в беседу по ссылке");
break;
case "chat_screenshot":
htmlAction.append("Сделал скриншот беседы");
break;
case "custom":
htmlAction.append(action.optString("message"));
break;
default:
htmlAction.append("Действие не поддерживается (").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\">фотография</a>");
break;
case "doc":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">документ</a>");
break;
case "link":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">ссылка</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\">запись на стене</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\">голосовое сообщение</a>");
break;
case "audio":
rs.append("аудиозапись (").append(item.optString("artist")).append(" — ").append(item.optString("title")).append(")");
break;
case "video":
rs.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("\">комментарий на стене</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("\">история</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("\">подкаст</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("\">мини-приложение</a>");
break;
}
rs.append("ошибка");
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(item.optString("title")).append(")</a>");
break;
case "poll":
rs.append((item.optBoolean("anonymous") ? "анонимный" : "публичный")).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("\">товар</a>");
break;
default:
rs.append("не поддерживается (").append(type).append(")");
break;
}
rs.append(" ");
}
return rs.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(poll.optString("votes")).append(" чел.</p>");
return pollHtml.append("</div>").toString();
}
private static String getVideoHtml(JSONObject files) throws JSONException {
if (files == null) return "ссылки отсутствуют";
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();
}
}
@@ -11,6 +11,8 @@ import android.content.IntentFilter;
import android.net.Uri; import android.net.Uri;
import android.os.Environment; import android.os.Environment;
import com.vk.core.dialogs.alert.VkAlertDialog;
import java.io.File; import java.io.File;
import b.h.g.m.FileUtils; import b.h.g.m.FileUtils;
@@ -46,7 +48,7 @@ public class OTADownloader {
maxIndex = Math.max(maxIndex, Integer.parseInt(name.replaceFirst(".+-(\\d+).+", "$1"))); 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"); 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) { } else if (status == DownloadManager.STATUS_FAILED) {
AndroidUtils.sendToast(getString("downloaderr")); AndroidUtils.sendToast(getString("downloaderr"));
} }
@@ -56,16 +58,31 @@ public class OTADownloader {
public static void downloadBuild(String url) { public static void downloadBuild(String url) {
var context = AndroidUtils.getGlobalContext(); 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); var request = new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("VTLite.apk"); request.setTitle("VTLite.apk");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "VTLite.apk"); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "VTLite.apk");
var manager = (DownloadManager) AndroidUtils.getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE); var manager = (DownloadManager) AndroidUtils.getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request); manager.enqueue(request);
} catch (Exception e) {
e.printStackTrace();
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(context);
alertDialog.setTitle(AndroidUtils.getString("update_error"));
alertDialog.setMessage(AndroidUtils.getString("update_error_text"));
alertDialog.setPositiveButton(AndroidUtils.getString("no"), (dialog, which) -> {
dialog.cancel();
});
alertDialog.setNeutralButton(AndroidUtils.getString("yes"), (dialog, which) -> {
context.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://github.com/vtosters/lite/releases/latest/download/VTLite.apk")));
});
var alert = alertDialog.create();
alert.show();
}
} }
} }
@@ -7,7 +7,6 @@ import static ru.vtosters.lite.utils.Preferences.getPhotosDir;
import android.app.DownloadManager; import android.app.DownloadManager;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Environment;
import com.vk.dto.common.ImageSize; import com.vk.dto.common.ImageSize;
import com.vk.dto.stories.model.StoryEntry; import com.vk.dto.stories.model.StoryEntry;
@@ -23,8 +22,9 @@ public class StoryDownloader {
String url = imageSizes.get(imageSizes.size() - 1).url; String url = imageSizes.get(imageSizes.size() - 1).url;
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("photo" + story.E.a); request.setTitle("photo" + story.E.a + ".jpg");
request.setDestinationInExternalPublicDir(getPhotosDir().getAbsolutePath(), "/Stories/photo" + story.E.a + ".jpg"); request.setDestinationInExternalPublicDir(getPhotosDir().getName(), "photo" + story.E.a + ".jpg");
request.allowScanningByMediaScanner();
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request); ((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
return; return;
} }
@@ -1,20 +1,20 @@
package ru.vtosters.lite.downloaders; package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.net.Request.makeRequest; import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString; import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getVideosDir; import static ru.vtosters.lite.utils.Preferences.getVideosDir;
import android.app.AlertDialog;
import android.app.DownloadManager; import android.app.DownloadManager;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Environment;
import android.widget.Toast; import android.widget.Toast;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.dialogs.bottomsheet.MenuBottomSheetAction; import com.vk.core.dialogs.bottomsheet.MenuBottomSheetAction;
import com.vk.core.util.ToastUtils; import com.vk.core.util.ToastUtils;
import com.vk.dto.common.VideoFile; import com.vk.dto.common.VideoFile;
@@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ExternalLinkParser; import ru.vtosters.lite.utils.ExternalLinkParser;
public class VideoDownloader { public class VideoDownloader {
@@ -105,31 +106,33 @@ public class VideoDownloader {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(videoFile.toString()); request.setTitle(videoFile.toString());
request.setDestinationInExternalPublicDir(getVideosDir().getAbsolutePath(), videoFile + ".mp4"); request.allowScanningByMediaScanner();
request.setDestinationInExternalPublicDir(getVideosDir().getName(), videoFile + ".mp4");
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request); ((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
return; return;
} }
var builder = new AlertDialog.Builder(context); var builder = new VkAlertDialog.Builder(context);
builder.setItems(max, ((dialog, which) -> { builder.setItems(max, ((dialog, which) -> {
var url = urls.get(which); var url = urls.get(which);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(videoFile.toString()); request.setTitle(videoFile.toString());
request.setDestinationInExternalPublicDir(getVideosDir().getAbsolutePath(), videoFile + ".mp4"); request.allowScanningByMediaScanner();
request.setDestinationInExternalPublicDir(getVideosDir().getName(), videoFile + ".mp4");
((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request); ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
})); }));
builder.show(); builder.show();
} }
public static void parseVideoLink(String url, Context ctx) { public static void parseVideoLink(String url, Context ctx) {
if (url.contains("vk.com/story")) { if (url.contains("vk.com/story") || url.contains("vk.com/story")) {
ToastUtils.a("Не поддерживается загрузка историй"); ToastUtils.a(AndroidUtils.getString("video_dl_stories_not_supported"));
return; return;
} }
if (!url.contains("vk.com/video")) { if (!url.contains("vk.com/video") || !url.contains("vk.com/video")) {
ToastUtils.a("Неверная ссылка"); ToastUtils.a(AndroidUtils.getString("video_dl_wrong_link"));
return; return;
} }
@@ -137,10 +140,10 @@ public class VideoDownloader {
String ownerId = videoId.split("_")[0]; String ownerId = videoId.split("_")[0];
final ProgressDialog progressDialog = new ProgressDialog(ctx); final ProgressDialog progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage("Обработка видео"); progressDialog.setMessage(AndroidUtils.getString("video_dl_progress"));
progressDialog.show(); 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 -> { response -> {
progressDialog.cancel(); progressDialog.cancel();
@@ -153,7 +156,7 @@ public class VideoDownloader {
downloadVideo(videoFile, ctx); downloadVideo(videoFile, ctx);
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(ctx, "Видео нельзя скачать", Toast.LENGTH_SHORT).show(); Toast.makeText(ctx, AndroidUtils.getString("video_dl_error"), Toast.LENGTH_SHORT).show();
} }
}); });
} }
@@ -12,8 +12,8 @@ import ru.vtosters.lite.utils.AndroidUtils;
public class NotificationChannels { public class NotificationChannels {
public static final String MUSIC_DOWNLOAD_CHANNEL_ID = "music_download_channel"; public static final String MUSIC_DOWNLOAD_CHANNEL_ID = "music_download_channel";
public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = "Загрузка музыки"; public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = AndroidUtils.getString("music_dl_title");
public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = "Прогресс загрузки музыки"; public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = AndroidUtils.getString("music_dl_progress");
@RequiresApi(api = Build.VERSION_CODES.O) @RequiresApi(api = Build.VERSION_CODES.O)
public static void createChannels() { public static void createChannels() {
@@ -1,10 +1,14 @@
package ru.vtosters.lite.encryption; 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.Log;
import android.util.Pair; import android.util.Pair;
import com.vk.im.engine.models.messages.Msg; import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser; import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.msg_list.MsgListComponent;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
@@ -48,6 +52,48 @@ public class EncryptProvider {
public static int getPeerId(Msg msg) { public static int getPeerId(Msg msg) {
return msg.v1(); 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. // This will run through EVERY single processor available.
public static String decryptMessage(MsgFromUser msg) { public static String decryptMessage(MsgFromUser msg) {
@@ -58,12 +104,13 @@ public class EncryptProvider {
try { try {
for (IMProcessor processor : processors) { for (IMProcessor processor : processors) {
if ((processor.isUsed() || !processor.isPublic()) && processor.isEncrypted(msgBody) && (processor.isPublic() || getKeyForProcessor(processor, peer) != null)) 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) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return msgBody;
return injectOwnTextAll(msgBody);
} }
private static byte[] getKeyForProcessor(IMProcessor processor, int peer) { private static byte[] getKeyForProcessor(IMProcessor processor, int peer) {
@@ -84,9 +131,8 @@ public class EncryptProvider {
return keyString.getBytes(); 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) { public static String encryptMessage(MsgFromUser msg) {
String msgBody = getBody(msg); String msgBody = getBody(msg);
Log.d("EncryptProvider", "encryptMessage: msg = " + msg); Log.d("EncryptProvider", "encryptMessage: msg = " + msg);
@@ -96,11 +142,11 @@ public class EncryptProvider {
for (IMProcessor processor : processors) { for (IMProcessor processor : processors) {
int peer = getPeerId(msg); int peer = getPeerId(msg);
if (processor.isUsedToEncrypt(peer)) { 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 // For rendering UI
@@ -2,12 +2,13 @@ package ru.vtosters.lite.foaf;
import static android.widget.Toast.LENGTH_SHORT; import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText; import static android.widget.Toast.makeText;
import static ru.vtosters.lite.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.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString; 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.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
@@ -17,11 +18,15 @@ import androidx.exifinterface.media.ExifInterface;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -35,6 +40,7 @@ public class FoafBase {
private static final Pattern FOAF_REGEX = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>"); private static final Pattern FOAF_REGEX = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
private static final Pattern FOAF_REGEX_LAST_SEEN = Pattern.compile("<ya:lastLoggedIn dc:date=\"(.*)(((\\+|-)\\d\\d):(\\d\\d))\"\\/>"); 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_LOGIN = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
private static final String API_VKNEXT = "https://api.vtosters.app/v1/getBypassedOnlineInfo?json=1&ids=";
private static final OkHttpClient client = new OkHttpClient(); 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, IOException {
@@ -58,15 +64,57 @@ public class FoafBase {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Moscow")); 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()); sdf.setTimeZone(TimeZone.getDefault());
return sdf.parse(sdf.format(date)).getTime() / 1000; 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 + Integer.toString(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) throws JSONException {
var request = new okhttp3.Request.a()
.b(API_VKNEXT + ids)
.a();
String response = null;
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) { private static String getLink(int i) {
String str; String str;
StringBuilder sb; StringBuilder sb;
if (apiproxy()) { if (isAnyProxyEnabled()) {
sb = new StringBuilder(); sb = new StringBuilder();
str = "https://" + getApi() + "/_/vk.com/foaf.php?id="; str = "https://" + getApi() + "/_/vk.com/foaf.php?id=";
} else { } else {
@@ -95,8 +143,8 @@ public class FoafBase {
Matcher matcher2 = FOAF_REGEX_LOGIN.matcher(str); Matcher matcher2 = FOAF_REGEX_LOGIN.matcher(str);
matcher.find(); matcher.find();
matcher2.find(); matcher2.find();
String normalHumanDate = getNormalHumanDate(matcher.group(1)); String normalHumanDate = getNormalHumanDate(Objects.requireNonNull(matcher.group(1)));
getNormalHumanDate(matcher2.group(1)); getNormalHumanDate(Objects.requireNonNull(matcher2.group(1)));
VkAlertDialog.Builder a2 = new VkAlertDialog.Builder(context).setTitle(getIdentifier("addinf", "string")); 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(); a2.setMessage(getString("foafid") + " " + i + getString("foafregdate") + " " + normalHumanDate + getString("foafdate") + " " + daysPassedFromFoafDate(normalHumanDate)).setPositiveButton(17039370, null).create().show();
} catch (Exception e) { } catch (Exception e) {
@@ -105,8 +153,9 @@ public class FoafBase {
} }
} }
private static long daysPassedFromFoafDate(String str) { private static long daysPassedFromFoafDate(String str) {
try { try {
@SuppressLint("SimpleDateFormat")
Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(str.split(" ")[1]); Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(str.split(" ")[1]);
return TimeUnit.DAYS.convert(new Date().getTime() - parse.getTime(), TimeUnit.MILLISECONDS); return TimeUnit.DAYS.convert(new Date().getTime() - parse.getTime(), TimeUnit.MILLISECONDS);
} catch (ParseException e) { } catch (ParseException e) {
@@ -0,0 +1,129 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.dnr.DNRInjector.forceInvalidateDialogActions;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity;
import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import android.content.Context;
import android.content.res.ColorStateList;
import android.text.Editable;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.im.engine.models.dialogs.Dialog;
import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
public class CryptImHook{
public static boolean isPrivateProcessor(int peerID){
for (IMProcessor processor : EncryptProvider.processors) {
if (processor.isUsedToEncrypt(peerID)) {
return !processor.isPublic();
}
}
return false;
}
public static void hook(int peerId, Dialog d){
List<IMProcessor> processors = EncryptProvider.processors;
IMProcessor enabled = null;
int enabledPosition = 0;
String[] titles = new String[processors.size() + 1];
titles[0] = getString("encryption_disable");
for (int i = 0; i < processors.size(); i++) {
IMProcessor proc = processors.get(i);
titles[i + 1] = proc.getUIName();
if (proc.isUsedToEncrypt(peerId)) {
enabled = proc;
enabledPosition = i + 1;
}
}
IMProcessor finalEnabled = enabled;
new VkAlertDialog.Builder(getCurrentActivity())
.setTitle(getString("encryption_sett"))
.setSingleChoiceItems(titles, enabledPosition, (dialog, which) -> {
if (which == 0) {
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
} else {
IMProcessor proc = processors.get(which - 1);
if (proc.isUsedToEncrypt(peerId)) {
proc.disableEncryptFor(peerId);
} else {
proc.enableEncryptFor(peerId);
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
}
}
dialog.dismiss();
forceInvalidateDialogActions(d);
}).create().show();
}
public static void hookPref(int peerId){
IMProcessor enabled = null;
String key = null;
for (IMProcessor processor : EncryptProvider.processors) {
if (processor.isUsedToEncrypt(peerId)) {
enabled = processor;
}
}
if (enabled != null && enabled.isPublic()) {
sendToast(getString("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();
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 AlertDialog.Builder(ctx, getAlertStyle())
.setTitle(getString("encryption_enter_key"))
.setMessage(String.format(getString("encryption_current_algorithm_title"), enabled.getUIName()))
.setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
Editable edit = editText.getText();
finalEnabled.setEncryptionKeyFor(peerId, edit == null ? null : edit.toString());
}).setNegativeButton(android.R.string.cancel, null).create().show();
}
}
@@ -1,10 +1,13 @@
package ru.vtosters.lite.hooks; 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 static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.annotation.SuppressLint;
import android.os.Build;
import android.provider.Settings;
import android.util.Log; import android.util.Log;
import java.util.Random;
public class DeviceInfoHook{ public class DeviceInfoHook{
public static String getDeviceInfo(String input) { public static String getDeviceInfo(String input) {
Log.d("DeviceInfoHook", "getDeviceInfo: " + input); Log.d("DeviceInfoHook", "getDeviceInfo: " + input);
@@ -13,27 +16,30 @@ public class DeviceInfoHook{
} }
public static String getDeviceId(String input) { public static String getDeviceId(String input) {
Log.d("DeviceInfoHook", "getDeviceId: " + input); return findDeviceId() + ":" + getDeviceId();
Log.d("DeviceInfoHook", "getDeviceId shuffled: " + shuffle(input));
if (getBoolValue("hideDeviceInfo", true)) return shuffle(input);
return input;
} }
public static String shuffle(String string) { public static String getDeviceId() {
StringBuilder sb = new StringBuilder(string.length()); String sb2 = Build.PRODUCT +
double rnd; Build.BOARD +
for (char c: string.toCharArray()) { Build.BOOTLOADER +
rnd = Math.random(); Build.BRAND +
if (rnd < 0.34) Build.DEVICE +
sb.append(c); Build.DISPLAY +
else if (rnd < 0.67) Build.FINGERPRINT +
sb.insert(sb.length() / 2, c); Build.HARDWARE +
else Build.HOST +
sb.insert(0, c); Build.ID +
Build.MANUFACTURER +
Build.MODEL +
Build.PRODUCT +
Build.TAGS;
sb.append(new Random().nextInt(10)); return MD5(sb2);
sb.deleteCharAt(0); }
}
return sb.toString(); @SuppressLint("HardwareIds")
private static String findDeviceId() {
return Settings.Secure.getString(getGlobalContext().getContentResolver(), "android_id");
} }
} }
@@ -286,7 +286,7 @@ public class DockBarInjector {
} }
public static Class<?> interceptClick(int id, RightMenu rightMenu) { public static Class<?> interceptClick(int id, RightMenu rightMenu) {
if (id == tab_menu) { if (id == tab_menu && rightMenu != null) {
rightMenu.a(); rightMenu.a();
} }
@@ -294,6 +294,7 @@ public class DockBarInjector {
if (id == tab.id) if (id == tab.id)
return tab.fragmentClass; return tab.fragmentClass;
} }
for (DockBarTab tab : sManager.getDisabledTabs()) { for (DockBarTab tab : sManager.getDisabledTabs()) {
if (id == tab.id) if (id == tab.id)
return tab.fragmentClass; return tab.fragmentClass;
@@ -1,8 +1,11 @@
package ru.vtosters.lite.hooks; 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.hooks.DateHook.getLocale;
import static ru.vtosters.lite.utils.Base64Utils.decode; import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles;
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.NewsFeedFiltersUtils.checkCaption; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews;
@@ -21,6 +24,7 @@ import static ru.vtosters.lite.utils.VTVerifications.isDeveloper;
import static ru.vtosters.lite.utils.VTVerifications.isPrometheus; import static ru.vtosters.lite.utils.VTVerifications.isPrometheus;
import static ru.vtosters.lite.utils.VTVerifications.isVerified; import static ru.vtosters.lite.utils.VTVerifications.isVerified;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.vk.core.network.Network; import com.vk.core.network.Network;
@@ -33,6 +37,8 @@ import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Objects; import java.util.Objects;
import java.util.Random; import java.util.Random;
@@ -69,7 +75,7 @@ public class JsonInjectors {
} }
public static JSONObject donateRecomm() throws JSONException { public static JSONObject donateRecomm() throws JSONException {
var title = "Помоги проекту донатом и получи бонус!"; var title = AndroidUtils.getString("donate_to_vtl");
var link = "https://vk.com/vtosters_official"; var link = "https://vk.com/vtosters_official";
var text_color = "2D81E0"; var text_color = "2D81E0";
@@ -110,9 +116,9 @@ public class JsonInjectors {
} }
public static JSONObject vktesters(int id) throws JSONException { public static JSONObject vktesters(int id) throws JSONException {
var title = "Карточка Тестера"; var title = AndroidUtils.getString("tester_profile");
var text_color = "2D81E0"; 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 json = new JSONObject();
var icons = new JSONArray(); var icons = new JSONArray();
@@ -154,27 +160,20 @@ public class JsonInjectors {
var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id"); var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id");
var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null
var text = "Я не загрузил данные (9(9(("; var text = AndroidUtils.getString("no_data_error");
var link = "https://vtosters.app"; // can be null var link = "https://vtosters.app"; // can be null
var linktitle = "Test button"; // can be null var linktitle = "Test button"; // can be null
// "{\"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 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"); var isPicture = pic.endsWith(".png") || pic.endsWith(".jpg") || pic.endsWith(".jpeg") || pic.endsWith(".webp");
if (!isPicture) hasIcon = false; if (isVerified(peerid)) text = AndroidUtils.getString("i_bought") + " VTosters Premium";
if (!hasIcon) icon = ""; if (isPrometheus(peerid)) text = AndroidUtils.getString("i_bought") + " VTosters Premium Gold Prime Pro Plus";
if (!hasButton) buttons = ""; if (isDeveloper(peerid)) text = AndroidUtils.getString("i_created_poop");
if (isVerified(peerid)) text = "Я купил VTosters Premium"; if (!isVerified(peerid) || text.equals("") || peerid == AccountManagerUtils.getUserId() || peerid == 0) {
if (isPrometheus(peerid)) text = "Я купил VTosters Premium Gold Prime Pro Plus";
if (isDeveloper(peerid)) text = "Я создал говно";
if (!isVerified(peerid) || text.equals("")) {
if (getBoolValue("convBarRecomm", false)) { if (getBoolValue("convBarRecomm", false)) {
return null; return null;
} else { } else {
@@ -182,14 +181,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 + "\"}"); var json = new JSONObject();
return new JSONObject(decode("eyJuYW1lIjoiZ3JvdXBfYWRtaW5fd2VsY29tZSIsInRleHQiOiI=")
+ text + decode("IiwiYnV0dG9ucyI6Ww==") var buttonsJson = new JSONObject();
+ buttons + decode("XQ==") buttonsJson.put("layout", "tertiary");
+ icon buttonsJson.put("text", linktitle);
+ decode("fQ==")); 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 { public static JSONObject menu(JSONObject orig) throws JSONException {
@@ -267,29 +279,82 @@ public class JsonInjectors {
public static JSONObject setOnlineInfo(JSONObject json) throws ParseException, IOException, JSONException { public static JSONObject setOnlineInfo(JSONObject json) throws ParseException, IOException, JSONException {
var id = json.optInt("id"); var id = json.optInt("id");
if (id == AccountManagerUtils.getUserId()) {
return json;
}
var onlineinfo = json.optJSONObject("online_info"); 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()) { var online_info = new JSONObject()
json.remove("online_info"); .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 online_info = new JSONObject() var last_seen = new JSONObject()
.put("visible", true) .put("platform", bypassed.optInt("platform"))
.put("last_seen", time) .put("time", bypassed.optInt("last_seen"));
.put("is_online", false)
.put("app_id", 0)
.put("is_mobile", false);
var last_seen = new JSONObject() json.put("last_seen", last_seen).put("online_info", online_info);
.put("platform", 4) }
.put("time", time);
json.put("last_seen", last_seen).put("online_info", online_info);
} }
return json; return json;
} }
public static JSONArray setOnlineInfoUsers(JSONArray profiles) throws ParseException, IOException, 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", 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"));
profile.put("last_seen", last_seen).put("online_info", online_info);
}
return profiles;
}
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException { public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
if (!adsstories()) { if (!adsstories()) {
return json; return json;
@@ -370,15 +435,62 @@ public class JsonInjectors {
return false; return false;
} }
public static JSONArray newsfeedlist(JSONArray items) throws JSONException { public static Boolean isWhitelistedFilters(JSONObject list) throws JSONException {
for (int j = 0; j < items.length(); j++) { var id = String.valueOf(list.optInt("owner_id"));
var list = items.optJSONObject(j);
var name = list.optString("id");
if (!name.equals("kpop") && !name.equals("foryou") && !name.equals("qazaqstan")) { if (id.equals("0")) {
list.put("is_hidden", false).put("is_unavailable", false); id = String.valueOf(list.optInt("source_id"));
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + name + " in newsfeed list"); }
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>()));
return whitelist.contains(id);
}
public static Boolean isWhitelistedAd(JSONObject list) throws JSONException {
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.synchronizedSet(new LinkedHashSet<>()));
return whitelist.contains(id);
}
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null);
var mutableFiltersSet = Collections.synchronizedSet(new LinkedHashSet<String>());
if (filtersSet != null)
mutableFiltersSet.addAll(filtersSet);
synchronized (mutableFiltersSet) {
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item == null) continue;
var id = item.optString("id");
var title = item.optString("title");
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
// this items not working
|| id.equals("kpop") || id.equals("foryou")
|| id.equals("qazaqstan") || id.equals("podcasts"))
continue;
mutableFiltersSet.add(id + "|" + title);
var hide = selectedItems.contains(id);
Log.d("NewsfeedList", "Added list " + id + " to feed");
item.put("is_hidden", hide)
.put("is_unavailable", hide);
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
} }
getDefaultPrefs().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
.apply();
} }
return items; return items;
@@ -418,31 +530,31 @@ public class JsonInjectors {
continue; continue;
} }
if (adsgroup() && list.optInt("marked_as_ads") == 1) { if (adsgroup() && list.optInt("marked_as_ads") == 1 && !isWhitelistedAd(list)) {
if (dev()) if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: marked_as_ads is true"); Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: marked_as_ads is true");
continue; continue;
} }
if (isBadNews(list.optString("text"))) { if (isBadNews(list.optString("text")) && !isWhitelistedFilters(list)) {
if (dev()) if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: text filters"); Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: text filters");
continue; continue;
} }
if (checkCopyright(list)) { if (checkCopyright(list) && !isWhitelistedFilters(list)) {
if (dev()) if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: copyright filters"); Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: copyright filters");
continue; continue;
} }
if (checkCaption(list)) { if (checkCaption(list) && !isWhitelistedFilters(list)) {
if (dev()) if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters"); Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters");
continue; continue;
} }
if (NewsFeedFiltersUtils.injectFiltersReposts(list)) { if (NewsFeedFiltersUtils.injectFiltersReposts(list) && !isWhitelistedFilters(list)) {
if (dev()) if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad"); Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad");
continue; continue;
@@ -541,7 +653,7 @@ public class JsonInjectors {
if (section == null) return null; if (section == null) return null;
var request = new Request.a() var request = new Request.a()
.b("https://api.vk.com/method/catalog.getAudio" .b("https://" + getApi() + "/method/catalog.getAudio"
+ "?v=5.119" + "?v=5.119"
+ "&https=1" + "&https=1"
+ "&need_blocks=1" + "&need_blocks=1"
@@ -565,7 +677,7 @@ public class JsonInjectors {
public static JSONObject fetchCatalogPodcast() { public static JSONObject fetchCatalogPodcast() {
var request = new Request.a() var request = new Request.a()
.b("https://api.vk.com/method/catalog.getPodcasts" .b("https://" + getApi() + "/method/catalog.getPodcasts"
+ "?v=5.119" + "?v=5.119"
+ "&https=1" + "&https=1"
+ "&need_blocks=1" + "&need_blocks=1"
@@ -585,8 +697,8 @@ public class JsonInjectors {
return null; return null;
} }
public static JSONObject friends(JSONObject json) throws JSONException { public static JSONObject friends(JSONObject json) throws JSONException, ParseException, IOException {
JSONObject catalog = json; JSONObject catalog = onlineHookProfiles(json);
boolean sectionexecute = true; boolean sectionexecute = true;
boolean hasBirthday = false; boolean hasBirthday = false;
@@ -1,9 +1,12 @@
package ru.vtosters.lite.hooks; package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.ui.dialogs.ServerDialog.sendRequest; import static ru.vtosters.lite.ui.dialogs.ServerDialog.sendRequest;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.removeWallpaper;
import static ru.vtosters.lite.utils.CacheUtils.getInstance; import static ru.vtosters.lite.utils.CacheUtils.getInstance;
import static ru.vtosters.lite.utils.DeletedMessagesHandler.reloadMessagesList; import static ru.vtosters.lite.utils.DeletedMessagesHandler.reloadMessagesList;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters;
import static ru.vtosters.lite.utils.Preferences.checkupdates; import static ru.vtosters.lite.utils.Preferences.checkupdates;
import static ru.vtosters.lite.utils.Preferences.preferences;
import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme; import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme;
import static ru.vtosters.lite.utils.ThemesUtils.setNeededTheme; import static ru.vtosters.lite.utils.ThemesUtils.setNeededTheme;
@@ -11,12 +14,15 @@ import android.app.Activity;
import android.os.Build; import android.os.Build;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import com.vk.core.concurrent.VkExecutors;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels; import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.ui.dialogs.DisableBattery; import ru.vtosters.lite.ui.dialogs.DisableBattery;
import ru.vtosters.lite.ui.dialogs.InstallGMS; import ru.vtosters.lite.ui.dialogs.InstallGMS;
import ru.vtosters.lite.ui.dialogs.OTADialog; import ru.vtosters.lite.ui.dialogs.OTADialog;
import ru.vtosters.lite.ui.dialogs.ServerDialog; import ru.vtosters.lite.ui.dialogs.ServerDialog;
import ru.vtosters.lite.ui.dialogs.Start; import ru.vtosters.lite.ui.dialogs.Start;
import ru.vtosters.lite.utils.DeletedMessagesHandler;
public class MainActivityInjector { public class MainActivityInjector {
@@ -25,7 +31,7 @@ public class MainActivityInjector {
ServerDialog.activity = activity; ServerDialog.activity = activity;
sendRequest(); sendRequest();
if (checkupdates()) OTADialog.checkUpdates(activity); if (checkupdates()) OTADialog.checkUpdates(activity);
reloadMessagesList(); VkExecutors.x.f().a(DeletedMessagesHandler::reloadMessagesList); // ioScheduler
Start.alert(activity); Start.alert(activity);
InstallGMS.alert(activity); InstallGMS.alert(activity);
DisableBattery.alert(activity); DisableBattery.alert(activity);
@@ -33,7 +39,18 @@ public class MainActivityInjector {
.edit() .edit()
.putBoolean("isdark", isDarkTheme()) .putBoolean("isdark", isDarkTheme())
.commit(); .commit();
getInstance().autoCleaningCache();
VkExecutors.x.q().a(() -> {
if (preferences.getString("clearcache", "").isEmpty()) {
preferences.edit().putString("clearcache", "100mb").apply();
} // temp shit fix
removeWallpaper(); // temp fix
getInstance().autoCleaningCache();
setupFilters();
}); // slowTasksScheduler
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannels.createChannels(); NotificationChannels.createChannels();
} }
@@ -12,11 +12,10 @@ import android.view.View;
import com.vk.api.internal.MethodCall; 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.ArrayList;
import java.util.regex.Pattern;
import ru.vtosters.lite.translators.BaseTranslator;
public class MessagesHook { public class MessagesHook {
public static String injectOwnText(String oldText) { public static String injectOwnText(String oldText) {
@@ -1,6 +1,7 @@
package ru.vtosters.lite.hooks; package ru.vtosters.lite.hooks;
import static java.lang.Long.MAX_VALUE; import static java.lang.Long.MAX_VALUE;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
@@ -22,14 +23,19 @@ import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.vkme; import static ru.vtosters.lite.utils.Preferences.vkme;
import com.vk.core.preference.Preference; import com.vk.core.preference.Preference;
import com.vtosters.lite.api.ExtendedCommunityProfile;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import ru.vtosters.lite.utils.AccountManagerUtils;
public class NewsfeedHook { public class NewsfeedHook {
public static boolean injectFilters(JSONObject obj) throws JSONException { public static boolean injectFilters(JSONObject obj) throws JSONException {
if (getBoolValue("newadblock", true)) return true; if (getBoolValue("newadblock", true)) return true;
@@ -85,7 +91,7 @@ public class NewsfeedHook {
params.add("photo"); params.add("photo");
params.add("photo_tag"); params.add("photo_tag");
if (!friendsrecomm()) { if (!friendsrecomm() && !getBoolValue("donotgetads", false)) {
params.add("friends_recomm"); params.add("friends_recomm");
} }
@@ -94,23 +100,65 @@ public class NewsfeedHook {
params.add("promo_button"); params.add("promo_button");
} }
if (!authorsrecomm()) { if (!authorsrecomm() && !getBoolValue("donotgetads", false)) {
params.add("authors_rec"); params.add("authors_rec");
} }
return params.toArray(new String[0]); return params.toArray(new String[0]);
} }
public static void adsParams(HashSet hashSet) { public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) {
if (ads() || adsslider()) { return getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) {
var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet<String>());
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_filters_groups", mutableAdsSet));
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 mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet<String>());
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_ad_groups", mutableAdsSet));
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_disabled");
return; if (getBoolValue("donotgetads", false)) {
return;
}
} }
hashSet.add("ads_app"); hashSet.add("ads_app");
hashSet.add("ads_site"); hashSet.add("ads_site");
hashSet.add("ads_post"); hashSet.add("ads_post");
hashSet.add("ads_app_slider"); if (!adsslider()) {
hashSet.add("ads_app_slider");
}
hashSet.add("ads_site_slider"); hashSet.add("ads_site_slider");
hashSet.add("ads_app_video"); hashSet.add("ads_app_video");
hashSet.add("ads_post_pretty_cards"); hashSet.add("ads_post_pretty_cards");
@@ -1,14 +1,17 @@
package ru.vtosters.lite.hooks; package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfo; 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.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.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getString; import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.dev; import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.getPrefsFromFile; import static ru.vtosters.lite.utils.Preferences.getPrefsFromFile;
import static ru.vtosters.lite.utils.ProxyUtils.getApi;
import android.util.Log;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@@ -17,6 +20,8 @@ import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import ru.vtosters.lite.utils.AndroidUtils;
public class OnlineFormatterHook { public class OnlineFormatterHook {
private static String AppName; private static String AppName;
@@ -59,37 +64,37 @@ public class OnlineFormatterHook {
case 5027722: case 5027722:
return "VK Messenger (Desktop)"; return "VK Messenger (Desktop)";
case 6146827: case 6146827:
return "VK Мессенджер (Android)"; return AndroidUtils.getString("vk_messenger") + " (Android)"; // VK Мессенджер (Android)
case 6482950: case 6482950:
return "VK Мессенджер (iPhone)"; return AndroidUtils.getString("vk_messenger") + " (iPhone)"; // VK Мессенджер (iPhone)
case 6481715: case 6481715:
return "VK Мессенджер Dev (iPhone)"; return AndroidUtils.getString("vk_messenger") + " Dev (iPhone)"; // VK Мессенджер Dev (iPhone)
case 7799655: case 7799655:
return "VK Почта"; return AndroidUtils.getString("vk_mail_online"); // VK Почта
case 7598572: case 7598572:
return "Сферум (Android)"; return AndroidUtils.getString("sferum_online") + " (Android)"; // Сферум (Android)
case 7571751: case 7571751:
return "Сферум (iPhone)"; return AndroidUtils.getString("sferum_online") + " (iPhone)"; // Сферум (iPhone)
case 7556576: case 7556576:
return "Сферум"; return AndroidUtils.getString("sferum_online"); // Сферум
case 7497650: case 7497650:
return "VK ID"; return "VK ID";
case 8094476: case 8094476:
return "VK Звонки (Android)"; return AndroidUtils.getString("vk_calls_online") + " (Android)"; // VK Звонки (Android)
case 8093730: case 8093730:
return "VK Звонки (iPhone)"; return AndroidUtils.getString("vk_calls_online") + " (iPhone)"; // VK Звонки (iPhone)
case 7793118: case 7793118:
return "VK Звонки (Desktop)"; return AndroidUtils.getString("vk_calls_online") + " (Desktop)"; // VK Звонки (Desktop)
case 6767438: case 6767438:
return "VK Музыка (Android)"; return AndroidUtils.getString("vk_music_online") + " (Android)"; // VK Музыка (Android)
case 8113297: case 8113297:
return "VK Клипы (Android)"; return AndroidUtils.getString("vk_clips_online") + " (Android)"; // VK Клипы (Android)
case 8106428: case 8106428:
return "VK Клипы (iPhone)"; return AndroidUtils.getString("vk_clips_online") + " (iPhone)"; // VK Клипы (iPhone)
case 5044491: case 5044491:
return "Candy"; return "Candy";
case 8114066: case 8114066:
return "VK Видео"; return AndroidUtils.getString("vk_video_online"); // VK Видео
case 4894723: case 4894723:
return "Phoenix Lite"; return "Phoenix Lite";
case 4994316: case 4994316:
@@ -165,14 +170,66 @@ public class OnlineFormatterHook {
return getString("custom_online") + " " + appname; return getString("custom_online") + " " + appname;
} }
public static JSONObject onlineHook(JSONObject json, boolean isGlobalHook) throws ParseException, IOException, JSONException { public static JSONObject onlineHook(JSONObject json) throws ParseException, IOException, JSONException {
if (!getBoolValue("onlinefix", false)) return json; 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; return json;
} }
} }
@@ -2,6 +2,7 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.ClipData; import android.content.ClipData;
@@ -15,10 +16,15 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import com.vk.core.dialogs.actionspopup.ActionsPopup; import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.core.drawable.RecoloredDrawable; import com.vk.core.drawable.RecoloredDrawable;
import com.vk.core.util.ToastUtils;
import com.vk.dto.common.AttachmentWithMedia; import com.vk.dto.common.AttachmentWithMedia;
import com.vk.dto.common.ImageSize;
import com.vtosters.lite.R; import com.vtosters.lite.R;
import com.vtosters.lite.attachments.DocumentAttachment;
import com.vtosters.lite.attachments.PhotoAttachment; import com.vtosters.lite.attachments.PhotoAttachment;
import org.json.JSONException; import org.json.JSONException;
@@ -26,6 +32,7 @@ import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.List;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@@ -36,18 +43,17 @@ import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils; import ru.vtosters.lite.utils.ThemesUtils;
public class PhotoViewer { public class PhotoViewer {
static OkHttpClient client = new OkHttpClient(); static OkHttpClient client = new OkHttpClient();
public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) { public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) {
if (item.getItemId() == AndroidUtils.getIdentifier("search_photo", "id")) { if (item.getItemId() == AndroidUtils.getIdentifier("search_photo", "id")) {
searchPhoto(getUrlFromAttachment((PhotoAttachment) attachment)); searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return true; return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("copy_photo_url", "id")) { } else if (item.getItemId() == AndroidUtils.getIdentifier("copy_photo_url", "id")) {
copyPhotoUrl(getUrlFromAttachment((PhotoAttachment) attachment)); copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return true; return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("open_original_photo", "id")) { } else if (item.getItemId() == AndroidUtils.getIdentifier("open_original_photo", "id")) {
openUrl(getUrlFromAttachment((PhotoAttachment) attachment)); openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
return true; return true;
} }
return true; return true;
@@ -61,7 +67,19 @@ public class PhotoViewer {
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()), : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()),
false, 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(getString("photo_get_error"));
}
else
ToastUtils.a(getString("photo_get_error"));
}
return null; return null;
} }
); );
@@ -71,7 +89,19 @@ public class PhotoViewer {
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE), : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE),
false, 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(getString("photo_get_error"));
}
else
ToastUtils.a(getString("photo_get_error"));
}
return null; return null;
} }
); );
@@ -82,14 +112,39 @@ public class PhotoViewer {
ThemesUtils.getAccentColor()), ThemesUtils.getAccentColor()),
false, 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(getString("photo_get_error"));
}
else
ToastUtils.a(getString("photo_get_error"));
}
return null; 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 != null ? imageSizes : null);
}
private static String getUrlFromPhotoAttachment(PhotoAttachment attachment) {
var imageSizes = attachment.D.Q.t1(); var imageSizes = attachment.D.Q.t1();
return getUrlFromImageSizeList(imageSizes);
}
@Nullable
private static String getUrlFromImageSizeList(List<ImageSize> imageSizes) {
if (imageSizes.isEmpty()) if (imageSizes.isEmpty())
return null; return null;
var max = imageSizes.get(0); var max = imageSizes.get(0);
@@ -47,6 +47,22 @@ public class PicRoundingHook{
} }
} }
public static void inject(Canvas canvas, Paint paint, float orig){
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(canvas.getClipBounds().exactCenterX(), canvas.getClipBounds().exactCenterY(), orig, paint);
}
}
public static void inject(Canvas canvas, float orig, float orig2, float orig3, Paint paint){
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(orig, orig2, orig3, paint);
}
}
public static void inject(Bitmap bitmap, Bitmap bitmap2, Paint b2) { public static void inject(Bitmap bitmap, Bitmap bitmap2, Paint b2) {
Shader.TileMode tileMode = Shader.TileMode.CLAMP; Shader.TileMode tileMode = Shader.TileMode.CLAMP;
b2.setShader(new BitmapShader(bitmap2, tileMode, tileMode)); b2.setShader(new BitmapShader(bitmap2, tileMode, tileMode));
@@ -1,11 +1,11 @@
package ru.vtosters.lite.hooks; 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.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit; 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.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.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle; import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -14,7 +14,6 @@ import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.View; import android.view.View;
import android.widget.RadioButton; import android.widget.RadioButton;
@@ -27,11 +26,12 @@ import com.vk.auth.ui.VkAuthTextView;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import ru.vtosters.lite.ui.fragments.ProxySettingsFragment; import ru.vtosters.lite.ui.fragments.ProxySettingsFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class ProxyHook { public class ProxyHook {
public static void hookAuth(View v) { public static void hookAuth(View v) {
VkAuthTextView button = (VkAuthTextView) v; VkAuthTextView button = (VkAuthTextView) v;
button.setText("Настроить прокси"); button.setText(AndroidUtils.getString("proxy_setup"));
button.setOnClickListener(v1 -> callProxyDialog(v1.getContext())); button.setOnClickListener(v1 -> callProxyDialog(v1.getContext()));
} }
@@ -40,44 +40,60 @@ public class ProxyHook {
RadioGroup rg = new RadioGroup(ctx); RadioGroup rg = new RadioGroup(ctx);
RadioButton rgDefault = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); 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(rgDefault);
rg.addView(rgProxy); rg.addView(rgZaborona);
rg.addView(rgVika);
rg.addView(rgRandomProxy);
rgDefault.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); 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); rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
rgDefault.setText("Отключить"); rgDefault.setText(AndroidUtils.getString("proxy_disable"));
rgDefault.setTextColor(getTextAttr()); rgDefault.setTextColor(getTextAttr());
rgProxy.setText("Включить (Zaborona)"); rgZaborona.setText(AndroidUtils.getString("proxy_enable") + " (Zaborona)");
rgProxy.setTextColor(getTextAttr()); rgZaborona.setTextColor(getTextAttr());
rgProxy.setChecked(isZaboronaEnabled()); rgRandomProxy.setText(AndroidUtils.getString("proxy_enable") + " (Random Proxy)");
rgDefault.setChecked(!isZaboronaEnabled()); rgRandomProxy.setTextColor(getTextAttr());
rgVika.setText(AndroidUtils.getString("proxy_enable") + " (Vika)");
rgVika.setTextColor(getTextAttr());
rgZaborona.setChecked(isZaboronaEnabled());
rgDefault.setChecked(!isZaboronaEnabled() && !isRandomProxyEnabled() && !isVikaProxyEnabled());
rgRandomProxy.setChecked(isRandomProxyEnabled());
rgVika.setChecked(isVikaProxyEnabled());
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle()); AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Прокси"); builder.setTitle(AndroidUtils.getString("vtlproxy"));
builder.setMessage("Zaborona никак не связана с ВТостерс и мы не можем гарантировать её работу и безопасность"); builder.setMessage(AndroidUtils.getString("proxy_warning"));
builder.setView(rg); builder.setView(rg);
builder.setPositiveButton("Применить", ((dialog, which) -> { builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), ((dialog, which) -> { // Применить
if (rgProxy.isChecked()) { if (rgZaborona.isChecked()) {
edit().putString("proxy", "zaborona").commit(); edit().putString("proxy", "zaborona").commit();
restartApplication(); restartApplication();
} else if (rgRandomProxy.isChecked()) {
edit().putString("proxy", "randomproxy").commit();
restartApplication();
} else if (rgVika.isChecked()) {
edit().putString("proxy", "vika").commit();
restartApplication();
} else { } else {
if (isZaboronaEnabled()) {
edit().putString("proxy", "noproxy").commit();
restartApplication();
}
edit().putString("proxy", "noproxy").commit(); edit().putString("proxy", "noproxy").commit();
restartApplication();
} }
})); }));
builder.setNeutralButton("Настройки прокси", ((dialog, which) -> { builder.setNeutralButton(AndroidUtils.getString("proxy_settings"), ((dialog, which) -> {
Intent a2 = new Navigator(ProxySettingsFragment.class).b(ctx); Intent a2 = new Navigator(ProxySettingsFragment.class).b(ctx);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(a2); ctx.startActivity(a2);
@@ -90,47 +106,4 @@ public class ProxyHook {
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor()); alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
alert.getButton(DialogInterface.BUTTON_NEUTRAL).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";
}
} }
@@ -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);
}
}
@@ -9,7 +9,7 @@ import java.util.LinkedHashMap;
public class RequestDumper{ public class RequestDumper{
public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap params, String apiver) { public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap params, String apiver) {
if (method.contains("execute.getGiftByStickerId") || method.contains("execute.getNewsfeedCustom")) { if (method.contains("execute.getGiftByStickerId") ) {
apiver = "5.187"; apiver = "5.187";
} }
@@ -41,7 +41,7 @@ public class FFMpeg {
private static void checkFFMpegLibs() { private static void checkFFMpegLibs() {
var lib = new File(AndroidUtils.getGlobalContext().getFilesDir(), "libffmpegkit_abidetect.so"); var lib = new File(AndroidUtils.getGlobalContext().getFilesDir(), "libffmpegkit_abidetect.so");
if (!lib.exists()) { if (!lib.exists()) {
ToastUtils.a("Копирование библиотеки ffmpegkit"); ToastUtils.a(AndroidUtils.getString("ffmpegkit_copy"));
copyAssets(); copyAssets();
} }
} }
@@ -1,11 +1,11 @@
package ru.vtosters.lite.music; package ru.vtosters.lite.music;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.Preferences.getMusicDir; import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import android.app.DownloadManager; import android.app.DownloadManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Environment;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
@@ -28,13 +28,13 @@ import ru.vtosters.lite.utils.AndroidUtils;
public class MP3Downloader { 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 String URL_FORMAT = "https://" + getApi() + "/method/audio.getById?v=5.131&access_token=%s&audios=%s&copyright=https://vtosters.app/";
private static final OkHttpClient client = new OkHttpClient(); private static final OkHttpClient client = new OkHttpClient();
public static void execute(MusicTrack track) { public static void execute(MusicTrack track) {
var token = AndroidUtils.getPreferences().getString("vk_admin_token", ""); var token = AndroidUtils.getPreferences().getString("vk_admin_token", "");
if (token.isEmpty()) { if (token.isEmpty()) {
Toast.makeText(AndroidUtils.getGlobalContext(), "Обновите токен VK Admin в настройках", Toast.LENGTH_SHORT).show(); Toast.makeText(AndroidUtils.getGlobalContext(), AndroidUtils.getString("update_vk_admin_token"), Toast.LENGTH_SHORT).show();
return; return;
} }
var request = new Request.a() var request = new Request.a()
@@ -24,6 +24,7 @@ import ru.vtosters.lite.net.NetCallback;
import ru.vtosters.lite.net.NetClient; import ru.vtosters.lite.net.NetClient;
import ru.vtosters.lite.net.NetRequest; import ru.vtosters.lite.net.NetRequest;
import ru.vtosters.lite.net.NetResponse; import ru.vtosters.lite.net.NetResponse;
import ru.vtosters.lite.utils.AndroidUtils;
public class Scrobbler { public class Scrobbler {
private static final String key = "5965d63402414776c54c266db0211746"; private static final String key = "5965d63402414776c54c266db0211746";
@@ -103,7 +104,7 @@ public class Scrobbler {
public static void auth(String login, String pass) { public static void auth(String login, String pass) {
if (login == null || pass == null) { if (login == null || pass == null) {
sendToast("Логин или пароль не заданы"); sendToast(AndroidUtils.getString("lastfm_credentials_empty"));
return; return;
} }
@@ -119,7 +120,7 @@ public class Scrobbler {
@Override @Override
public void onFailure(NetCall call, IOException e) { public void onFailure(NetCall call, IOException e) {
Log.d("Scrobbler", "Auth failed", e); Log.d("Scrobbler", "Auth failed", e);
sendToast("Ошибка входа"); sendToast(AndroidUtils.getString("lastfm_auth_error"));
} }
@Override @Override
@@ -155,7 +156,7 @@ public class Scrobbler {
edit().remove("username").apply(); edit().remove("username").apply();
edit().remove("sessionKey").apply(); edit().remove("sessionKey").apply();
scrobbled.clear(); scrobbled.clear();
sendToast("Вы успешно вышли из учетной записи"); sendToast(AndroidUtils.getString("lastfm_logout_success"));
} }
public static boolean needToBeScrobble(String uid) { public static boolean needToBeScrobble(String uid) {
@@ -0,0 +1,30 @@
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();
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")));
}
}
@@ -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,83 @@
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,75 @@
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";
}
}
@@ -0,0 +1,20 @@
package ru.vtosters.lite.proxy.api;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
public class VikaMobile{
public static String getApiHost(){
return isAlternativeHost() ? "vk-api-proxy.vikamobile.ru" : "vk-api-proxy.symbian.live";
}
public static String getOauthHost(){
return isAlternativeHost() ? "vk-oauth-proxy.vikamobile.ru" : "vk-oauth-proxy.symbian.live";
}
public static String getStaticHost(){
return isAlternativeHost() ? "vk-static-proxy.vikamobile.ru" : "vk-static-proxy.symbian.live";
}
public static Boolean isAlternativeHost(){
return getBoolValue("altervika", false);
}
}
@@ -0,0 +1,33 @@
package ru.vtosters.lite.proxy.http;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
public class CustomHttp{
public static void loadProxy(){
System.setProperty("http.proxyHost", proxyHostHTTP());
System.setProperty("http.proxyPort", proxyPortHTTP());
System.setProperty("http.proxyUser", proxyUserHTTP());
System.setProperty("http.proxyPassword", proxyPassHTTP());
forceProxyApplying();
}
private static String proxyHostHTTP(){
var string = getPrefsValue("proxyHostHTTP");
return string.isEmpty() ? "192.168.0.1" : string;
}
private static String proxyPortHTTP(){
var string = getPrefsValue("proxyPortHTTP");
return string.isEmpty() ? "8888" : string;
}
private static String proxyUserHTTP(){
var string = getPrefsValue("proxyUserHTTP");
return string.isEmpty() ? "" : string;
}
private static String proxyPassHTTP(){
var string = getPrefsValue("proxyPassHTTP");
return string.isEmpty() ? "" : string;
}
}
@@ -0,0 +1,48 @@
package ru.vtosters.lite.proxy.http;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class Jetkai{
private static final String TAG = "Jetkai_Http";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-http.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "http").putString("random_host", proxy).commit();
System.setProperty("http.proxyHost", proxy.split(":")[0]);
System.setProperty("http.proxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.proxy.http;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class TheSpeedX{
private static final String TAG = "TheSpeedX_Http";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "http").putString("random_host", proxy).commit();
System.setProperty("http.proxyHost", proxy.split(":")[0]);
System.setProperty("http.proxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,33 @@
package ru.vtosters.lite.proxy.https;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
public class CustomHttps{
public static void loadProxy(){
System.setProperty("https.proxyHost", proxyHostHTTPS());
System.setProperty("https.proxyPort", proxyPortHTTPS());
System.setProperty("https.proxyUser", proxyUserHTTPS());
System.setProperty("https.proxyPassword", proxyPassHTTPS());
forceProxyApplying();
}
private static String proxyHostHTTPS(){
var string = getPrefsValue("proxyHostHTTPS");
return string.isEmpty() ? "192.168.0.1" : string;
}
private static String proxyPortHTTPS(){
var string = getPrefsValue("proxyPortHTTPS");
return string.isEmpty() ? "8888" : string;
}
private static String proxyUserHTTPS(){
var string = getPrefsValue("proxyUserHTTPS");
return string.isEmpty() ? "" : string;
}
private static String proxyPassHTTPS(){
String string = getPrefsValue("proxyPassHTTPS");
return string.isEmpty() ? "" : string;
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.proxy.https;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class Jetkai{
private static final String TAG = "Jetkai_Https";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-https.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "https").putString("random_host", proxy).commit();
System.setProperty("https.proxyHost", proxy.split(":")[0]);
System.setProperty("https.proxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,48 @@
package ru.vtosters.lite.proxy.https;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class Roosterkid{
private static final String TAG = "Roosterkid_Https";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/roosterkid/openproxylist/main/HTTPS_RAW.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "https").putString("random_host", proxy).commit();
System.setProperty("https.proxyHost", proxy.split(":")[0]);
System.setProperty("https.proxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,21 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
public class CustomSocks{
public static void loadProxy(){
System.setProperty("socksProxyHost", proxyHostSocks());
System.setProperty("socksProxyPort", proxyPortSocks());
forceProxyApplying();
}
private static String proxyHostSocks(){
var string = getPrefsValue("proxyHostSocks");
return string.isEmpty() ? "192.168.0.1" : string;
}
private static String proxyPortSocks(){
var string = getPrefsValue("proxyPortSocks");
return string.isEmpty() ? "8888" : string;
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class Hookzof{
private static final String TAG = "Hookzof_Socks";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "socks").putString("random_host", proxy).commit();
System.setProperty("socksProxyHost", proxy.split(":")[0]);
System.setProperty("socksProxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class Jetkai{
private static final String TAG = "Jetkai_Socks";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-socks5.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "socks").putString("random_host", proxy).commit();
System.setProperty("socksProxyHost", proxy.split(":")[0]);
System.setProperty("socksProxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class Roosterkid{
private static final String TAG = "Roosterkid_Socks";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/roosterkid/openproxylist/main/SOCKS5_RAW.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "socks").putString("random_host", proxy).commit();
System.setProperty("socksProxyHost", proxy.split(":")[0]);
System.setProperty("socksProxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,47 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class TheSpeedX{
private static final String TAG = "TheSpeedX_Socks";
public static void loadProxy() throws IOException{
ArrayList<String> proxyList = getProxy("https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks5.txt", TAG);
if (proxyList == null) {
Log.d(TAG, "No proxy found");
return;
}
String proxy = proxyList.get(new java.util.Random().nextInt(proxyList.size()));
if (!hasProxy(proxy)) {
Log.d(TAG, "No proxy port found");
return;
}
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
edit().putString("random_type", "socks").putString("random_host", proxy).commit();
System.setProperty("socksProxyHost", proxy.split(":")[0]);
System.setProperty("socksProxyPort", proxy.split(":")[1]);
forceProxyApplying();
}
}
@@ -0,0 +1,10 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
public class Zaborona{
public static void loadProxy(){
System.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
System.setProperty("socksProxyPort", "1488");
forceProxyApplying();
}
}
@@ -22,6 +22,8 @@ import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import ru.vtosters.lite.utils.AndroidUtils;
public class LogWriterService extends Service { public class LogWriterService extends Service {
public LogWriterService() { public LogWriterService() {
} }
@@ -44,12 +46,12 @@ public class LogWriterService extends Service {
writeLog(intent, file); writeLog(intent, file);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
makeText(getGlobalContext(), "Не удалось сохранить лог-файл", LENGTH_SHORT).show(); makeText(getGlobalContext(), AndroidUtils.getString("logfile_error"), LENGTH_SHORT).show();
} }
var notificationId = intent.getIntExtra("notificationId", 1); var notificationId = intent.getIntExtra("notificationId", 1);
var manager = (NotificationManager) getGlobalContext().getSystemService(Context.NOTIFICATION_SERVICE); var manager = (NotificationManager) getGlobalContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notificationId); manager.cancel(notificationId);
makeText(getGlobalContext(), "Лог-файл был сохранен", LENGTH_SHORT).show(); makeText(getGlobalContext(), AndroidUtils.getString("logfile_saved"), LENGTH_SHORT).show();
stopSelf(); stopSelf();
return START_NOT_STICKY; return START_NOT_STICKY;
@@ -11,6 +11,8 @@ import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import ru.vtosters.lite.utils.AndroidUtils;
public class APKInstallActivity extends AppCompatActivity { public class APKInstallActivity extends AppCompatActivity {
public static final int REQUEST_INSTALL_PERMISSION = 1; public static final int REQUEST_INSTALL_PERMISSION = 1;
@@ -65,7 +67,7 @@ public class APKInstallActivity extends AppCompatActivity {
startActivity(intent); startActivity(intent);
} catch (Exception e) { } catch (Exception e) {
Toast.makeText(this, "Ошибка установки обновления " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); Toast.makeText(this, AndroidUtils.getString("apk_install_error") + " " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
} }
finish(); finish();
@@ -1,5 +1,7 @@
package ru.vtosters.lite.ui.activities; package ru.vtosters.lite.ui.activities;
import static ru.vtosters.lite.proxy.ProxyUtils.getOauth;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
@@ -20,7 +22,7 @@ import ru.vtosters.lite.utils.LayoutUtils;
public class VKAdminTokenActivity extends AppCompatActivity { public class VKAdminTokenActivity extends AppCompatActivity {
private static final String URL = "https://oauth.vk.com/authorize?client_id=6121396&scope=1073737727&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1"; private static final String URL = "https://" + getOauth() +"/authorize?client_id=6121396&scope=1073737727&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1";
@Override @Override
protected void onCreate(@Nullable Bundle bundle) { protected void onCreate(@Nullable Bundle bundle) {
@@ -37,7 +39,7 @@ public class VKAdminTokenActivity extends AppCompatActivity {
@Override @Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
var url = request.getUrl().toString(); var url = request.getUrl().toString();
if (url.startsWith("https://oauth.vk.com/auth_redirect?")) { if (url.startsWith("https://" + getOauth() + "/auth_redirect?")) {
var redirectUri = Uri.parse(URLDecoder.decode(url)); var redirectUri = Uri.parse(URLDecoder.decode(url));
var authorizeUrl = redirectUri.getQueryParameter("authorize_url"); var authorizeUrl = redirectUri.getQueryParameter("authorize_url");
var accessToken = authorizeUrl.substring(authorizeUrl.indexOf("=") + 1, authorizeUrl.indexOf("&")); var accessToken = authorizeUrl.substring(authorizeUrl.indexOf("=") + 1, authorizeUrl.indexOf("&"));
@@ -34,10 +34,10 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
public static final int SELECTED_STATE = -0x1; public static final int SELECTED_STATE = -0x1;
public static final int DISABLED_STATE = -0x2; public static final int DISABLED_STATE = -0x2;
private List mSelectedItems; private final List mSelectedItems;
private List mDisabledItems; private final List mDisabledItems;
private List mUnmovedItems; private final List mUnmovedItems;
private IViewHolderBinder mBinder; private final IViewHolderBinder mBinder;
private int mMinSelectedItems = -1; private int mMinSelectedItems = -1;
private int mMaxSelectedItems = -1; private int mMaxSelectedItems = -1;
@@ -25,7 +25,7 @@ import ru.vtosters.lite.utils.LayoutUtils;
public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.ImagineArrayAdapterItem> { public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.ImagineArrayAdapterItem> {
private List<ImagineArrayAdapterItem> mItems = new ArrayList<>(); private List<ImagineArrayAdapterItem> mItems = new ArrayList<>();
private OnClickListener mListener; private final OnClickListener mListener;
private int mSelectedIndex = -1; private int mSelectedIndex = -1;
public ImagineArrayAdapter(@NonNull Context context, OnClickListener listener) { public ImagineArrayAdapter(@NonNull Context context, OnClickListener listener) {
@@ -134,8 +134,8 @@ public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.Imagin
} }
public static class ImagineArrayAdapterItem { public static class ImagineArrayAdapterItem {
private Drawable mIcon; private final Drawable mIcon;
private String mText; private final String mText;
public ImagineArrayAdapterItem(Drawable icon, String text) { public ImagineArrayAdapterItem(Drawable icon, String text) {
this.mIcon = icon; this.mIcon = icon;
@@ -167,6 +167,6 @@ public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.Imagin
} }
public interface OnClickListener { public interface OnClickListener {
public void onClick(int i); void onClick(int i);
} }
} }
@@ -20,13 +20,10 @@ import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class MessagesPreviewAdapter extends RecyclerView.Adapter<MessagesPreviewAdapter.MessagePreviewViewHolder> { public class MessagesPreviewAdapter extends RecyclerView.Adapter<MessagesPreviewAdapter.MessagePreviewViewHolder> {
private static final int ME = 0x0; private static final int ME = 0x0;
private static final int ANONYMOUS = -0x1; private static final int ANONYMOUS = -0x1;
private final String[] mMessages = { private final String[] mMessages = AndroidUtils.getArray("wallpaper_change_dialog");
"Доброе время", "Доброе утро, день, вечер. ночь", "Как живёшь?", "Не мёртвый, и то хорошо"
};
@Override @Override
public int getItemViewType(int i) { public int getItemViewType(int i) {
@@ -7,6 +7,7 @@ import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import static ru.vtosters.lite.utils.ThemesUtils.recolorDrawable; import static ru.vtosters.lite.utils.ThemesUtils.recolorDrawable;
import android.annotation.SuppressLint;
import android.net.Uri; import android.net.Uri;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -28,8 +29,9 @@ import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.StickerPackViewHolder> { public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.StickerPackViewHolder> {
private static TelegramStickersService sService = TelegramStickersService.getInstance(getGlobalContext()); private static final TelegramStickersService sService = TelegramStickersService.getInstance(getGlobalContext());
@SuppressLint("UseCompatLoadingForDrawables")
@NonNull @NonNull
@Override @Override
public StickerPackViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public StickerPackViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -61,13 +63,13 @@ public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.
} }
public class StickerPackViewHolder extends RecyclerView.ViewHolder { public class StickerPackViewHolder extends RecyclerView.ViewHolder {
private LinearLayout mContainer; private final LinearLayout mContainer;
private ImageView mStickerPreview; private final ImageView mStickerPreview;
private ImageView mUpdateButton; private final ImageView mUpdateButton;
private ImageView mDeleteButton; private final ImageView mDeleteButton;
private TextView mName; private final TextView mName;
private TextView mStickersCount; private final TextView mStickersCount;
private SwitchCompat mSwitch; private final SwitchCompat mSwitch;
public StickerPackViewHolder(@NonNull View view) { public StickerPackViewHolder(@NonNull View view) {
@@ -82,6 +84,7 @@ public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.
mStickersCount = view.findViewWithTag("vkim_cancel_label_text"); mStickersCount = view.findViewWithTag("vkim_cancel_label_text");
} }
@SuppressLint("SetTextI18n")
public void bind(int position) { public void bind(int position) {
final TelegramStickersPack pack = sService.getPacksListReference().get(position); final TelegramStickersPack pack = sService.getPacksListReference().get(position);
if (pack.state != TelegramStickersPack.DOWNLOADED) return; if (pack.state != TelegramStickersPack.DOWNLOADED) return;
@@ -23,6 +23,7 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils; import ru.vtosters.lite.utils.IOUtils;
import ru.vtosters.lite.utils.Preferences; import ru.vtosters.lite.utils.Preferences;
@@ -42,7 +43,7 @@ public class BackupManager {
public static void backupOnlines() throws IOException { public static void backupOnlines() throws IOException {
if (getPrefContent("onlines.xml") == null) { if (getPrefContent("onlines.xml") == null) {
Toast.makeText(getGlobalContext(), "Нет данных для резервного копирования", LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString("no_data_to_backup"), LENGTH_SHORT).show();
return; return;
} }
@@ -54,10 +55,10 @@ public class BackupManager {
FileWriter out = new FileWriter(file); FileWriter out = new FileWriter(file);
out.write(getPrefContent("onlines.xml")); out.write(getPrefContent("onlines.xml"));
out.close(); out.close();
Toast.makeText(getGlobalContext(), "Сохранено в файл " + file.getAbsolutePath(), LENGTH_LONG).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_saved_in") + " " + file.getAbsolutePath(), LENGTH_LONG).show();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(getGlobalContext(), "Не удалось сохранить файл", LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_save_error"), LENGTH_SHORT).show();
} }
} }
@@ -70,10 +71,10 @@ public class BackupManager {
FileWriter out = new FileWriter(file); FileWriter out = new FileWriter(file);
out.write(getPrefContent("com.vtosters.lite_preferences.xml")); out.write(getPrefContent("com.vtosters.lite_preferences.xml"));
out.close(); out.close();
Toast.makeText(getGlobalContext(), "Сохранено в файл " + file.getAbsolutePath(), LENGTH_LONG).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_saved_in") + " " + file.getAbsolutePath(), LENGTH_LONG).show();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(getGlobalContext(), "Не удалось сохранить файл", LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_save_error"), LENGTH_SHORT).show();
} }
} }
@@ -5,6 +5,7 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString; import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel; import android.app.NotificationChannel;
@@ -57,6 +58,7 @@ public class CrashReporter {
var saveLogIntent = new Intent(getGlobalContext(), LogWriterService.class); var saveLogIntent = new Intent(getGlobalContext(), LogWriterService.class);
saveLogIntent.putExtra("log", logString); saveLogIntent.putExtra("log", logString);
saveLogIntent.putExtra("notificationId", 1); saveLogIntent.putExtra("notificationId", 1);
@SuppressLint("UnspecifiedImmutableFlag")
var psaveLogIntent = PendingIntent.getService(getGlobalContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT); var psaveLogIntent = PendingIntent.getService(getGlobalContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT);
var builder = new Notification.Builder(getGlobalContext()); var builder = new Notification.Builder(getGlobalContext());
@@ -65,12 +67,8 @@ public class CrashReporter {
builder.setContentText(logString); builder.setContentText(logString);
builder.setStyle(new Notification.BigTextStyle().bigText(logString)); builder.setStyle(new Notification.BigTextStyle().bigText(logString));
builder.setAutoCancel(true); builder.setAutoCancel(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { builder.addAction(new Notification.Action(0, getString("vtl_crash_upload"), PendingIntent.getActivity(getGlobalContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT)));
builder.addAction(new Notification.Action(0, getString("vtl_crash_upload"), PendingIntent.getActivity(getGlobalContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT))); builder.addAction(new Notification.Action(0, getString("vtl_crash_save"), psaveLogIntent));
builder.addAction(new Notification.Action(0, getString("vtl_crash_save"), psaveLogIntent));
} else {
builder.setContentIntent(PendingIntent.getActivity(activity, 0, foxbinIntent, PendingIntent.FLAG_ONE_SHOT));
}
if (Build.VERSION.SDK_INT >= 26) { if (Build.VERSION.SDK_INT >= 26) {
builder.setChannelId("crashes"); builder.setChannelId("crashes");
@@ -10,6 +10,8 @@ import static ru.vtosters.lite.utils.Preferences.videonewcatalog;
import static ru.vtosters.lite.utils.Preferences.vkme; import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.Preferences.vkme_notifs; import static ru.vtosters.lite.utils.Preferences.vkme_notifs;
import android.os.Build;
import com.vk.apps.AppsFragment; import com.vk.apps.AppsFragment;
import com.vk.discover.ThemedFeedFragment; import com.vk.discover.ThemedFeedFragment;
import com.vk.fave.fragments.FaveTabFragment; import com.vk.fave.fragments.FaveTabFragment;
@@ -47,7 +49,6 @@ import ru.vtosters.lite.ui.items.DockBarTab;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class DockBarEditorManager { public class DockBarEditorManager {
public static final int MIN_SELECTED_TABS = 3; public static final int MIN_SELECTED_TABS = 3;
public static final int MAX_SELECTED_TABS = 9; public static final int MAX_SELECTED_TABS = 9;
@@ -96,19 +97,31 @@ public class DockBarEditorManager {
private void parseSelectedTabs(String[] selectedTabsTags) { private void parseSelectedTabs(String[] selectedTabsTags) {
List<String> allTags = new ArrayList<>(Arrays.asList("tab_news", "tab_superapps", "tab_messages", "tab_feedback", "tab_profile", List<String> allTags = new ArrayList<>(Arrays.asList("tab_news", "tab_superapps", "tab_messages", "tab_feedback", "tab_profile",
"tab_friends", "tab_groups", "tab_photos", "tab_audios", "tab_videos", "tab_lives", "tab_games", "tab_liked", "tab_friends", "tab_groups", "tab_photos", "tab_audios", "tab_videos", "tab_lives", "tab_games", "tab_liked",
"tab_fave", "tab_documents", "tab_payments", "tab_vk_apps", "tab_settings", "tab_menu")); "tab_fave", "tab_documents", "tab_payments", "tab_vk_apps", "tab_settings"));
for (String tag : selectedTabsTags) { for (String tag : selectedTabsTags) {
mSelectedTabs.add(getTabByTag(tag)); mSelectedTabs.add(getTabByTag(tag));
allTags.remove(tag); allTags.remove(tag);
} }
allTags.forEach(tag -> mDisabledTabs.add(getTabByTag(tag)));
for (String tag : allTags) {
mDisabledTabs.add(getTabByTag(tag));
}
} }
public void save() { public void save() {
AndroidUtils.getPreferences().edit().putString("dockbar_tabs", mSelectedTabs.stream() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
.map(tab -> tab.tag) getPreferences().edit().putString("dockbar_tabs", mSelectedTabs.stream()
.collect(Collectors.joining(","))) .map(tab -> tab.tag)
.commit(); .collect(Collectors.joining(",")))
.commit();
} else {
StringBuilder sb = new StringBuilder();
for (DockBarTab tab : mSelectedTabs) {
sb.append(tab.tag).append(",");
}
getPreferences().edit().putString("dockbar_tabs", sb.toString()).commit();
}
} }
public void reset() { public void reset() {
@@ -247,13 +260,6 @@ public class DockBarEditorManager {
R.string.menu_apps, R.string.menu_apps,
R.id.menu_vk_apps, R.id.menu_vk_apps,
AppsFragment.class); AppsFragment.class);
case "tab_menu":
return DockBarTab.valuesOf(
"tab_menu",
milkshake() ? R.drawable.ic_user_circle_outline_28 : R.drawable.ic_menu_more_outline_28,
milkshake() ? R.string.profile : R.string.menu,
R.id.tab_menu,
milkshake() ? ProfileFragment.class : MenuFragment.class);
case "tab_settings": case "tab_settings":
default: default:
return DockBarTab.valuesOf( return DockBarTab.valuesOf(
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.components; package ru.vtosters.lite.ui.components;
public interface IItemMovingListener { public interface IItemMovingListener {
void onItemDismiss(int index); void onItemDismiss(int index);
boolean onItemMove(int fromPosition, int toPosition); boolean onItemMove(int fromPosition, int toPosition);
@@ -0,0 +1,62 @@
package ru.vtosters.lite.ui.components;
import static ru.vtosters.lite.ui.vkui.VBListBuilder.VBListItem;
import static ru.vtosters.lite.ui.vkui.VBListBuilder.buildListOf;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.app.Activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import ru.vtosters.lite.ui.vkui.VBottomSheetBuilder;
import ru.vtosters.lite.utils.AndroidUtils;
public class NewsfeedListManager {
public static void callEditorPopup(Activity activity) {
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", Collections.synchronizedSet(new LinkedHashSet<>()));
var list = new ArrayList<VBListItem>();
if (filtersSet.size() == 0) {
sendToast(AndroidUtils.getString("newsfeed_list_update_feed"));
return;
}
synchronized (filtersSet) {
for (String item : filtersSet) {
var id = item.substring(0, item.indexOf("|"));
var title = item.substring(item.indexOf("|") + 1);
list.add(new VBListItem(id, title, selectedItems.contains(id)));
}
}
VBottomSheetBuilder.show(activity, new VBottomSheetBuilder.VBSContent(
AndroidUtils.getString("newsfeed_list_choose_to_hide"),
buildListOf(activity, list),
new VBottomSheetBuilder.VBSContent.VBSButton(
AndroidUtils.getString("save"),
() -> {
var newSelectedItems = "";
for (VBListItem item : list)
if (item.checked)
newSelectedItems += item.id + ",";
getDefaultPrefs().edit()
.putString("news_feed_selected_items", newSelectedItems)
.apply();
sendToast(AndroidUtils.getString("newsfeed_list_update_feed_to_work"));
}
)
));
}
public static void resetHideItems() {
getDefaultPrefs().edit().remove("news_feed_selected_items").remove("news_feed_items_set")
.apply();
sendToast(AndroidUtils.getString("newsfeed_list_hidden_reseted"));
}
}
@@ -2,6 +2,8 @@ package ru.vtosters.lite.ui.components;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import android.os.Build;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -40,15 +42,30 @@ public class SuperAppEditorManager {
mSelectedItems.add(getItemByTag(tag)); mSelectedItems.add(getItemByTag(tag));
allTags.remove(tag); allTags.remove(tag);
} }
allTags.forEach(tag -> mDisabledItems.add(getItemByTag(tag))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
allTags.forEach(tag -> mDisabledItems.add(getItemByTag(tag)));
} else {
for (String tag : allTags) {
mDisabledItems.add(getItemByTag(tag));
}
}
} }
public void save() { public void save() {
if (mSelectedItems.size() > 0) if (mSelectedItems.size() > 0)
getPreferences().edit().putString("superapp_items", mSelectedItems.stream() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
.map(item -> item.type) getPreferences().edit().putString("superapp_items", mSelectedItems.stream()
.collect(Collectors.joining(","))) .map(item -> item.type)
.commit(); .collect(Collectors.joining(",")))
.commit();
} else {
StringBuilder sb = new StringBuilder();
for (SuperAppItem item : mSelectedItems) {
sb.append(item.type);
sb.append(",");
}
getPreferences().edit().putString("superapp_items", sb.toString()).commit();
}
else else
reset(); reset();
} }
@@ -71,33 +88,33 @@ public class SuperAppEditorManager {
private SuperAppItem getItemByTag(String tag) { private SuperAppItem getItemByTag(String tag) {
switch (tag) { switch (tag) {
case "menu": case "menu":
return SuperAppItem.valuesOf("menu", "Меню приложения"); return SuperAppItem.valuesOf("menu", AndroidUtils.getString("superapp_menu"));
case "miniapps": case "miniapps":
return SuperAppItem.valuesOf("miniapps", "Mini Apps: виджет"); return SuperAppItem.valuesOf("miniapps", AndroidUtils.getString("superapp_miniapps"));
case "vkpay_slim": case "vkpay_slim":
return SuperAppItem.valuesOf("vkpay_slim", "VK Pay"); return SuperAppItem.valuesOf("vkpay_slim", AndroidUtils.getString("superapp_vkpay"));
case "greeting": case "greeting":
return SuperAppItem.valuesOf("greeting", "Приветствие"); return SuperAppItem.valuesOf("greeting", AndroidUtils.getString("superapp_greeting"));
case "promo": case "promo":
return SuperAppItem.valuesOf("promo", "Mini Apps: промо"); return SuperAppItem.valuesOf("promo", AndroidUtils.getString("superapp_miniapps_promo"));
case "holiday": case "holiday":
return SuperAppItem.valuesOf("holiday", "Дни рождения у друзей"); return SuperAppItem.valuesOf("holiday", AndroidUtils.getString("superapp_holiday"));
case "weather": case "weather":
return SuperAppItem.valuesOf("weather", "Погода"); return SuperAppItem.valuesOf("weather", AndroidUtils.getString("superapp_weather"));
case "sport": case "sport":
return SuperAppItem.valuesOf("sport", "Спортивные события"); return SuperAppItem.valuesOf("sport", AndroidUtils.getString("superapp_sport"));
case "games": case "games":
return SuperAppItem.valuesOf("games", "Игры"); return SuperAppItem.valuesOf("games", AndroidUtils.getString("superapp_games"));
case "informer": case "informer":
return SuperAppItem.valuesOf("informer", "Информер"); return SuperAppItem.valuesOf("informer", AndroidUtils.getString("superapp_informer"));
case "food": case "food":
return SuperAppItem.valuesOf("food", "Еда"); return SuperAppItem.valuesOf("food", AndroidUtils.getString("superapp_food"));
case "event": case "event":
return SuperAppItem.valuesOf("event", "Мероприятия"); return SuperAppItem.valuesOf("event", AndroidUtils.getString("superapp_event"));
case "music": case "music":
return SuperAppItem.valuesOf("music", "Музыка"); return SuperAppItem.valuesOf("music", AndroidUtils.getString("superapp_music"));
case "vk_run": case "vk_run":
return SuperAppItem.valuesOf("vk_run", "VK Run"); return SuperAppItem.valuesOf("vk_run", AndroidUtils.getString("superapp_vk_run"));
default: default:
return null; return null;
} }
@@ -19,7 +19,7 @@ public class InstallGMS {
public static void alert(final Activity activity) { public static void alert(final Activity activity) {
if (!isGmsInstalled()) { if (!isGmsInstalled()) {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(getString("debug_warning")); builder.setTitle(getString("warning"));
builder.setMessage(getString("gmsissuesumm")); builder.setMessage(getString("gmsissuesumm"));
builder.setCancelable(false); builder.setCancelable(false);
builder.setPositiveButton(getString("gmsissuebtn1"), (dialogInterface, i) -> edit().putBoolean("showAlertGms", false).apply()); builder.setPositiveButton(getString("gmsissuebtn1"), (dialogInterface, i) -> edit().putBoolean("showAlertGms", false).apply());
@@ -15,6 +15,7 @@ import androidx.appcompat.widget.SwitchCompat;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils; import ru.vtosters.lite.utils.LayoutUtils;
public class MessageSettings { public class MessageSettings {
@@ -50,12 +51,12 @@ public class MessageSettings {
four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
zero.setText("Отключить"); zero.setText(AndroidUtils.getString("proxy_disable")); // Отключить
one.setText("15 секунд"); one.setText(AndroidUtils.getString("message_self_destruct_15sec"));
two.setText("1 минута"); two.setText(AndroidUtils.getString("message_self_destruct_1min"));
three.setText("5 минут"); three.setText(AndroidUtils.getString("message_self_destruct_5min"));
four.setText("1 час"); four.setText(AndroidUtils.getString("message_self_destruct_1hour"));
five.setText("24 часа"); five.setText(AndroidUtils.getString("message_self_destruct_24hours"));
zero.setTextColor(getTextAttr()); zero.setTextColor(getTextAttr());
one.setTextColor(getTextAttr()); one.setTextColor(getTextAttr());
@@ -87,7 +88,7 @@ public class MessageSettings {
@SuppressLint("UseSwitchCompatOrMaterialCode") @SuppressLint("UseSwitchCompatOrMaterialCode")
var silentSwitch = new SwitchCompat(new ContextThemeWrapper(context, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_Switch)); var silentSwitch = new SwitchCompat(new ContextThemeWrapper(context, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_Switch));
silentSwitch.setText("Бесшумные сообщения"); silentSwitch.setText(AndroidUtils.getString("silent_messages"));
silentSwitch.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); silentSwitch.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
silentSwitch.setTextColor(getTextAttr()); silentSwitch.setTextColor(getTextAttr());
silentSwitch.setChecked(isSilentEnabled); silentSwitch.setChecked(isSilentEnabled);
@@ -104,12 +105,12 @@ public class MessageSettings {
mContainer.addView(silentSwitch, LayoutUtils.createLinear(-1, -2)); mContainer.addView(silentSwitch, LayoutUtils.createLinear(-1, -2));
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
builder.setTitle("Настройки отправки"); builder.setTitle(AndroidUtils.getString("message_send_settings_title"));
builder.setMessage("Выберите время исчезновения сообщения"); builder.setMessage(AndroidUtils.getString("silent_messages_time_select"));
builder.setCancelable(true); builder.setCancelable(true);
builder.setNegativeButton("Отмена", null); builder.setNegativeButton(AndroidUtils.getString("cancel"), null);
builder.setView(mContainer); builder.setView(mContainer);
builder.setPositiveButton("Применить", (dialog, which) -> { builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), (dialog, which) -> { // Применить
var checked = rg.getCheckedRadioButtonId(); var checked = rg.getCheckedRadioButtonId();
if (checked == zero.getId()) { if (checked == zero.getId()) {
@@ -9,7 +9,6 @@ import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper;
import ru.vtosters.lite.utils.OTAUtils; import ru.vtosters.lite.utils.OTAUtils;
public class OTADialog implements OTAUtils.OTAListener { public class OTADialog implements OTAUtils.OTAListener {
private final Activity mActivity; private final Activity mActivity;
private final OTAUtils mHelper; private final OTAUtils mHelper;
@@ -21,8 +20,8 @@ public class OTADialog implements OTAUtils.OTAListener {
mHelper.loadData(); mHelper.loadData();
} }
public static OTADialog checkUpdates(Activity activity) { public static void checkUpdates(Activity activity) {
return new OTADialog(activity); new OTADialog(activity);
} }
@Override @Override
@@ -8,9 +8,9 @@ import android.content.Context;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.SeekBar; import android.widget.SeekBar;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils; import ru.vtosters.lite.utils.LayoutUtils;
public class RoundingSeekbarDialog{ public class RoundingSeekbarDialog{
@@ -25,12 +25,12 @@ public class RoundingSeekbarDialog{
mContainer.addView(seek, LayoutUtils.createLinear(-1, -2)); mContainer.addView(seek, LayoutUtils.createLinear(-1, -2));
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
builder.setTitle("Выберите размер закругления углов"); builder.setTitle(AndroidUtils.getString("pic_rounding_title"));
builder.setMessage("Для отключения функции закругления углов введите 0"); builder.setMessage(AndroidUtils.getString("pic_rounding_info"));
builder.setCancelable(true); builder.setCancelable(true);
builder.setNegativeButton("Отмена", null); builder.setNegativeButton(AndroidUtils.getString("cancel"), null);
builder.setView(mContainer); builder.setView(mContainer);
builder.setPositiveButton("Применить", (dialog, which) -> { builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), (dialog, which) -> {
edit().putInt("pic_rounding", seek.getProgress()).commit(); edit().putInt("pic_rounding", seek.getProgress()).commit();
restartApplicationWithTimer(); restartApplicationWithTimer();
}); });
@@ -77,8 +77,6 @@ public class ServerDialog {
private static void getResponse(String body) throws Exception { private static void getResponse(String body) throws Exception {
JSONObject jSONObject = new JSONObject(body); JSONObject jSONObject = new JSONObject(body);
Log.d("VTLOG", "getResponse: " + jSONObject);
if (jSONObject.getString("title").equals("")) { if (jSONObject.getString("title").equals("")) {
showAlert = false; showAlert = false;
return; return;
@@ -19,7 +19,7 @@ public class Start {
activity.requestPermissions(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 228); activity.requestPermissions(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 228);
} }
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(getString("debug_warning")); builder.setTitle(getString("warning"));
builder.setMessage(getWelcome()); builder.setMessage(getWelcome());
builder.setCancelable(false); builder.setCancelable(false);
// android.content.DialogInterface.OnClickListener // android.content.DialogInterface.OnClickListener
@@ -10,6 +10,7 @@ import android.util.Log;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.translators.BaseTranslator; import ru.vtosters.lite.translators.BaseTranslator;
import ru.vtosters.lite.utils.AndroidUtils;
public class Translate { public class Translate {
public static void showTranslatedText(Context context, String text) { public static void showTranslatedText(Context context, String text) {
@@ -27,16 +28,16 @@ public class Translate {
private static void showDialog(Context context, String text) { private static void showDialog(Context context, String text) {
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(context); VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(context);
alertDialog.setTitle("Переводчик"); alertDialog.setTitle(AndroidUtils.getString("translator_title"));
alertDialog.setMessage(text); alertDialog.setMessage(text);
alertDialog.setPositiveButton("Закрыть", (dialog, which) -> { alertDialog.setPositiveButton(AndroidUtils.getString("close"), (dialog, which) -> {
dialog.cancel(); dialog.cancel();
}); });
alertDialog.setNeutralButton("Скопировать", (dialog, which) -> { alertDialog.setNeutralButton(AndroidUtils.getString("copy"), (dialog, which) -> {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
sendToast("Скопировано в буфер обмена"); sendToast(AndroidUtils.getString("copied_to_clipboard"));
}); });
var alert = alertDialog.create(); var alert = alertDialog.create();
alert.show(); alert.show();
@@ -1,5 +1,7 @@
package ru.vtosters.lite.ui.dialogs; package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString; import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
@@ -15,7 +17,7 @@ import ru.vtosters.lite.ui.fragments.VKUIwrapper;
public class VKIDProtection { public class VKIDProtection {
public static void alert(final Activity activity) { public static void alert(final Activity activity) {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(getString("debug_warning")); builder.setTitle(getString("warning"));
builder.setMessage(getString("vkidsumm")); builder.setMessage(getString("vkidsumm"));
builder.setCancelable(false); builder.setCancelable(false);
// android.content.DialogInterface.OnClickListener // android.content.DialogInterface.OnClickListener
@@ -23,7 +25,7 @@ public class VKIDProtection {
// android.content.DialogInterface.OnClickListener // android.content.DialogInterface.OnClickListener
builder.setNeutralButton(getString("vkiddisable"), (dialogInterface, i) -> { builder.setNeutralButton(getString("vkiddisable"), (dialogInterface, i) -> {
edit().putBoolean("showAlertVkId", false).apply(); edit().putBoolean("showAlertVkId", false).apply();
VKUIwrapper.setLink("https://id.vk.com/account"); VKUIwrapper.setLink((isAnyProxyEnabled() ? "https://id.vk.com/account" : "https://" + getApi() + "/_/id.vk.com/account"));
Intent a2 = new Navigator(VKUIwrapper.class).b(activity); Intent a2 = new Navigator(VKUIwrapper.class).b(activity);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(a2); activity.startActivity(a2);
@@ -83,7 +83,7 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
}); });
adapter.setMinAndMaxCounts(DockBarEditorManager.MIN_SELECTED_TABS, DockBarEditorManager.MAX_SELECTED_TABS); adapter.setMinAndMaxCounts(DockBarEditorManager.MIN_SELECTED_TABS, DockBarEditorManager.MAX_SELECTED_TABS);
var recyclerView = new RecyclerView(getContext()); var recyclerView = new RecyclerView(requireContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true); recyclerView.setHasFixedSize(true);
@@ -1,20 +1,27 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.copyright_post; import static ru.vtosters.lite.utils.Preferences.copyright_post;
import static ru.vtosters.lite.utils.Preferences.offline;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vk.newsfeed.NewsfeedSettingsFragment; import com.vk.newsfeed.NewsfeedSettingsFragment;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.components.NewsfeedListManager;
import ru.vtosters.lite.utils.AndroidUtils;
public class FeedFragment extends MaterialPreferenceToolbarFragment { public class FeedFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
@@ -30,6 +37,32 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
findPreference("spamfilters").setSummary(count(getPrefsValue("spamfilters"))); findPreference("spamfilters").setSummary(count(getPrefsValue("spamfilters")));
findPreference("sourcenamefilter").setSummary(count(getPrefsValue("sourcenamefilter"))); findPreference("sourcenamefilter").setSummary(count(getPrefsValue("sourcenamefilter")));
findPreference("linkfilter").setSummary(count(getPrefsValue("linkfilter"))); findPreference("linkfilter").setSummary(count(getPrefsValue("linkfilter")));
findPreference("whitelisted_ad_groups").setSummary(countSet("whitelisted_ad_groups"));
findPreference("whitelisted_filters_groups").setSummary(countSet("whitelisted_filters_groups"));
findPreference("whitelisted_ad_groups").setOnPreferenceClickListener(preference -> {
remdialog("whitelisted_ad_groups", getContext());
return true;
});
findPreference("whitelisted_filters_groups").setOnPreferenceClickListener(preference -> {
remdialog("whitelisted_filters_groups", getContext());
return true;
});
findPreference("newsfeedlistmanager").setOnPreferenceClickListener(preference -> {
NewsfeedListManager.callEditorPopup(getActivity());
return true;
});
var str = getDefaultPrefs().getString("news_feed_selected_items", "");
findPreference("newsfeedlistmanager").setSummary(
String.format(AndroidUtils.getString("feed_hidden"), (!TextUtils.isEmpty(str) ? str.split(",").length : 0))
);
findPreference("newsfeedlistmanager_reset").setOnPreferenceClickListener(preference -> {
NewsfeedListManager.resetHideItems();
return true;
});
} }
private String count(String text) { private String count(String text) {
@@ -37,12 +70,44 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
var count = text.split(", ").length; var count = text.split(", ").length;
if (count < 1 || text.isEmpty()) { if (count < 1 || text.isEmpty()) {
return "Нет добавленных элементов"; return AndroidUtils.getString("feed_no_elements");
} else { } else {
return "Добавлено " + count + " элементов"; return String.format(AndroidUtils.getString("feed_elements_count"), count);
} }
} }
private void remdialog(String key, Context context) {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
builder.setTitle(AndroidUtils.getString("warning"));
builder.setMessage(AndroidUtils.getString("delete_elements_confirm"));
builder.setCancelable(false);
builder.setPositiveButton(AndroidUtils.getString("yes"), (dialogInterface, i) -> {
edit().remove(key).apply();
sendToast(AndroidUtils.getString("elements_deleted_success"));
});
builder.setNegativeButton(AndroidUtils.getString("cancel"), (dialogInterface, i) -> dialogInterface.dismiss());
builder.show();
}
private String countSet(String key) {
var set = getDefaultPrefs().getStringSet(key, null);
StringBuilder str = new StringBuilder();
if (set != null) {
for (var s : set) {
str.append(s).append(", ");
}
}
var count = str.toString().split(", ").length;
if (count < 1 || (str.length() == 0)) {
return AndroidUtils.getString("feed_no_elements");
} else {
return String.format(AndroidUtils.getString("feed_elements_count"), count);
}
}
@Override @Override
public boolean onPreferenceTreeClick(Preference preference) { public boolean onPreferenceTreeClick(Preference preference) {
findPreference("cringecopyright").setEnabled(!copyright_post()); findPreference("cringecopyright").setEnabled(!copyright_post());
@@ -15,7 +15,6 @@ import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.hasVerification; import static ru.vtosters.lite.utils.Preferences.hasVerification;
import static ru.vtosters.lite.utils.Preferences.preferences; import static ru.vtosters.lite.utils.Preferences.preferences;
import static ru.vtosters.lite.utils.ProxyUtils.isZaboronaEnabled;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor; import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle; import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -37,9 +36,14 @@ import androidx.core.content.res.ResourcesCompat;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class IconsFragment extends MaterialPreferenceToolbarFragment { public class IconsFragment extends MaterialPreferenceToolbarFragment {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
public static void callSelectDialog(Context ctx, String appicon) { public static void callSelectDialog(Context ctx, String appicon) {
var defname = preferences.getString("appname", "vt");
var deficon = preferences.getString("selectedicon", "vt");
RadioGroup rg = new RadioGroup(ctx); RadioGroup rg = new RadioGroup(ctx);
RadioButton rgDefault = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton rgDefault = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
@@ -62,20 +66,17 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
rgVK.setText("VK"); rgVK.setText("VK");
rgVK.setTextColor(getTextAttr()); rgVK.setTextColor(getTextAttr());
rgVKontakte.setText("ВКонтакте"); rgVKontakte.setText(AndroidUtils.getString("app_name_alter"));
rgVKontakte.setTextColor(getTextAttr()); rgVKontakte.setTextColor(getTextAttr());
rgVKontakte.setChecked(isZaboronaEnabled()); rgVKontakte.setChecked(defname.contains("vkontakte"));
rgVK.setChecked(isZaboronaEnabled()); rgVK.setChecked(defname.contains("standard"));
rgDefault.setChecked(!isZaboronaEnabled()); rgDefault.setChecked(defname.contains("vt") || defname.isEmpty());
AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle()); AlertDialog.Builder builder = new AlertDialog.Builder(ctx, getAlertStyle());
builder.setTitle("Выберите название приложения"); builder.setTitle(AndroidUtils.getString("app_name_select_title"));
builder.setView(rg); builder.setView(rg);
builder.setPositiveButton("Применить", ((dialog, which) -> { builder.setPositiveButton(AndroidUtils.getString("vtl_confirm"), ((dialog, which) -> {
var defname = preferences.getString("appname", "vt");
var deficon = preferences.getString("selectedicon", "vt");
if (rgDefault.isChecked()) { if (rgDefault.isChecked()) {
edit().putString("appname", "vt").commit(); edit().putString("appname", "vt").commit();
edit().putString("selectedicon", appicon).commit(); edit().putString("selectedicon", appicon).commit();
@@ -93,7 +94,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
switchComponent(appicon, "vkontakte", deficon, defname); switchComponent(appicon, "vkontakte", deficon, defname);
} }
})); }));
builder.setNegativeButton("Отмена", ((dialog, which) -> { builder.setNegativeButton(AndroidUtils.getString("cancel"), ((dialog, which) -> {
dialog.dismiss(); dialog.dismiss();
})); }));
@@ -114,13 +115,13 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
this.addPreferencesFromResource(vtosterXml); this.addPreferencesFromResource(vtosterXml);
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) { if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
addPreference(this, "", "Доступны не все функции!", "Для разблокировки необходимо сделать пожертование от 99р", "ic_about_outline_28", preference -> { addPreference(this, "", AndroidUtils.getString("icons_warning"), AndroidUtils.getString("icons_warning_info"), "ic_about_outline_28", preference -> {
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app"))); getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/")));
return false; return false;
}); });
} }
addPreferenceCategory(this, "Иконки"); addPreferenceCategory(this, AndroidUtils.getString("icons_title"));
for (var i = 0; i < icons().size(); i++) { for (var i = 0; i < icons().size(); i++) {
if (icons().get(i) == null || iconsValues().get(i) == null) return; if (icons().get(i) == null || iconsValues().get(i) == null) return;
@@ -151,7 +152,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
} }
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) { if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
addPreferenceCategory(this, "Недоступные иконки"); addPreferenceCategory(this, AndroidUtils.getString("unavailable_icons"));
for (var i = 2; i < sIconsPlusNames.size(); i++) { for (var i = 2; i < sIconsPlusNames.size(); i++) {
if (sIconsPlusNames.get(i) == null || sIconsPlus.get(i) == null) return; if (sIconsPlusNames.get(i) == null || sIconsPlus.get(i) == null) return;
@@ -176,7 +177,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
} }
addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> { addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
sendToast("Иконка доступна только обладателям верификации"); sendToast(AndroidUtils.getString("unavailable_icon_warning"));
return false; return false;
}); });
} }
@@ -11,6 +11,7 @@ import androidx.preference.Preference;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.dialogs.RoundingSeekbarDialog; import ru.vtosters.lite.ui.dialogs.RoundingSeekbarDialog;
import ru.vtosters.lite.utils.AndroidUtils;
public class InterfaceFragment extends MaterialPreferenceToolbarFragment { public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
@@ -31,9 +32,9 @@ public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
}); });
if (getPreferences().getInt("pic_rounding", 0) == 0) { if (getPreferences().getInt("pic_rounding", 0) == 0) {
findPreference("customrounding").setSummary("Отключено"); findPreference("customrounding").setSummary(AndroidUtils.getString("disabled"));
} else { } else {
findPreference("customrounding").setSummary("Размер закругления: " + getPreferences().getInt("pic_rounding", 0) + "dp"); findPreference("customrounding").setSummary(String.format(AndroidUtils.getString("rounding_size"), getPreferences().getInt("pic_rounding", 0)));
} }
} }
@@ -1,6 +1,7 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.music.Scrobbler.isLoggedIn; import static ru.vtosters.lite.music.Scrobbler.isLoggedIn;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
@@ -42,6 +43,7 @@ import okhttp3.Request;
import ru.vtosters.lite.downloaders.VideoDownloader; import ru.vtosters.lite.downloaders.VideoDownloader;
import ru.vtosters.lite.music.Scrobbler; import ru.vtosters.lite.music.Scrobbler;
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter; import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.FileUriUtils; import ru.vtosters.lite.utils.FileUriUtils;
import ru.vtosters.lite.utils.Preferences; import ru.vtosters.lite.utils.Preferences;
@@ -67,8 +69,6 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
var prefs = getPreferences(); var prefs = getPreferences();
var editor = prefs.edit(); var editor = prefs.edit();
var actualPath = FileUriUtils.getFullPathFromTreeUri(path, getContext()); var actualPath = FileUriUtils.getFullPathFromTreeUri(path, getContext());
Log.d("MediaFragment", "onActivityResult: " + actualPath);
Log.d("MediaFragment", "onActivityResult: " + requestCode);
switch (requestCode) { switch (requestCode) {
case REQUEST_CODE_SET_DOWNLOAD_DIRECTORY: case REQUEST_CODE_SET_DOWNLOAD_DIRECTORY:
editor.putString("downloads_directory", actualPath); editor.putString("downloads_directory", actualPath);
@@ -113,19 +113,19 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
}); });
findPreference("downloads_directory").setSummary( findPreference("downloads_directory").setSummary(
"Текущая папка: " + Preferences.getDownloadsDir() AndroidUtils.getString("current_download_folder") + " " + Preferences.getDownloadsDir()
); );
findPreference("photos_directory").setSummary( findPreference("photos_directory").setSummary(
"Текущая папка: " + Preferences.getPhotosDir() AndroidUtils.getString("current_download_folder") + " " + Preferences.getPhotosDir()
); );
findPreference("videos_directory").setSummary( findPreference("videos_directory").setSummary(
"Текущая папка: " + Preferences.getVideosDir() AndroidUtils.getString("current_download_folder") + " " + Preferences.getVideosDir()
); );
findPreference("music_directory").setSummary( findPreference("music_directory").setSummary(
"Текущая папка: " + Preferences.getMusicDir() AndroidUtils.getString("current_download_folder") + " " + Preferences.getMusicDir()
); );
findPreference("downloads_directory").setOnPreferenceClickListener(preference -> { findPreference("downloads_directory").setOnPreferenceClickListener(preference -> {
@@ -157,7 +157,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
}); });
if (isLoggedIn()) { if (isLoggedIn()) {
findPreference("lastfm_auth").setSummary("Вы авторизованы как " + Scrobbler.getUserName()); findPreference("lastfm_auth").setSummary(AndroidUtils.getString("lastfm_authorized_as") + " " + Scrobbler.getUserName());
} else { } else {
findPreference("lastfm_enabled").setEnabled(false); findPreference("lastfm_enabled").setEnabled(false);
} }
@@ -191,7 +191,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx); final EditText fn = new EditText(ctx);
fn.setHint("Логин"); fn.setHint(AndroidUtils.getString("lastfm_login"));
fn.setTextColor(getTextAttr()); fn.setTextColor(getTextAttr());
fn.setHintTextColor(getSTextAttr()); fn.setHintTextColor(getSTextAttr());
fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -202,7 +202,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
fn.setLayoutParams(margin); fn.setLayoutParams(margin);
final EditText ln = new EditText(ctx); final EditText ln = new EditText(ctx);
ln.setHint("Пароль"); ln.setHint(AndroidUtils.getString("lastfm_password"));
ln.setTextColor(getTextAttr()); ln.setTextColor(getTextAttr());
ln.setHintTextColor(getSTextAttr()); ln.setHintTextColor(getSTextAttr());
ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -211,10 +211,10 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
ln.setLayoutParams(margin); ln.setLayoutParams(margin);
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle()); AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle());
alertDialog.setTitle("Введите логин и пароль"); alertDialog.setTitle(AndroidUtils.getString("lastfm_enter_credentials"));
alertDialog.setView(linearLayout); alertDialog.setView(linearLayout);
alertDialog.setPositiveButton("Войти", (dialog, which) -> { alertDialog.setPositiveButton(AndroidUtils.getString("lastfm_enter"), (dialog, which) -> {
String login = fn.getText().toString(); String login = fn.getText().toString();
String pass = ln.getText().toString(); String pass = ln.getText().toString();
@@ -227,12 +227,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
private void logout(Context ctx) { private void logout(Context ctx) {
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(ctx); VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(ctx);
alertDialog.setTitle("Вы уверены?"); alertDialog.setTitle(AndroidUtils.getString("lastfm_logout_title"));
alertDialog.setMessage("Вы действительно хотите выйти из аккаунта?"); alertDialog.setMessage(AndroidUtils.getString("lastfm_logout_confirm"));
alertDialog.setPositiveButton("Да", (dialog, which) -> { alertDialog.setPositiveButton(AndroidUtils.getString("vkim_yes"), (dialog, which) -> {
Scrobbler.logout(); Scrobbler.logout();
}); });
alertDialog.setNeutralButton("Нет", (dialog, which) -> { alertDialog.setNeutralButton(AndroidUtils.getString("vkim_no"), (dialog, which) -> {
dialog.cancel(); dialog.cancel();
}); });
var alert = alertDialog.create(); var alert = alertDialog.create();
@@ -245,7 +245,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
Thread thread = new Thread(() -> { Thread thread = new Thread(() -> {
try { try {
var request = new Request.a() var request = new Request.a()
.b("https://api.vk.com/method/" + "video.clearViewingHistoryRecords" + "?https=1" + "&access_token=" + getUserToken() + "&v=5.187") .b("https://" + getApi() + "/method/" + "video.clearViewingHistoryRecords" + "?https=1" + "&access_token=" + getUserToken() + "&v=5.187")
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")) .a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
.a(); .a();
@@ -262,12 +262,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
thread.start(); thread.start();
sendToast("История просмотра видео очищена"); sendToast(AndroidUtils.getString("video_history_cleaned"));
} }
public static void download(Context ctx) { public static void download(Context ctx) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle()); AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle());
alertDialog.setTitle("Введите ссылку на видео"); alertDialog.setTitle(AndroidUtils.getString("video_dl_enter_link"));
final EditText input = new EditText(ctx); final EditText input = new EditText(ctx);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
@@ -277,7 +277,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
input.setTextColor(getTextAttr()); input.setTextColor(getTextAttr());
input.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); input.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
alertDialog.setView(input); alertDialog.setView(input);
alertDialog.setPositiveButton("Скачать", (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx)); alertDialog.setPositiveButton(AndroidUtils.getString("download"), (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx));
var alert = alertDialog.create(); var alert = alertDialog.create();
alert.show(); alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor()); alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
@@ -1,11 +1,16 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.removeWallpaper;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
import static ru.vtosters.lite.utils.Preferences.autoalltranslate; import static ru.vtosters.lite.utils.Preferences.autoalltranslate;
import static ru.vtosters.lite.utils.Preferences.offline; import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.recolorDrawable;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@@ -31,6 +36,7 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
prefs(); prefs();
} }
@SuppressLint("UseCompatLoadingForDrawables")
private void prefs() { private void prefs() {
findPreference("vkme").setOnPreferenceClickListener(new MessagesFragment.restart()); findPreference("vkme").setOnPreferenceClickListener(new MessagesFragment.restart());
findPreference("vkme_notifs").setOnPreferenceClickListener(new MessagesFragment.restart()); findPreference("vkme_notifs").setOnPreferenceClickListener(new MessagesFragment.restart());
@@ -50,7 +56,7 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
.create(); .create();
var listView = (ListView) LayoutInflater.from(getContext()).inflate(com.vtosters.lite.R.layout.abc_select_dialog_material, null, false); var listView = (ListView) LayoutInflater.from(getContext()).inflate(com.vtosters.lite.R.layout.abc_select_dialog_material, null, false);
var adapter = new ImagineArrayAdapter(getContext(), items, i -> { var adapter = new ImagineArrayAdapter(requireContext(), items, i -> {
getPreferences().edit().putInt("translator", i).apply(); getPreferences().edit().putInt("translator", i).apply();
alert.dismiss(); alert.dismiss();
}); });
@@ -61,15 +67,20 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
findPreference("vkme_notifs").setEnabled(vkme());
findPreference("wallpapers").setIcon(recolorDrawable(getGlobalContext().getDrawable(getIdentifier("ic_media_outline_28", "drawable"))));
findPreference("vkme").setIcon(getIdentifier("ic_vkme_28", "drawable"));
} }
@Override @Override
public boolean onPreferenceTreeClick(Preference preference) { public boolean onPreferenceTreeClick(Preference preference) {
findPreference("autotranslate").setEnabled(!autoalltranslate()); findPreference("autotranslate").setEnabled(!autoalltranslate());
findPreference("vkme_notifs").setEnabled(vkme());
return super.onPreferenceTreeClick(preference); return super.onPreferenceTreeClick(preference);
} }
public boolean restart(Preference preference) { public boolean restart() {
restartApplicationWithTimer(); restartApplicationWithTimer();
return true; return true;
} }
@@ -77,24 +88,25 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
public class restart implements Preference.OnPreferenceClickListener { public class restart implements Preference.OnPreferenceClickListener {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
return MessagesFragment.this.restart(preference); return MessagesFragment.this.restart();
} }
} }
public class clearCache implements Preference.OnPreferenceClickListener { public class clearCache implements Preference.OnPreferenceClickListener {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
return MessagesFragment.this.restart(preference); return MessagesFragment.this.restart();
} }
} }
public class openwp implements Preference.OnPreferenceClickListener { public class openwp implements Preference.OnPreferenceClickListener {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
Context context = getContext(); // Context context = getContext();
Intent a2 = new Navigator(WallpaperMenuFragment.class).b(context); // Intent a2 = new Navigator(WallpaperMenuFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(a2); // context.startActivity(a2);
sendToast("Обои временно недоступны. Следите за новостями на @vtosters в Telegram");
return true; return true;
} }
} }
@@ -9,9 +9,9 @@ import static ru.vtosters.lite.ui.components.BackupManager.deletePrefs;
import static ru.vtosters.lite.ui.components.BackupManager.restoreBackup; import static ru.vtosters.lite.ui.components.BackupManager.restoreBackup;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.CacheUtils.deleteCache;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -76,7 +76,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
String token = data.getStringExtra("token"); String token = data.getStringExtra("token");
AndroidUtils.getPreferences().edit().putString("vk_admin_token", token).apply(); AndroidUtils.getPreferences().edit().putString("vk_admin_token", token).apply();
Log.d("VkAdminToken", token); Log.d("VkAdminToken", token);
Toast.makeText(getContext(), "Токен успешно сохранён", LENGTH_SHORT).show(); Toast.makeText(getContext(), AndroidUtils.getString("token_saved"), LENGTH_SHORT).show();
} }
} }
} }
@@ -95,25 +95,31 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
findPreference("resetfolders").setOnPreferenceClickListener(preference -> {
edit().remove("photos_directory").remove("videos_directory").remove("audios_directory").remove("downloads_directory").apply();
Toast.makeText(getContext(), AndroidUtils.getString("download_folders_reseted"), LENGTH_SHORT).show();
return true;
});
var pref = getDefaultPrefs().getString("autoclearcache", "Default"); var pref = getDefaultPrefs().getString("autoclearcache", "Default");
switch (pref) { switch (pref) {
case "Default": case "Default":
findPreference("autoclearcache").setSummary("Не включено"); findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_disabled"));
break; break;
case "100mb": case "100mb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 100 Мб"); findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_100mb"));
break; break;
case "500mb": case "500mb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 500 Мб"); findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_500mb"));
break; break;
case "1gb": case "1gb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 1 Гб"); findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_1gb"));
break; break;
case "2gb": case "2gb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 2 Гб"); findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_2gb"));
break; break;
case "5gb": case "5gb":
findPreference("autoclearcache").setSummary("Очищать кеш при не менее 5 Гб"); findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_5gb"));
break; break;
} }
@@ -185,12 +191,12 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
five.setChecked(val == 5); five.setChecked(val == 5);
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(getContext()); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(getContext());
builder.setTitle("Очистка кеша"); builder.setTitle(AndroidUtils.getString("cache_clean_title"));
builder.setMessage("Выберите объём кеша для очистки"); builder.setMessage(AndroidUtils.getString("cache_select_size"));
builder.setCancelable(true); builder.setCancelable(true);
builder.setNegativeButton("Отмена", null); builder.setNegativeButton(AndroidUtils.getString("cancel"), null);
builder.setView(rg); builder.setView(rg);
builder.setPositiveButton("Сохранить", (dialog, which) -> { builder.setPositiveButton(AndroidUtils.getString("save"), (dialog, which) -> {
var pref = getDefaultPrefs().edit(); var pref = getDefaultPrefs().edit();
var checked = rg.getCheckedRadioButtonId(); var checked = rg.getCheckedRadioButtonId();
@@ -221,8 +227,8 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
private void cacheCleanDialog() { private void cacheCleanDialog() {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(getContext()); VkAlertDialog.Builder builder = new VkAlertDialog.Builder(getContext());
builder.setTitle("Выберите что вы хотите очистить"); builder.setTitle(AndroidUtils.getString("select_which_clean"));
builder.setItems(new String[]{"Очистить весь кеш", "Очистить кеш стикеров", "Очистить кеш изображений", "Очистить кеш видео", "Очистить кеш сообщений", "Очистить кеш WebView"}, (dialog, which) -> { builder.setItems(AndroidUtils.getArray("cache_cleaner"), (dialog, which) -> {
switch (which) { switch (which) {
case 0: { case 0: {
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE); SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
@@ -237,7 +243,6 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
ImEngineExt.a(ImEngine1.a()); ImEngineExt.a(ImEngine1.a());
AutoPlayCacheHolder.d.a(); AutoPlayCacheHolder.d.a();
MediaStorage.a(); MediaStorage.a();
deleteCache();
break; break;
} }
case 1: { case 1: {
@@ -264,7 +269,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
break; break;
} }
Toast.makeText(getContext(), "Кеш очищен", LENGTH_SHORT).show(); Toast.makeText(getContext(), AndroidUtils.getString("cache_cleaned"), LENGTH_SHORT).show();
}); });
builder.create().show(); builder.create().show();
} }
@@ -283,7 +288,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
try { try {
backupOnlines(); backupOnlines();
} catch (IOException e) { } catch (IOException e) {
Toast.makeText(getContext(), "Нет данных для резервного копирования", LENGTH_SHORT).show(); Toast.makeText(getContext(), AndroidUtils.getString("no_data_to_backup"), LENGTH_SHORT).show();
} }
return true; return true;
} }
@@ -353,14 +358,14 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
var arr = BackupManager.getBackupsNames(); var arr = BackupManager.getBackupsNames();
var adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, arr); var adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, arr);
new VkAlertDialog.Builder(getContext()) new VkAlertDialog.Builder(getContext())
.setTitle("Выберите бэкап") .setTitle(AndroidUtils.getString("select_backup"))
.setAdapter(adapter, (dialog, which) -> { .setAdapter(adapter, (dialog, which) -> {
try { try {
restoreBackup(arr[which]); restoreBackup(arr[which]);
Toast.makeText(getContext(), "Настройки восстановлены", LENGTH_LONG).show(); Toast.makeText(getContext(), AndroidUtils.getString("backup_success"), LENGTH_LONG).show();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(getContext(), "Ошибка, Настройки не восстановлены", LENGTH_LONG).show(); Toast.makeText(getContext(), AndroidUtils.getString("backup_error"), LENGTH_LONG).show();
} }
}).create().show(); }).create().show();
return true; return true;
@@ -1,15 +1,29 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.proxy.RandomProxy.setupNewProxy;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.os.Bundle; import android.os.Bundle;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import java.io.IOException;
import ru.vtosters.lite.utils.AndroidUtils;
public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment { public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_proxy", "xml")); addPreferencesFromResource(getIdentifier("preferences_proxy", "xml"));
findPreference("random_proxy").setOnPreferenceClickListener(preference -> {
try {
setupNewProxy();
} catch (IOException e) {
sendToast(AndroidUtils.getString("get_proxy_error"));
}
return true;
});
} }
} }
@@ -4,6 +4,7 @@ import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.Gravity; import android.view.Gravity;
@@ -46,9 +47,9 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
message.setTextColor(ThemesUtils.getTextAttr()); message.setTextColor(ThemesUtils.getTextAttr());
message.setPadding( message.setPadding(
AndroidUtils.dp2px(10), dp2px(10),
AndroidUtils.dp2px(10), dp2px(10),
AndroidUtils.dp2px(10), dp2px(10),
0 0
); );
container.addView(message, LayoutUtils.createLinear(-1, -2)); container.addView(message, LayoutUtils.createLinear(-1, -2));
@@ -94,16 +95,29 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
: manager.getDisabledTabs().get(pos - manager.getSelectedTabs().size() - 2); : manager.getDisabledTabs().get(pos - manager.getSelectedTabs().size() - 2);
holder.bindMovingItem(item.title); holder.bindMovingItem(item.title);
}); });
manager.getSelectedTabs().forEach(item -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (item.type.equals("menu")) manager.getSelectedTabs().forEach(item -> {
adapter.addUnmovedItem(item); if (item.type.equals("menu"))
}); adapter.addUnmovedItem(item);
manager.getDisabledTabs().forEach(item -> { });
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
var recyclerView = new RecyclerView(getContext()); manager.getDisabledTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
} else {
for (var item : manager.getSelectedTabs()) {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
}
for (var item : manager.getDisabledTabs()) {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
}
}
var recyclerView = new RecyclerView(requireContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true); recyclerView.setHasFixedSize(true);
@@ -114,7 +114,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
public static String getSuperappsumm() { public static String getSuperappsumm() {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
return "Скрыто элементов" + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size(); return AndroidUtils.getString("elements_hidden_count") + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size();
} }
public static String getCachesumm() { public static String getCachesumm() {
@@ -183,7 +183,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
} }
if (!isGmsInstalled()) { if (!isGmsInstalled()) {
addPreference(this, "", AndroidUtils.getString("installgms"), "", "ic_warning_24", preference -> { addPreference(this, "", AndroidUtils.getString("installgms"), "", "ic_about_outline_28", preference -> {
Context context = getContext(); Context context = getContext();
Intent a2 = new Navigator(InstallGMSFragment.class).b(context); Intent a2 = new Navigator(InstallGMSFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -330,7 +330,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
} }
} else { } else {
addPreference(this, "", "Внимание!", "Некоторые пункты настроек были скрыты из-за режима VK Me \n\nДля отключения режима перейдите в настройки Сообщений", "ic_about_outline_28", preference -> false); addPreference(this, "", AndroidUtils.getString("warning"), AndroidUtils.getString("vkme_mode_info"), "ic_about_outline_28", preference -> false);
} }
addPreference(this, "", AndroidUtils.getString("vtlmedia"), mediasumm, "ic_media_outline_28", preference -> { addPreference(this, "", AndroidUtils.getString("vtlmedia"), mediasumm, "ic_media_outline_28", preference -> {
@@ -47,7 +47,6 @@ import ru.vtosters.lite.ui.fragments.BaseToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class StickersFragment extends BaseToolbarFragment { public class StickersFragment extends BaseToolbarFragment {
public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST"; public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST";
private final static int TYPE_DIRECT = 0, TYPE_SOCKS = 2; private final static int TYPE_DIRECT = 0, TYPE_SOCKS = 2;
@@ -147,7 +146,7 @@ public class StickersFragment extends BaseToolbarFragment {
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
getContext().unregisterReceiver(mReceiver); requireContext().unregisterReceiver(mReceiver);
} }
private void fabClick() { private void fabClick() {
@@ -1,7 +1,10 @@
package ru.vtosters.lite.ui.vkui; package ru.vtosters.lite.ui.vkui;
import static ru.vtosters.lite.foaf.FoafBase.loadAndShow; import static ru.vtosters.lite.foaf.FoafBase.loadAndShow;
import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedAd;
import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedFilter;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserID; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserID;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.content.ClipData; import android.content.ClipData;
@@ -24,6 +27,7 @@ import java.util.Objects;
import kotlin.Unit; import kotlin.Unit;
import kotlin.jvm.b.Functions; import kotlin.jvm.b.Functions;
import ru.vtosters.lite.hooks.NewsfeedHook;
import ru.vtosters.lite.utils.RenameTool; import ru.vtosters.lite.utils.RenameTool;
public class MenuBuilder { public class MenuBuilder {
@@ -54,18 +58,17 @@ public class MenuBuilder {
try { try {
final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb); final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb);
final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext(); final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext();
addItem(builder, getString("menu_copy_id"), () -> {
addItem(builder, "Скопировать ID", () -> {
copy(ctx, String.valueOf(getUserID(eup))); copy(ctx, String.valueOf(getUserID(eup)));
return Unit.a; return Unit.a;
}); });
addItem(builder, "Дополнительная информация", () -> { addItem(builder, getString("menu_addon_info"), () -> {
loadAndShow(ctx, getUserID(eup)); loadAndShow(ctx, getUserID(eup));
return Unit.a; return Unit.a;
}); });
addItem(builder, "Изменить имя", () -> { addItem(builder, getString("menu_change_name"), () -> {
RenameTool.createDialog(eup, ctx); RenameTool.createDialog(eup, ctx);
return Unit.a; return Unit.a;
}); });
@@ -79,17 +82,31 @@ public class MenuBuilder {
try { try {
final ExtendedCommunityProfile ecp = (ExtendedCommunityProfile) cfambObject.get(mb); final ExtendedCommunityProfile ecp = (ExtendedCommunityProfile) cfambObject.get(mb);
final Context ctx = ((View) apView.get(builder)).getContext(); final Context ctx = ((View) apView.get(builder)).getContext();
final boolean isPageWhitelistedFilter = NewsfeedHook.isWhitelistedFilter(ecp);
final boolean isPageWhitelistedAds = NewsfeedHook.isWhitelistedAd(ecp);
addItem(builder, "Скопировать ID", () -> { addItem(builder, getString("menu_copy_id"), () -> {
copy(ctx, String.valueOf(getUserID(ecp))); copy(ctx, String.valueOf(getUserID(ecp)));
return Unit.a; return Unit.a;
}); });
addItem(builder, "Изменить имя", () -> { addItem(builder, getString("menu_change_name"), () -> {
RenameTool.createDialogGroup(ecp, ctx); RenameTool.createDialogGroup(ecp, ctx);
return Unit.a; return Unit.a;
}); });
addItem(builder, getString(isPageWhitelistedFilter ? "remove_from_filter_whitelist" : "add_to_filter_whitelist"), () -> {
setWhitelistedFilter(ecp, !isPageWhitelistedFilter);
sendToast(getString(isPageWhitelistedFilter ? "removed_from_whitelist_success" : "added_to_whitelist_success"));
return Unit.a;
});
addItem(builder, getString(isPageWhitelistedAds ? "remove_from_ads_whitelist" : "add_to_ads_whitelist"), () -> {
setWhitelistedAd(ecp, !isPageWhitelistedAds);
sendToast(getString(isPageWhitelistedAds ? "removed_from_whitelist_success" : "added_to_whitelist_success"));
return Unit.a;
});
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -100,7 +117,7 @@ public class MenuBuilder {
ClipData clip = ClipData.newPlainText("MBH-ST", txt); ClipData clip = ClipData.newPlainText("MBH-ST", txt);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
sendToast("Скопировано!"); sendToast(getString("menu_copied"));
} }
public static void addItem(final ActionsPopup.b builder, final String title, final Functions onClick) throws InvocationTargetException, IllegalAccessException { public static void addItem(final ActionsPopup.b builder, final String title, final Functions onClick) throws InvocationTargetException, IllegalAccessException {
@@ -0,0 +1,50 @@
package ru.vtosters.lite.ui.vkui;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.content.Context;
import android.util.TypedValue;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import java.util.List;
public class VBListBuilder{
public static ViewGroup buildListOf(Context ctx, List<VBListItem> items){
LinearLayout mainView = new LinearLayout(ctx);
mainView.setOrientation(LinearLayout.VERTICAL);
mainView.setPadding(dp2px(8f), 0, dp2px(8f), 0);
for (VBListItem item : items) {
CheckBox mcb = new CheckBox(ctx, null);
mcb.setPadding(0, dp2px(8f), 0, dp2px(8f));
mcb.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14f);
mcb.setTextColor(getTextAttr());
mcb.setChecked(item.checked);
mcb.setText(item.title);
mcb.setOnCheckedChangeListener((buttonView, isChecked) -> {
item.checked = isChecked;
});
mainView.addView(mcb);
}
return mainView;
}
public static class VBListItem{
public String id;
public String title;
public boolean checked;
public VBListItem(String id, String title, boolean checked){
this.id = id;
this.title = title;
this.checked = checked;
}
}
}

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