Compare commits

..
1148 Commits
Author SHA1 Message Date
gdlbo 0cdccd6a54 TargetImageView 2022-08-06 17:39:34 +03:00
gdlbo 829a333d7f disabled pinned msg buttons 2022-08-06 15:26:29 +03:00
gdlbo 42984efe25 max dp 10 2022-08-06 14:00:24 +03:00
gdlbo 7656468636 rounding hook fixes 2022-08-06 13:40:40 +03:00
gdlbo 448a169bc3 code imp 2022-08-06 12:49:56 +03:00
gdlbo 27cacc03a2 code imp 2022-08-05 23:13:35 +03:00
gdlbo 2002db57d9 DownloadUtils fixes 2022-08-05 22:24:29 +03:00
gdlbo 0aad1ef358 DownloadUtils 2022-08-05 21:41:34 +03:00
gdlbo d8f5b5e910 dir fixes 2022-08-05 21:21:18 +03:00
aliveoutside 3d5c832cec use different request codes for different download types 2022-08-05 21:07:30 +03:00
gdlbo bc467ac335 more folders picker 2022-08-05 20:49:09 +03:00
gdlbo aee5f38fb5 more folders picker 2022-08-05 20:39:24 +03:00
aliveoutside a4612a127d implement download folder picker 2022-08-05 19:53:02 +03:00
gdlbo 7a21f11b64 some code imp 2022-08-05 19:48:31 +03:00
gdlbo 4775715b66 some code imp 2022-08-05 19:47:53 +03:00
gdlbo c481d5fca9 some code imp 2022-08-05 19:28:27 +03:00
aliveoutside be65e6816d fix #571
also get rid of java reflection
2022-08-05 03:03:40 +03:00
gdlbo 1f2200c584 come imp 2022-08-04 15:49:48 +03:00
gdlbo 52b58dc79b some code imp 2022-08-04 14:47:36 +03:00
gdlbo de92e4670c DialogItemView converted to java
i am dead inside tbh
2022-08-04 14:30:29 +03:00
gdlbo 4806bb89eb Merge pull request #566 from k1zn/vtl-remaster 2022-08-04 01:24:22 +03:00
Erik Kiznov 0cdbf9ce99 another renaming 2022-08-04 02:02:44 +05:00
Erik Kiznov a7bde644a4 Merge branch 'vtl-remaster' of https://github.com/k1zn/lite into vtl-remaster 2022-08-04 02:01:18 +05:00
Erik Kiznov e461b4654e edit some strings about filters 2022-08-04 01:59:47 +05:00
k1zn 8d7f2dfee8 Fix lower case bug 2022-08-04 01:55:18 +05:00
k1zn bf5bc08671 Renaming 2022-08-04 01:22:06 +05:00
Erik Kiznov 437bef3d03 Add filter for source name 2022-08-04 01:08:30 +05:00
gdlbo 024079c4bc fixed def catalog music 2022-08-01 22:34:14 +03:00
gdlbo ed53f509ee ads_tracking_disabled true 2022-08-01 22:17:38 +03:00
gdlbo 6b90aedae8 adblock lmao 2022-08-01 21:36:47 +03:00
gdlbo 4db73ff3d1 Reducing the size of news traffic by disabling the ad request 2022-08-01 21:09:08 +03:00
aliveoutside 4a092f0920 fix #465
added a check for "Music" folder existence
2022-08-01 16:50:29 +03:00
Vologhat 186c1f80e6 added "likes on right" displaying mode for posts and viewers 2022-08-01 13:33:58 +03:00
gdlbo 59c8be9ac2 some vkui improvements 2022-08-01 01:53:50 +03:00
gdlbo eb2c4c02d2 some fixes 2022-08-01 00:48:58 +03:00
gdlbo fe2fd354fd read to feature 2022-08-01 00:39:02 +03:00
k1zn 16fd8925ff Add translate function to catch 2022-07-31 23:01:30 +03:00
k1zn 661302d90f Remove %
The percentage in the text breaks the translation process, so I remove it.
2022-07-31 23:01:30 +03:00
Erik Kiznov 2c8dd6e89a Another refactoring... 2022-07-31 23:01:30 +03:00
Erik Kiznov 91fe8a8fb4 Add @ support 2022-07-31 23:01:30 +03:00
Erik Kiznov cc3456758e Fix bug 2022-07-31 23:01:30 +03:00
Erik Kiznov c2dc772905 Refactoring 2022-07-31 23:01:30 +03:00
Erik Kiznov 9915e8d2df Don't translate mentions
Don't translate mentions in MessagesHook
2022-07-31 23:01:30 +03:00
gdlbo 5c79dbe1c2 req dumper 2022-07-31 22:26:36 +03:00
gdlbo f83e97404a video history delete 2022-07-31 18:33:37 +03:00
aliveoutside f704d54178 fix #450 / #547 and speed up logout 2022-07-31 18:10:30 +03:00
gdlbo 3577e3b70c about debug activation 2022-07-31 16:58:39 +03:00
gdlbo 000bd5e7d3 settings moment 2022-07-31 14:04:23 +03:00
gdlbo 4d3e8d4354 cache moment 2022-07-31 13:42:50 +03:00
gdlbo 0d51b40676 deepl ded 2022-07-31 13:34:24 +03:00
Erik Kiznov 054f03480e Fix strings about bombs 2022-07-31 13:34:24 +03:00
Vologhat 114b46ccee added translation language as argument 2022-07-31 13:34:24 +03:00
gdlbo 0715c0cfcf some imp 2022-07-31 13:34:24 +03:00
gdlbo a51a146780 fixed gtranslate + added reply’s translate 2022-07-31 13:34:24 +03:00
gdlbo c2c3ea68fa some imp 2022-07-31 13:34:24 +03:00
gdlbo 8e40da9fb4 compiling fix 2022-07-31 13:34:23 +03:00
gdlbo d6b744533b compiling fix 2022-07-31 13:34:23 +03:00
Vologhat df1d411ae0 added new translators and choicing of that 2022-07-31 13:34:23 +03:00
gdlbo 2904616d67 Update MessagesSendApiCmd.smali 2022-07-31 13:34:23 +03:00
gdlbo 61eac6feca some fixes 2022-07-31 13:34:23 +03:00
gdlbo 1f29f2ddc5 fixed dialog 2022-07-31 13:34:23 +03:00
gdlbo fbff3eadde dialog fixes 2022-07-31 13:34:23 +03:00
gdlbo 7c8a76616c added bombs 2022-07-31 13:34:23 +03:00
gdlbo 465d52df67 updated icons 2022-07-31 13:34:23 +03:00
gdlbo 57e69b0d98 Create ic_deepl_logo_icon.xml 2022-07-31 13:34:22 +03:00
gdlbo a799828de0 some icons 2022-07-31 13:34:22 +03:00
gdlbo e6ad306e24 migrated to vkalertdialog 2022-07-31 13:34:22 +03:00
gdlbo 5ff1e0a0a6 Update DNRInjector.java 2022-07-31 13:34:22 +03:00
gdlbo 09048a7a21 china number one 2022-07-31 13:34:22 +03:00
gdlbo 2e2e890875 updated translate dialog 2022-07-31 13:34:22 +03:00
gdlbo 271b1cdfee Update Translate.java 2022-07-31 13:34:08 +03:00
gdlbo bc06512250 fixed onclick 2022-07-31 13:34:08 +03:00
gdlbo a94af3a4db message hook 2022-07-31 13:34:08 +03:00
gdlbo 924a34b458 code imp 2022-07-31 13:34:07 +03:00
Vologhat f73b880b6d added messages hook and base class for translators 2022-07-31 13:34:07 +03:00
Vologhat a53a9eaeaa fixed errors 2022-07-31 13:34:07 +03:00
gdlbo 88390f0fc9 dialog 2022-07-31 13:33:42 +03:00
gdlbo c6721841ac rebase 2022-07-31 13:33:31 +03:00
Vologhat dfa77311f2 removed deepl and added yandex 2022-07-31 13:32:49 +03:00
Vologhat 57e241ab7d replace net to okhttp 2022-07-31 13:32:48 +03:00
gdlbo 50b97aac8a DeepLApi test 2022-07-31 13:32:48 +03:00
k1zn 6166b29b29 Update README.md 2022-07-30 18:32:54 +03:00
gdlbo 7ee1331263 fixed msg 2022-07-30 17:54:26 +03:00
gdlbo 0cc0299215 deviceinfo and geodata hide feature 2022-07-30 17:37:28 +03:00
iNotFlying a7e0f2ae2b Update README.md 2022-07-30 15:48:05 +03:00
gdlbo c38e0aa61e fixed adding music catalog bug 2022-07-30 13:59:54 +03:00
iNotFlying 9496da151a Refactoring 2022-07-30 02:33:23 +03:00
gdlbo 5cec11c6dd dialog pin/unpin system (api) 2022-07-30 01:13:52 +03:00
gdlbo a285bf4270 updated stock icon 2022-07-29 23:54:37 +03:00
aliveoutside 344c418412 Merge pull request #539 from ricoshett/vtl-remaster
добавлена быстрая навигация
размер изображений в блоке Линукса и Винды теперь одинаков
2022-07-29 18:30:14 +03:00
gdlbo 5464053fa0 code beautifying 2022-07-29 16:28:49 +03:00
ricoshett 8036fc332b update README.md 2022-07-29 16:23:44 +03:00
aliveoutside c1cb5c23ae update ffmpeg-kit 2022-07-29 18:39:39 +03:00
gdlbo dbb25fbabd some java moments 2022-07-29 16:14:24 +03:00
k1zn d75a339a02 Fix README.md 2022-07-29 15:20:07 +03:00
aliveoutside 6fd15a05ff Merge pull request #536 from k1zn/vtl-remaster
<!> Ignore *.md files in Github Actions
2022-07-29 14:49:54 +03:00
aliveoutside 0d991138c0 Update README.md (Update README.md)
Update README.md (Update README.md) (Update README.md)
2022-07-29 14:49:44 +03:00
k1zn 5264a397a0 Update build.yml 2022-07-29 16:41:30 +05:00
iNotFlying c2fe5e6c3c Update README.md 2022-07-29 12:52:35 +04:00
iNotFlying 7c232b70ed Update README.md 2022-07-29 12:50:27 +04:00
iNotFlying 8761d23bda Update README.md 2022-07-29 12:30:41 +04:00
iNotFlying 81203ef531 Update README.md 2022-07-29 12:29:31 +04:00
iNotFlying 743356af01 Update README.md 2022-07-29 12:17:27 +04:00
iNotFlying 036cf4846c Update README.md 2022-07-29 12:15:21 +04:00
iNotFlying 7f97394861 Update README.md 2022-07-29 12:13:31 +04:00
aliveoutside d439469f39 Merge pull request #532 from k1zn/vtl-remaster
fixes a bug where pinned dialogs don't show up in the message section
2022-07-29 01:32:05 +03:00
k1zn 8ec891d0bc Fix locals + fix fields 2022-07-29 03:13:58 +05:00
k1zn bb318aeeb1 Set MessagesGetConversationsApiCmd fields to public 2022-07-29 02:29:00 +05:00
k1zn 6621f7c2a2 Add support for major_sort_id in messages
This commit fixes a bug where pinned dialogs don't show up in the message section.
2022-07-29 02:15:53 +05:00
iNotFlying 108e212c56 Update README.md 2022-07-28 23:15:47 +03:00
iNotFlying f923db90ea Update README.md 2022-07-28 23:15:47 +03:00
k1zn e5a0e9617b Update README.md 2022-07-28 23:15:47 +03:00
k1zn e0d27dd97c Update README.md 2022-07-28 23:15:47 +03:00
k1zn 5d49fc586b Update README.md 2022-07-28 23:15:47 +03:00
k1zn e1beef2e29 Update README.md 2022-07-28 23:15:47 +03:00
gdlbo 0803e73949 added music grabber 2022-07-28 20:16:01 +03:00
gdlbo e7b8dd56fe icon changed 2022-07-28 18:02:20 +03:00
gdlbo add56248e1 Revert "Temporary fix for pinned dialogs"
This reverts commit 90a539d361.
2022-07-28 17:48:31 +03:00
k1zn 90a539d361 Temporary fix for pinned dialogs
A temporary fix for pinned dialogs, so that they at least appear in the section
2022-07-28 17:45:45 +03:00
gdlbo ed2645e3ff cache sett refactoring 2022-07-28 15:49:24 +03:00
gdlbo cdc8d2eaf2 screenshot detect 2022-07-28 13:21:37 +03:00
gdlbo bdb9dc670c some code improvements 2022-07-28 11:46:08 +03:00
gdlbo 32b3a035a8 some settings logic reworked 2022-07-28 02:24:38 +03:00
gdlbo c44aea13d6 some improvements of scrobbler 2022-07-28 01:41:21 +03:00
gdlbo ce4bb21782 fixed hint text 2022-07-28 01:40:51 +03:00
gdlbo fa5716d651 Update Scrobbler.java 2022-07-28 00:49:39 +03:00
gdlbo c7971c9860 Update Scrobbler.java 2022-07-28 00:46:52 +03:00
gdlbo 9d3e7c53de lastfm test 2022-07-28 00:15:41 +03:00
gdlbo 81c4e1c019 fixed crashreporter 2022-07-28 00:15:41 +03:00
Vologhat a4125653cf The great refactoring 2022-07-27 21:05:15 +03:00
gdlbo 3c3b51d6ab podcasts are dead + returned old vk pay 2022-07-27 18:03:45 +03:00
gdlbo 9e21dee290 some pic fixes 2022-07-27 16:42:50 +03:00
gdlbo c341e493f8 upped conv api ver 2022-07-27 15:51:30 +03:00
gdlbo e6325c74d8 upped vk hardcoded build number 2022-07-27 13:52:12 +03:00
gdlbo e703adb168 some music fixes 2022-07-27 13:33:47 +03:00
gdlbo ae2b9e0cce some default prefs fix 2022-07-26 19:21:08 +03:00
gdlbo 6db84cbc12 default prefs + fix default fragment 2022-07-26 19:09:38 +03:00
gdlbo db41faee3e temp fix for a10+ 2022-07-26 18:50:45 +03:00
gdlbo 905158bb07 some deobf FileUtils (why?) 2022-07-26 18:42:13 +03:00
k1zn a08782de4e Fix access_token regex (again) 2022-07-26 18:14:32 +03:00
k1zn 0fcbffab26 Fix access_token regex 2022-07-26 18:14:32 +03:00
gdlbo 30d6ccbd9a fix comments 2022-07-26 18:13:40 +03:00
gdlbo cd7f3f8b52 fixed video catalog + deleted useless feature 2022-07-25 21:59:55 +03:00
Erik Kiznov 4b57fa9414 Add VK Video new icon 2022-07-25 21:49:54 +03:00
Erik Kiznov 9d3099f816 Updated VK Music icon for all DPI 2022-07-25 21:49:54 +03:00
Erik Kiznov a0c02b2fd1 VK Rebranding (Part 2.1)
Founded and updated some VK logos (in notification, in app-icon)
2022-07-25 21:49:54 +03:00
Erik Kiznov df8c86fe4c New "Music" logo in dockbar 2022-07-25 21:49:54 +03:00
Erik Kiznov 008a24bfff VK Rebranding (Part 2)
* Updated VK Logo
* Updated VK Music logo
* Updated VK Pay logo
2022-07-25 21:49:54 +03:00
gdlbo 5484766ef1 dockbar improved 2022-07-25 21:19:18 +03:00
gdlbo b36a3bfbdb speedup settings 2022-07-25 21:19:18 +03:00
gdlbo 7fc842c9ef fixed open music catalog 2022-07-25 21:19:18 +03:00
gdlbo 8615faff4a fixed tgs dialog 2022-07-25 21:19:18 +03:00
gdlbo ba05c831cc deleted getAdvertisingId check + deleted vigo tracker 2022-07-25 21:19:18 +03:00
gdlbo 3f11a14d92 deleted my target lib (fully) 2022-07-25 21:19:18 +03:00
gdlbo 0284dec33a del ad audio lib 2022-07-25 21:19:18 +03:00
Erik Kiznov 8d376d9e5a VK Rebranding
This commit updates VK logo in all (maybe) pictures
2022-07-25 18:50:25 +03:00
gdlbo ce731b1832 dockbar fixes 2022-07-25 01:53:12 +03:00
gdlbo 64a8552647 some migration to VkAlertDialog 2022-07-25 01:45:32 +03:00
gdlbo e0b06449ec dockbar fixes 2022-07-24 22:32:35 +03:00
gdlbo 64d62b10a1 size text labels 2022-07-24 20:35:56 +03:00
gdlbo 1a3cf8695d bold text labels 2022-07-24 20:11:11 +03:00
gdlbo 1251dd1d2d dockbar colors fix 2022-07-24 19:43:26 +03:00
gdlbo 06d5b1a779 some profile inj fixes 2022-07-24 16:16:17 +03:00
gdlbo c18a3dde9e new profile buttons injector 2022-07-24 15:24:21 +03:00
Vologhat 6961bc073a added new way of music downloading 2022-07-24 02:17:20 +03:00
gdlbo e1b6f8d66f unlocked dockbar_tab_titles 2022-07-24 00:31:21 +03:00
gdlbo b95edec916 fixes
foaf time is now with local timezone
fixed music starting
2022-07-24 00:02:46 +03:00
gdlbo 8756cd1f20 foaf online 2022-07-23 21:36:37 +03:00
Vologhat 8122c92bbf Update JsonInjectors.java 2022-07-22 15:52:04 +03:00
gdlbo 3e53455a05 Update StandartFilter.txt 2022-07-22 15:06:28 +03:00
gdlbo 07ddb66264 fixed parseRepostItem fetch bug 2022-07-22 15:01:09 +03:00
gdlbo 4fef230a06 speedup adblock 2022-07-22 14:42:25 +03:00
gdlbo 2d73131863 speedup adblock + logs 2022-07-22 13:55:43 +03:00
Vologhat f90ae6bade optimized new newsfeed adblocker 2022-07-22 02:31:20 +03:00
Vologhat b4a45a17c7 optimized new newsfeed adblocker 2022-07-22 01:42:32 +03:00
gdlbo 8767540164 speedup stories adblock 2022-07-22 00:34:47 +03:00
gdlbo fb8e327856 some fixes 2022-07-22 00:29:56 +03:00
gdlbo 344b30aa62 new adblock (alpha) 2022-07-21 23:35:03 +03:00
gdlbo d776693aea unlocked custom newsfeed 2022-07-21 22:08:26 +03:00
gdlbo aaf2f9c6c9 fuck vk 2022-07-21 21:45:23 +03:00
gdlbo 5fbabfbe23 some ad fixes 2022-07-21 19:38:20 +03:00
Vologhat 42645a5414 fixes in stories adblocker 2022-07-21 16:56:05 +03:00
gdlbo 5af63e0adf some ad fixes 2022-07-21 16:34:55 +03:00
gdlbo ba430052de some ad fixes 2022-07-21 15:35:13 +03:00
gdlbo a81ebed663 new stories adblock 2022-07-21 15:30:21 +03:00
gdlbo 920883ada1 def catalog music 2022-07-21 14:16:22 +03:00
gdlbo 41c5f57ccc convBarRecomm 2022-07-21 12:50:46 +03:00
gdlbo 2aa7862fe1 whatsnew block hide 2022-07-21 12:24:09 +03:00
Vologhat 22795bab81 added feature of item state changing by swipe to dockbar and superapp editors 2022-07-21 12:00:46 +03:00
gdlbo 9ae1c0c1bb fix superapp 2022-07-20 23:12:28 +03:00
Vologhat c155e560ba fixed chat preview 2022-07-20 22:30:23 +03:00
gdlbo f92dd71d35 some settings sorting 2022-07-20 18:40:19 +03:00
gdlbo 474f9f0197 vkme warn 2022-07-20 18:21:35 +03:00
gdlbo aee76ba2ff google moment fix 2022-07-20 18:08:07 +03:00
Vologhat 398b6fc37b added state changing by swipe for unmoved items to adapter 2022-07-20 17:55:54 +03:00
gdlbo 454cea3556 dockbar_accent is true 2022-07-20 16:50:00 +03:00
gdlbo 90816b5c67 some dockbar fixes + accent 2022-07-20 16:42:28 +03:00
gdlbo 7c1ac4b267 hide beta feature (need to rework tbh) 2022-07-20 15:54:32 +03:00
gdlbo c145b64441 some dockbar and superapp editor fixes 2022-07-20 15:50:37 +03:00
Vologhat 2ad5ab7a87 added superapp editor, added titles in dockbar and some changes
-Added new SuperApp editor
-Added titles in dockbar and option for it in settings
-Refactored DockBarAdapter
2022-07-20 15:05:17 +03:00
gdlbo 95fd69c5da vkpay/games/miniapps hide feature 2022-07-20 12:24:58 +03:00
gdlbo 1a3f18cbc2 fixed vkx cringe logging 2022-07-19 21:46:38 +03:00
gdlbo f4031ead02 updated some wrappers 2022-07-19 21:39:27 +03:00
gdlbo 37b7783b40 updated some wrappers 2022-07-19 21:38:17 +03:00
gdlbo 8059743e0b added playlists 2022-07-19 20:58:30 +03:00
gdlbo 2c1beedf8b disabled stats 2022-07-19 19:02:55 +03:00
gdlbo 484510da77 music tricks kekw 2022-07-19 19:02:30 +03:00
gdlbo ddf046cd20 music tricks 2022-07-19 16:52:59 +03:00
gdlbo 1c5316ba4e Update LogWriterService.java 2022-07-19 16:52:59 +03:00
aliveoutside 5503caed79 fix #453 2022-07-19 17:21:35 +03:00
aliveoutside 1f11530d04 update .gitignore 2022-07-19 15:58:57 +03:00
gdlbo 95b5fca205 IconsFragment fixes 2022-07-18 22:42:52 +03:00
gdlbo 7432fe7aba icooooooooons! 2022-07-18 22:27:28 +03:00
gdlbo c4630042c7 some fixes 2022-07-18 21:44:03 +03:00
gdlbo 16f4178e36 fix superappitems counter 2022-07-18 21:25:44 +03:00
gdlbo 421d080ec7 icons 2022-07-18 15:31:25 +03:00
Vologhat 381a759c4b temporary hooks disabling 2022-07-18 14:26:27 +03:00
gdlbo 08bb1e1174 fix proxy? 2022-07-18 12:50:41 +03:00
gdlbo 7fec602f34 fixed vk me mode 2022-07-18 10:38:05 +03:00
gdlbo 1f9aca7399 added some new counters 2022-07-18 03:21:48 +03:00
gdlbo 6b5c5bedea fixed friends hide with birthday 2022-07-18 01:53:56 +03:00
Vologhat 0901af5106 fixed dockbar counters #449 2022-07-18 01:35:26 +03:00
Vologhat 5ef7b85e87 fixed scroll to top feature 2022-07-18 01:13:14 +03:00
gdlbo 7facf974e6 fixed ExternalLinkHandler 2022-07-17 23:31:43 +03:00
Vologhat eb21d3d11c fix external player crash in vkplayer 2022-07-17 22:31:29 +03:00
gdlbo 03e8d7873e updated some strings 2022-07-17 21:18:27 +03:00
Vologhat 11faab902f added some features to photo viewer #411
-Added image searching in the internet with feature of selecting search engine
-Added copying image file url to the clipboard
-Added opening image file url in the browsers
2022-07-17 21:15:23 +03:00
gdlbo 9c1b00ef23 some settings summ fixes 2022-07-17 16:59:36 +03:00
gdlbo f40d3a5aac counters 2022-07-17 15:21:19 +03:00
gdlbo 07aa13d9b0 fixed stickers dialog 2022-07-17 15:21:06 +03:00
gdlbo 0b267091ba fixed live tab + imports 2022-07-17 13:54:23 +03:00
gdlbo ead6860674 some dockbar fixes 2022-07-17 13:21:46 +03:00
gdlbo a87c34f1fd updated StandartFilter.txt 2022-07-17 11:37:18 +03:00
gdlbo 4e4813fd5c some dockbar fixes 2022-07-17 11:14:45 +03:00
gdlbo 58e728f26c added tgsbotkey check if not valid 2022-07-17 11:08:32 +03:00
gdlbo 35282945cc some dockbar fixes 2022-07-17 11:03:45 +03:00
gdlbo 18965af7d8 fixed saving settings 2022-07-17 10:56:04 +03:00
Vologhat a3987abf11 make shorter external player string in action menu 2022-07-17 08:42:17 +03:00
gdlbo 58ab5cf4cf some settings fixes 2022-07-17 00:18:22 +03:00
gdlbo 6f115d1766 some settings fixes 2022-07-16 23:42:10 +03:00
gdlbo 568a489993 dockbar fixes 2022-07-16 23:26:19 +03:00
gdlbo 2e50607a90 added disabler of OnlineFormatter 2022-07-16 23:02:38 +03:00
Vologhat 560321f4a3 fix #443 2022-07-16 18:07:54 +03:00
aliveoutside afc0173423 [musicdownloader] increase the audio quality 2022-07-16 20:01:25 +03:00
aliveoutside da5ac90189 [musicdownloader] fix previous commit 2022-07-16 19:43:16 +03:00
aliveoutside d8d435c994 [musicdownloader] show the download progress in notifications 2022-07-16 19:39:10 +03:00
Vologhat 0e225db32d dockbar editor fixes 2022-07-15 17:39:25 +03:00
gdlbo e06e5ac3a7 some hooks refactoring 2022-07-15 11:09:15 +03:00
aliveoutside a073314c28 fix vkx integration 2022-07-15 02:39:17 +03:00
gdlbo c643776790 Update CopyrightAds.txt 2022-07-14 23:00:00 +03:00
gdlbo a67f3cd11e fix getVoiceListened 2022-07-14 22:33:13 +03:00
gdlbo 04087259c3 fixed dialog style in tgs and PreferencesUtil 2022-07-14 22:12:23 +03:00
Vologhat 3f6177150d changed dockbar editor logic
- Changed data storage method
- Added json config check
- Some optimizations
2022-07-14 22:10:37 +03:00
gdlbo 3f339821f7 Update MsgMarkAsListenedJob.smali 2022-07-14 21:50:40 +03:00
gdlbo 9abef592fb getVoiceListened inj 2022-07-14 21:48:58 +03:00
gdlbo a561f05b32 Fixed vkx inj + some fixes 2022-07-14 21:15:29 +03:00
Vologhat a8c4f0d505 fix #416 2022-07-14 20:09:46 +03:00
Vologhat 93551d6b2d added base fragment with toolbar implementation 2022-07-14 20:09:20 +03:00
Vologhat 6ff176e5d4 added layout helper 2022-07-14 20:08:52 +03:00
gdlbo cdec126f54 miniapps hide feature 2022-07-14 19:27:53 +03:00
gdlbo 2885129531 hide friends recomm in friends 2022-07-14 18:27:10 +03:00
gdlbo f84a04356a android:debuggable="false" 2022-07-14 12:15:00 +03:00
gdlbo 621bc6aef7 Update build.gradle 2022-07-14 02:44:53 +03:00
gdlbo e4dfb30870 Update build.gradle 2022-07-14 02:36:36 +03:00
gdlbo 2b4da660c7 disabled force miui dark theme 2022-07-14 01:43:15 +03:00
gdlbo a870e09609 added check for android sdk 26 to get adaptive icon 2022-07-14 01:37:27 +03:00
gdlbo 32f3a11713 some codebase to future update with support no adaptive icons 2022-07-14 01:34:11 +03:00
gdlbo 104ae44b84 Update DockBarEditorFragment.java 2022-07-14 01:12:55 +03:00
gdlbo 17f8932ff4 Update build.gradle 2022-07-14 01:12:52 +03:00
gdlbo 0d4d820993 added splashscreen for < Android 12
pls check
2022-07-14 00:35:14 +03:00
gdlbo 878bf49dc4 added cleaning web cache for theme changing 2022-07-14 00:13:56 +03:00
gdlbo fe8ab52595 deleted some useless and dead vk features 2022-07-13 23:45:57 +03:00
gdlbo dd1a3774f8 disabled feature 2022-07-13 19:07:42 +03:00
gdlbo 7e1bd28d26 dnt inj 2022-07-13 19:03:44 +03:00
gdlbo 59593db4ec recomm disabler 2022-07-13 18:49:45 +03:00
gdlbo 6694739a4f fixed crash + added notifs about verif 2022-07-13 18:41:41 +03:00
gdlbo 4323802862 Update IconsFragment.java 2022-07-13 18:06:31 +03:00
Vologhat c2056853e0 Update IconsFragment.java 2022-07-13 17:57:48 +03:00
gdlbo d15a439477 icon manager test dead 2022-07-13 17:41:44 +03:00
gdlbo bb59cfa68a VideoDownloader fix 2022-07-13 17:26:29 +03:00
gdlbo 144b502c25 Update TokenConfirmationHandlerChainCall.smali 2022-07-13 15:29:07 +03:00
gdlbo b6c8992441 fix 2022-07-13 15:18:31 +03:00
gdlbo 7a5124a820 some connection fixes 2022-07-13 15:05:13 +03:00
Vologhat f5cac67d38 added vk video opening externally 2022-07-13 13:21:40 +03:00
Vologhat 5b38ea3b3f added external player redirection 2022-07-13 05:34:22 +03:00
Vologhat e6a687264b fixed toolbar visibility 2022-07-13 04:20:02 +03:00
gdlbo 6d16fbe260 codebase for future multiple list pref with appnames and icons 2022-07-13 01:28:15 +03:00
aliveoutside 047c6c94be [musicdownloader] hook track bottomsheet 2022-07-13 04:23:58 +03:00
gdlbo 41229fbab0 Update OtherFragment.java 2022-07-13 01:10:50 +03:00
gdlbo 8fb885a373 some backup fixes 2022-07-13 01:03:04 +03:00
gdlbo dc294ccef0 added some icons 2022-07-13 00:50:17 +03:00
Vologhat 24ef392b1c added restore prefs from file 2022-07-13 00:30:37 +03:00
Vologhat da1efc7261 optimizations 2022-07-12 23:58:00 +03:00
Vologhat c42245abf3 added vkme mode checker 2022-07-12 23:49:53 +03:00
Vologhat 76dc857a43 fixed dockbar counter 2022-07-12 23:14:51 +03:00
gdlbo df11c3b517 icons fix 2022-07-12 23:11:45 +03:00
Vologhat f6500096fa refactored icon switcher 2022-07-12 23:08:41 +03:00
gdlbo 792c0afe06 added all to manifest 2022-07-12 23:04:29 +03:00
gdlbo 11f7faa0ad some fixes 2022-07-12 22:45:14 +03:00
gdlbo 75f03ac207 icon changer test
appname cursed
2022-07-12 21:55:20 +03:00
gdlbo b1df22d207 added resources 2022-07-12 19:32:50 +03:00
gdlbo 47737a72f8 null check 2022-07-12 18:29:59 +03:00
gdlbo 0331bcfa7b network check 2022-07-12 18:27:35 +03:00
gdlbo 0928227fac some fragments in dockbar fixes 2022-07-12 17:42:46 +03:00
gdlbo 8fbc961f47 superapp disabler fix 2022-07-12 17:34:04 +03:00
gdlbo 1f667b4133 new vkpay lol 2022-07-12 17:25:02 +03:00
gdlbo 379d6aab8e some sticker fixes 2022-07-12 16:28:00 +03:00
gdlbo 82e164b351 some filter fixes 2022-07-12 16:15:11 +03:00
gdlbo f4ca06d27e added some effects) 2022-07-12 15:49:02 +03:00
gdlbo a1fe7bb5db some filters fix + added more filters codebase 2022-07-12 15:21:05 +03:00
aliveoutside f01d5efa92 use track id as a temp folder name 2022-07-12 17:37:08 +03:00
gdlbo 9d0e607c0b monochrome wp 2022-07-12 14:14:10 +03:00
gdlbo 413c58c936 mosaic effect 2022-07-12 13:46:04 +03:00
gdlbo c83b6e4c76 fixed crash 2022-07-12 12:42:09 +03:00
gdlbo c5d1e73dc6 some fragments fixes 2022-07-12 12:12:48 +03:00
gdlbo 35d8b6106d restart app when dark theme changed to amoled 2022-07-12 11:11:47 +03:00
gdlbo 6d9f0b9413 restart app when milkshake val changed 2022-07-12 11:00:18 +03:00
gdlbo 2d98e6c40b disabled force dark theme for miui 2022-07-12 10:58:17 +03:00
gdlbo 10a300b614 fixed milkshake changer 2022-07-12 00:00:54 +03:00
gdlbo 902d50cef4 Update DockBarManager.java 2022-07-11 23:21:48 +03:00
Vologhat c518ce4482 Update DockBarManager.java 2022-07-11 21:59:05 +03:00
gdlbo 4d719e4308 codesyle cringe 2022-07-11 21:14:02 +03:00
gdlbo 5bd52c23ae lmao 2022-07-11 21:11:17 +03:00
gdlbo 2755c93147 fix dockbar 2022-07-11 20:58:45 +03:00
aliveoutside 25c5182877 create notifications for music downloading 2022-07-11 23:02:10 +03:00
gdlbo 5af8cb9745 Update BottomNavigationMenu.smali 2022-07-11 20:00:53 +03:00
gdlbo 45ca60570c Update CopyrightAds.txt 2022-07-11 19:57:37 +03:00
Vologhat d65334086e refactored dockbar editor 2022-07-11 19:57:03 +03:00
gdlbo c2b3e3f88e Update WallpaperMenuFragment.java 2022-07-11 19:35:07 +03:00
gdlbo 7b3b939cc6 Update WallpaperMenuFragment.java 2022-07-11 19:34:28 +03:00
gdlbo 0995366ae2 added stickers background if wallpaper is not null 2022-07-11 19:28:48 +03:00
gdlbo 16be89be00 fix dark toast lmao 2022-07-11 19:17:23 +03:00
gdlbo 3bf1a8d398 fixed dialog style 2022-07-11 19:11:51 +03:00
gdlbo 1e876a9217 fixed auth proxy dialog 2022-07-11 17:56:03 +03:00
aliveoutside 2d21a85259 check if ffmpeg converted successfully 2022-07-11 20:14:34 +03:00
aliveoutside 87ef92eff8 finish music downloader 2022-07-11 19:55:04 +03:00
aliveoutside 0e16bbf4f5 fix ts to mp3 converter 2022-07-11 19:26:05 +03:00
aliveoutside edb79e3d7d update ffmpeg libs for mp3 support 2022-07-11 19:25:41 +03:00
aliveoutside 1c6ba006b5 fix ffmpeg loading 2022-07-11 18:07:22 +03:00
gdlbo 6350dbc397 dialog design fixes 2022-07-11 14:36:22 +03:00
gdlbo 827ab9f82d disabled dockbar hook 2022-07-11 13:30:02 +03:00
gdlbo 587e729bdc added dev ver mark 2022-07-11 13:18:32 +03:00
gdlbo 851265e14a Update Globals.java 2022-07-11 13:13:17 +03:00
gdlbo b553ef1c75 fixed player on gappless phones 2022-07-11 13:08:37 +03:00
gdlbo 5570f8be88 added proxy button at start 2022-07-11 13:02:31 +03:00
gdlbo 775f4f12fe writebar coloring 2022-07-11 11:26:05 +03:00
gdlbo 1410aaf7ef Some animation fixes 2022-07-11 02:58:43 +03:00
gdlbo b85aece87b some wp fixes 2022-07-11 02:20:19 +03:00
gdlbo 4caf2f1e6e fixed some cringe blur 2022-07-11 01:38:22 +03:00
gdlbo 60eb78c27f Wallpaper in msg
Upgraded dialogs opening
2022-07-11 01:29:55 +03:00
aliveoutside 701edfa823 try to do ffmpeg convert 2022-07-11 01:34:28 +03:00
aliveoutside e234f3bce4 add some missing classes 2022-07-11 01:34:28 +03:00
aliveoutside f80241b5c0 add some missing classes 2022-07-11 01:34:27 +03:00
aliveoutside 9adc74ff46 update build.gradle 2022-07-11 01:34:27 +03:00
aliveoutside fbc4d054b0 add ffmpeg wrapper 2022-07-11 01:34:27 +03:00
aliveoutside 3676e1f568 add ffmpeg lib 2022-07-11 01:34:27 +03:00
aliveoutside 88832da5ea add libs to assets 2022-07-11 01:34:27 +03:00
gdlbo 2175dad72f Update GroupApiParser.smali 2022-07-10 19:16:43 +03:00
aliveoutside 7c45258976 fix permissions in AudioDownloader 2022-07-10 22:08:58 +03:00
gdlbo 01e1ccb4bf Renames for profiles and groups 2022-07-10 19:01:25 +03:00
gdlbo 966312373e Fix 2022-07-10 17:49:59 +03:00
gdlbo b1b06f480b menu inj test 2022-07-10 17:48:39 +03:00
Vologhat ea1252c07c add method check 2022-07-10 17:31:09 +03:00
Vologhat 871695731c added asyns downloading 2022-07-10 16:37:31 +03:00
gdlbo b7e1326489 Update vt_ui_oled.css 2022-07-10 16:03:42 +03:00
gdlbo d02ae1e212 amoled theme wtf 2022-07-10 16:01:04 +03:00
aliveoutside 6af700e187 test m3u8 downloader 2022-07-10 18:32:02 +03:00
gdlbo 01f0175467 fixed crash at start 2022-07-10 15:25:19 +03:00
gdlbo 86d85aec3c updated jars + added amoled theme values to code 2022-07-10 14:52:23 +03:00
aliveoutside c2001c24f6 move some stuff to music package 2022-07-10 17:35:10 +03:00
gdlbo 7726ad974c reformated code 2022-07-10 14:32:27 +03:00
Vologhat 1f859997f4 M3U8 Dumper 2022-07-10 14:11:27 +03:00
gdlbo 1c20fd4c19 Some online fixes 2022-07-10 10:54:25 +03:00
gdlbo bdee61948d Update OnlineFormatter.java 2022-07-10 04:05:03 +03:00
gdlbo 6c903dcd20 Update OnlineFormatter.java 2022-07-10 03:21:35 +03:00
gdlbo dd5cf0eace added appid saving + some fixes 2022-07-10 01:38:14 +03:00
aliveoutside c713d9a59b - Дашь списать домашку?
- Да, только не списывай точь-в-точь
-
2022-07-10 04:14:55 +03:00
gdlbo 2029447d86 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-07-10 01:08:41 +03:00
aliveoutside 81f225be5b m3u8 shit 2022-07-10 04:07:02 +03:00
gdlbo 6258e524d9 imports 2022-07-10 01:08:19 +03:00
gdlbo cf3ecaa325 Added local caching appid names 2022-07-10 01:07:55 +03:00
gdlbo 9c9afa9925 VideoDownloader inj 2022-07-09 22:40:56 +03:00
gdlbo 9ee1357b53 Fixed bug with reload mgs on old design on sdk 28+ 2022-07-09 22:18:28 +03:00
gdlbo cf376364ba Update StoryDownloader.java 2022-07-09 22:03:20 +03:00
gdlbo 0fa5a97661 Stories video downloader 2022-07-09 21:59:42 +03:00
gdlbo a3c7b2a6fb some stories download fixes 2022-07-09 21:24:35 +03:00
gdlbo a1cc6c5adf disabled fixGapps 2022-07-09 20:47:18 +03:00
gdlbo 86051d3b01 isMusicRestricted must be true by default 2022-07-09 20:26:49 +03:00
gdlbo 28e5bbf2de Update VideoDownloader.java 2022-07-09 20:22:38 +03:00
gdlbo 9373375a95 Update VideoDownloader.java 2022-07-09 20:19:05 +03:00
gdlbo 295f37b9f5 check if link is not valid 2022-07-09 20:18:31 +03:00
gdlbo 06c526ef74 Video downloader in settings 2022-07-09 20:09:02 +03:00
gdlbo d4f737167d updated jars 2022-07-09 19:48:22 +03:00
gdlbo 8c3be43f25 renamed music to media settings + some settings refactoring 2022-07-09 19:48:06 +03:00
gdlbo 880487f841 Update Newsfeed.java 2022-07-09 19:31:11 +03:00
gdlbo 2d73e10bbf Some settings logic fixes 2022-07-09 18:47:32 +03:00
gdlbo 6a37a8e9e4 fixed poll if 2022-07-09 16:03:28 +03:00
gdlbo 4868e506f3 show poll results 2022-07-09 15:58:38 +03:00
gdlbo db9721e96a updated jars 2022-07-09 15:58:18 +03:00
gdlbo 34c560e105 fix msg db 2022-07-09 15:26:37 +03:00
gdlbo c65f20f8bb Story downloader test
video download dead xd
2022-07-09 15:13:13 +03:00
gdlbo 0fefcafba8 updated jars 2022-07-09 15:12:45 +03:00
gdlbo 730e61836f Update NavigationDelegateBottom.smali 2022-07-08 14:29:07 +03:00
gdlbo f212fdcae8 VK Me mode inject 2022-07-08 14:10:27 +03:00
gdlbo 9acffafda0 kostil for dockbak lol 2022-07-08 13:58:26 +03:00
gdlbo 1a62889cb9 inj dockbar 2022-07-08 13:36:25 +03:00
gdlbo 4ff5ea9fec Fixed feed cache toggle 2022-07-08 11:03:15 +03:00
gdlbo 77bc356f4b Video redesign optional 2022-07-08 11:00:03 +03:00
gdlbo be5633f29c Update Toggles.java 2022-07-08 10:55:08 +03:00
gdlbo 1bf6c00e4c VTSettings fixes
fixed design
fixed proxy type null
2022-07-08 10:49:12 +03:00
gdlbo 9cc5eab93d Update DockBarManager.java 2022-07-08 10:35:26 +03:00
gdlbo 39bd57b3f6 Update DockBarManager.java 2022-07-08 10:31:35 +03:00
gdlbo a50452fb58 Update DockBarManager.java 2022-07-07 21:38:42 +03:00
gdlbo 63229b42c1 Fixed dockbar color?, fixed double vt icons 2022-07-07 20:37:49 +03:00
gdlbo 8e5f3ec3b6 fixed R.java.......... 2022-07-07 20:14:37 +03:00
gdlbo 61a4ef17a4 Revert "Update public.xml"
This reverts commit 0a3b6f5bc0.
2022-07-07 19:48:48 +03:00
gdlbo 4498d231ad IconManager manifest inject 2022-07-07 19:18:02 +03:00
gdlbo eb659dd453 Fixed AndroidManifest 2022-07-07 19:12:31 +03:00
Vologhat 7aa3205c79 Update R.java 2022-07-07 19:02:00 +03:00
gdlbo 3a49e3ba01 Update IconManager.java
fixed logic
2022-07-07 16:41:58 +03:00
gdlbo cb07a9c8dd Update IconManager.java 2022-07-07 16:40:40 +03:00
gdlbo bd8a20e64c Update IconManager.java 2022-07-07 16:33:14 +03:00
gdlbo dcb0471d33 Update IconManager.java 2022-07-07 16:30:24 +03:00
gdlbo 49c1ca45c8 IconManager codebase 2022-07-07 16:26:19 +03:00
aliveoutside e2ca160507 hook dockbar 2022-07-07 16:37:26 +03:00
gdlbo 0a3b6f5bc0 Update public.xml 2022-07-07 13:16:36 +03:00
gdlbo 2391174a0a Update R.java 2022-07-07 11:51:39 +03:00
gdlbo 1ddaa8d162 fix download icon for tgs 2022-07-07 11:39:29 +03:00
aliveoutside 54e5930e8d telegram stickers doesn't look like shit now 2022-07-07 04:58:27 +03:00
gdlbo dad839ca56 tgs inj 2022-07-06 18:07:49 +03:00
Vologhat 8d60831e65 fixed crashes in StickersFragment 2022-07-06 17:39:39 +03:00
gdlbo 837a888b37 some music fixes 2022-07-06 11:40:02 +03:00
gdlbo 39dae8f8e8 Update VTSettings.java 2022-07-06 10:04:57 +03:00
gdlbo 90761b1599 updated superapp in settings 2022-07-06 09:58:04 +03:00
Vologhat 75394d2239 fixed superapp injector 2022-07-05 20:51:02 +03:00
Vologhat bf3dab1585 fixed profile hiding 2022-07-05 20:43:20 +03:00
Vologhat f224645c9c optimizations 2022-07-05 20:11:06 +03:00
gdlbo 36a9d621b4 Update ProfileHide.java 2022-07-05 16:28:17 +03:00
gdlbo f1c2d2c95a profile hide inj test
profiles dead lmao
2022-07-05 16:25:01 +03:00
gdlbo b71581d48a Update JsonInjectors.java 2022-07-05 15:11:24 +03:00
gdlbo 81e85fba7e Update JsonInjectors.java 2022-07-05 15:00:31 +03:00
gdlbo ed6244919d upgraded convBar ext + added debug link 2022-07-05 14:51:44 +03:00
gdlbo 782ff2bb66 Update Proxy.java 2022-07-05 13:11:24 +03:00
gdlbo 2a02efec0d Update Proxy.java 2022-07-05 13:07:32 +03:00
gdlbo a74c48d8d0 proxy fixes 2022-07-05 13:02:24 +03:00
gdlbo 5054dbdc7d Some settings + proxy fixes 2022-07-03 14:11:33 +03:00
gdlbo 0db27e1690 Fix proxy summ for vt settings 2022-07-03 13:39:22 +03:00
gdlbo 93937be836 Fix crash for android 5, 5.1, 6 + added cute icon for superapp editor 2022-07-03 13:33:27 +03:00
gdlbo 2649b21ac7 fixed scaling pic 2022-07-02 14:00:54 +03:00
gdlbo d83dc9370d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-07-02 12:55:27 +03:00
gdlbo c3bae00331 fixed rounding pic 2022-07-02 12:55:17 +03:00
gdlbo 13b5ad11a8 Merge pull request #410 from k1zn/vtl-remaster 2022-07-02 08:19:27 +03:00
k1zn bf90cbd9ee Fix Russian music subscription string 2022-07-02 02:00:06 +05:00
k1zn ac25b978e3 Fix Ukrainian music subscription string 2022-07-02 01:59:30 +05:00
gdlbo 6549c3e51a music subs warning 2022-07-01 15:41:35 +03:00
gdlbo aa301b007c deleted useless feature 2022-07-01 15:37:59 +03:00
gdlbo d17663bb6e fixed loopedanimstickers pref 2022-07-01 14:55:31 +03:00
gdlbo 49ae2bdbe3 Loop anim stickers test 2022-07-01 14:45:05 +03:00
gdlbo f2bc513869 added more font sizes 2022-07-01 14:29:52 +03:00
gdlbo 6abc2e4cf9 Fixes
Deleted unused code
Fixed some settings
Sorted toggles features
2022-07-01 14:24:16 +03:00
Vologhat 0fba48dd73 added backup settings in test mode 2022-06-30 19:47:11 +03:00
gdlbo 9fa484d378 fixed some toggles 2022-06-30 17:55:09 +03:00
gdlbo 697189a2b9 superapp editor test 2022-06-30 17:40:20 +03:00
gdlbo b39493bd3d Update JsonInjectors.java 2022-06-30 14:33:05 +03:00
Vologhat 44e1f1b265 fixed fox1d code 2022-06-30 14:20:31 +03:00
aliveoutside e73855a830 fix ne4italki popup menu 2022-06-30 01:59:33 +03:00
aliveoutside 4e50cf3f8d yes milkshake 2022-06-30 01:44:28 +03:00
gdlbo 7869a3163f startfragment inj 2022-06-29 20:31:31 +03:00
gdlbo 036e9939c7 Update SuperAppPresenter.smali 2022-06-29 20:29:27 +03:00
gdlbo b743f64b3e superapp inj
without superapp editor
2022-06-29 20:20:49 +03:00
gdlbo 0f40f58801 no shopping v2 2022-06-29 18:49:15 +03:00
gdlbo f52a20aa1a no shopping anymore in stock menu 2022-06-29 18:03:02 +03:00
gdlbo 158ca27531 Fixed crash in interface sett 2022-06-29 17:56:32 +03:00
gdlbo e48ed3aac6 fixed translation 2022-06-29 17:46:33 +03:00
gdlbo 733ed9daf0 More animations :) 2022-06-29 17:42:51 +03:00
gdlbo f15ea0ee00 Test fix anim crash in My Stickers 2022-06-29 17:41:29 +03:00
gdlbo e95bd7e3c1 anim inj 2022-06-29 17:08:51 +03:00
gdlbo af667093ef fixed imports 2022-06-29 16:49:15 +03:00
gdlbo 5b3c8fd9da fix 2022-06-29 16:40:44 +03:00
gdlbo cc76d48f00 deleted some unused code 2022-06-29 16:08:29 +03:00
gdlbo 994cfa9f21 do not seen stories inj 2022-06-29 16:03:17 +03:00
gdlbo cee15d5ebb showmenu inj 2022-06-29 15:46:25 +03:00
gdlbo 6fe72ebb9f disable videofeed inj 2022-06-29 15:39:50 +03:00
gdlbo a4cc33d3ce milkshake disabled by default + disabled welcome banner on milkshake 2022-06-29 15:29:13 +03:00
gdlbo 7eeb1c3bf2 fixed msgs 2022-06-29 13:49:43 +03:00
gdlbo ca49a100fa Maybe fix msg 2022-06-29 13:28:22 +03:00
gdlbo fd41df894f Update StandartFilter.txt 2022-06-29 12:02:39 +03:00
gdlbo 82b85e6bfd Refactored reposts adblock + updated filter 2022-06-29 11:53:24 +03:00
gdlbo b154e4c5f0 updated filters 2022-06-29 11:47:44 +03:00
gdlbo 03112dd9f7 some important fixes 2022-06-29 01:21:05 +03:00
aliveoutside ef51d5d2b9 update apktool 2022-06-28 19:57:25 +03:00
aliveoutside 58577e74f7 inject ne4italki into dialog menu 2022-06-28 19:57:25 +03:00
gdlbo 54aac33525 Updated Toggles 2022-06-28 01:27:44 +03:00
gdlbo b27cef0d1b Update Toggles.java 2022-06-28 01:05:45 +03:00
gdlbo 5dfc3b4f02 fixed crash in music + added disabler milkshake 2022-06-27 23:55:57 +03:00
aliveoutside 5acf70169c ne4italki 2022-06-27 20:54:04 +03:00
gdlbo 0e388f5888 toggles redirect 2022-06-27 19:45:51 +03:00
gdlbo 2a5c5cb24f ServerDialog disabler 2022-06-27 18:40:11 +03:00
gdlbo 58ec32be6f covbar inj test 2 2022-06-27 17:58:30 +03:00
gdlbo 21fb5fc48b covbar inj test 2022-06-27 16:47:41 +03:00
gdlbo d6fcafe8e0 fixed adfilter 2022-06-27 15:26:37 +03:00
gdlbo 95ade723f9 upgraded newsfeed ad posts detection
added support for reposts
refactored copyright posts detection
updated adblock filters
2022-06-27 15:15:42 +03:00
gdlbo de31594250 Update build.yml 2022-06-26 20:55:30 +03:00
gdlbo 0ff208c2f9 Messages -> Chats 2022-06-26 20:50:36 +03:00
gdlbo 92c69e3d97 Merge pull request #392 from iNotFlying/vtl-remaster 2022-06-26 17:49:40 +03:00
iNotFlying c065eaac6b Telegram icon fix 2022-06-26 18:47:55 +04:00
gdlbo fed9d76bcb Update FriendsGetRecommendationsWithMutual.smali 2022-06-26 17:04:33 +03:00
gdlbo fdb9819ca9 Merge pull request #391 from iNotFlying/vtl-remaster 2022-06-26 16:40:12 +03:00
iNotFlying 90b773dd52 New icons 2022-06-26 16:35:03 +04:00
gdlbo 206ffd17c8 Update OnlineFormatter.java 2022-06-25 20:29:41 +03:00
gdlbo 5363378ea1 Update OnlineFormatter.java 2022-06-25 20:27:02 +03:00
gdlbo bee1e760b8 Update OnlineFormatter.java 2022-06-25 20:15:28 +03:00
gdlbo 996760489f updated Online Formatter 2022-06-25 20:13:58 +03:00
gdlbo 65af8e24c1 Custom online detection
need to do make requests to get appid name from vk
2022-06-25 19:39:34 +03:00
gdlbo d59ef7ddfe ServerDialog upgraded 2022-06-25 15:36:44 +03:00
gdlbo 9ab654b290 ServerDialog upgraded 2022-06-25 15:36:10 +03:00
gdlbo 7217e75a15 ServerDialog null check 2022-06-25 14:50:12 +03:00
gdlbo ae4847d056 ServerDialog impl 2022-06-25 14:41:42 +03:00
gdlbo 88b882c74d fixed verifications 2022-06-25 12:39:17 +03:00
gdlbo 7b12cb9922 fixed number rounding in groups 2022-06-25 12:28:12 +03:00
gdlbo 06a6d6e575 fixed number rounding in groups 2022-06-25 12:24:31 +03:00
gdlbo 20f043885a fixed crash 2022-06-25 12:13:18 +03:00
gdlbo 7ff5d24d10 fixes of music and debug 2022-06-25 12:05:22 +03:00
gdlbo 70059b25d8 fixes of music and debug 2022-06-25 12:05:15 +03:00
gdlbo a7f23c7b72 fixed crashreport icon 2022-06-25 12:01:26 +03:00
gdlbo c056add894 added install permission 2022-06-25 11:57:57 +03:00
gdlbo fbca333163 fixed ota requests 2022-06-25 11:55:56 +03:00
gdlbo 52b153ba82 deleted benchmark tracker + fixes 2022-06-25 11:46:05 +03:00
gdlbo 6b9bc3cdd9 deleted music tracker 2022-06-25 11:33:37 +03:00
gdlbo c6647ff807 fixed profile open 2022-06-25 11:11:34 +03:00
gdlbo b4c2d075ab fixed libvoip lib 2022-06-25 11:00:11 +03:00
gdlbo 4835485085 fixes of LinkProcessorKt 2022-06-25 10:52:05 +03:00
gdlbo 937b01e55b added some redirects to settings 2022-06-25 10:30:56 +03:00
gdlbo 3630b44d38 added support to open links from m.vk.com 2022-06-25 09:23:01 +03:00
gdlbo 086b07ace9 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-25 09:19:06 +03:00
gdlbo 1efdad97eb gmap fix + added needed activities and services 2022-06-25 09:18:56 +03:00
gdlbo 4bd2b31e1d gmap fix 2022-06-25 09:11:33 +03:00
aliveoutside 97cd94de4a vkx integration 2022-06-25 04:05:11 +03:00
gdlbo 820b9fd969 newsfeed filter inj to NewsfeedCustomGet 2022-06-25 01:06:00 +03:00
gdlbo a64f4d1377 stories ads inj 2022-06-25 00:30:01 +03:00
gdlbo 15e9b5c712 awayphp inj 2022-06-25 00:28:08 +03:00
gdlbo c8302d6024 added donate button 2022-06-25 00:22:15 +03:00
gdlbo cc98e5bdb8 inj refresh newsfeed 2022-06-24 23:44:39 +03:00
gdlbo 9f07840030 swipe stories inj 2022-06-24 23:41:28 +03:00
gdlbo 534bd61c3a dockcounter inj 2022-06-24 23:41:13 +03:00
gdlbo e68847ca77 alteremoji inj 2022-06-24 23:33:31 +03:00
gdlbo 8a91ccd47e system emoji inj 2022-06-24 23:26:06 +03:00
aliveoutside e082511d59 fix init 2022-06-24 23:21:45 +03:00
gdlbo 146d4d42e8 fixed some settings logic for stupid users 2022-06-24 23:20:43 +03:00
gdlbo d364b2c87a added date formatter + deleted some unused code 2022-06-24 23:14:51 +03:00
gdlbo 257b2e33f2 chat count load inj + fixes 2022-06-24 22:54:56 +03:00
gdlbo b6afe6f5db date formatter in chats 2022-06-24 22:53:28 +03:00
gdlbo d6959cd074 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-24 22:37:47 +03:00
gdlbo 96f752c6ac value rounding 2022-06-24 22:37:40 +03:00
aliveoutside f8fa4b6c67 hooked stories disabler 2022-06-24 22:13:48 +03:00
gdlbo db7a94a10c shortpost 2022-06-24 22:07:18 +03:00
gdlbo 6aa9eef8ea fixed dialogs load 2022-06-24 20:27:43 +03:00
gdlbo dac5053eb5 upped vk ver 2022-06-24 20:02:23 +03:00
gdlbo c0a3a6c54f getDrawableFromUrl fix 2022-06-24 19:41:08 +03:00
gdlbo b2a34380b6 fix summ in feed 2022-06-24 13:31:16 +03:00
gdlbo 1237a9f8ac added filter for copyright links 2022-06-24 13:27:59 +03:00
aliveoutside 0a6d00b4ab Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-24 13:03:11 +03:00
gdlbo 27c8a1575f added filter for copyright links 2022-06-24 11:54:35 +03:00
gdlbo f7a137537c fixed ads in discover 2022-06-24 11:43:38 +03:00
gdlbo 8953ee1f7f added app version to about 2022-06-24 10:49:25 +03:00
gdlbo 8da5f35c33 renamed some strings 2022-06-24 10:39:31 +03:00
gdlbo 0bc2d2b896 added proxied static and oauth + refactored by copilot 2022-06-24 10:37:49 +03:00
gdlbo 3167dfab09 vk api proxy inj 2022-06-24 09:38:57 +03:00
gdlbo 6c1130aed2 voice inject 2022-06-24 09:31:29 +03:00
gdlbo bded70f6c6 pic compress inject 2022-06-24 09:27:27 +03:00
gdlbo 097a6feeb7 pic compress inject 2022-06-24 09:27:18 +03:00
aliveoutside bd2d49de85 implement messages undeleter (via reflection for now) 2022-06-24 03:56:12 +03:00
gdlbo 4dd43961d4 changed codestyle 2022-06-23 17:31:32 +03:00
gdlbo 9c968d1f4f added reload msg feature 2022-06-23 00:56:32 +03:00
gdlbo 261592a6b3 added multiacc + updated jars 2022-06-23 00:19:57 +03:00
gdlbo a5b45c318d fixed ru locale 2022-06-22 23:27:42 +03:00
gdlbo d50f42a8b0 fixed ssl by default 2022-06-22 23:22:14 +03:00
gdlbo 1ec2e1dd4b fixed some settings 2022-06-22 23:21:02 +03:00
gdlbo 62bd5588e3 ru locale 2022-06-22 23:20:32 +03:00
gdlbo 1c6fd7050d fixed auto detect theme + fixes of debug 2022-06-22 23:09:05 +03:00
gdlbo 94a5ddcc5f fixed workflow compiling 2022-06-22 23:00:55 +03:00
gdlbo 5b756b0c7a fixed windows compiling 2022-06-22 23:00:26 +03:00
gdlbo d940bb63d6 fixed proxy tab 2022-06-22 22:59:33 +03:00
gdlbo 4610626cc7 fixed auth + added old prefs to debug 2022-06-22 22:52:28 +03:00
gdlbo 09704a2f0f updated jars 2022-06-22 20:44:08 +03:00
gdlbo bce4952254 updated themes and disabled auto theme (dead) 2022-06-22 20:43:57 +03:00
gdlbo 4b7fb82710 fixes themes 2022-06-22 19:34:20 +03:00
gdlbo acb06b6953 fixed cringe logs 2022-06-22 19:16:13 +03:00
gdlbo c11bee25d1 added vkui inj + upgraded vkui coloring and theme changing 2022-06-22 18:55:45 +03:00
gdlbo 7543021cff fixed opening vk id and bugtracker 2022-06-22 18:33:00 +03:00
aliveoutside 019c29bfae fix crashing tgstickers fragment 2022-06-22 18:12:17 +03:00
gdlbo 1c7e010aa2 fixed icons 2022-06-22 18:04:46 +03:00
gdlbo a7c9b7dd58 added new params 2022-06-22 17:58:57 +03:00
gdlbo 8e0ff61597 added old icons 2022-06-22 17:56:34 +03:00
aliveoutside 8d5cc68a87 update icons in settings 2022-06-22 17:29:51 +03:00
gdlbo 3e765ba22c fixed FriendsGetRecommendationsWithMutual.smali 2022-06-22 16:49:13 +03:00
gdlbo bea91dd654 newsfeed inj 2022-06-22 16:43:18 +03:00
gdlbo d14f9a7a4d added offline and news injector 2022-06-22 16:41:41 +03:00
gdlbo 8694d39dcb fixed auto cleaning cache 2022-06-22 14:51:22 +03:00
gdlbo 7c808f608f fixed settings opening 2022-06-22 14:47:26 +03:00
gdlbo 42856485fc verifications 2022-06-22 14:21:52 +03:00
gdlbo 76e768dda8 navbar coloring (s0v@ killer tbh) 2022-06-22 12:37:44 +03:00
gdlbo 59d243bb5b deleted video/msg reporter 2022-06-22 12:14:22 +03:00
gdlbo 3a6cd04a84 fix network 2022-06-22 12:08:56 +03:00
gdlbo 4b0bc25e0b deleted vk ui analytics and anr 2022-06-22 11:52:38 +03:00
gdlbo 2ef6206599 deleted app start duration checker 2022-06-22 11:41:29 +03:00
gdlbo e092da882c deleted vk analytics reporter 2022-06-22 11:35:00 +03:00
gdlbo 9c10b06390 deleted my tracker 2022-06-22 11:29:40 +03:00
gdlbo 65208fba3c Deleted crashlytics 2022-06-22 11:17:00 +03:00
gdlbo 36d13cdd72 fixed strings compiling 2022-06-22 10:25:27 +03:00
gdlbo f9c3484c0e Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-22 10:21:33 +03:00
gdlbo f8e22cbfbc inited new version + app name 2022-06-22 10:21:17 +03:00
aliveoutside 5da7f8e2f4 add settings 2022-06-22 04:58:42 +03:00
gdlbo c7bfc871c1 added Toggles.java with hook 2022-06-22 01:23:00 +03:00
aliveoutside fd26567990 fix not loading messages 2022-06-22 04:06:51 +03:00
aliveoutside d27e304136 update jars 2022-06-22 03:55:21 +03:00
aliveoutside 7f91075a92 hide DeletedMessagesHandler for now 2022-06-22 03:54:57 +03:00
aliveoutside 4436c1d9f1 update buildscripts 2022-06-22 03:54:34 +03:00
aliveoutside 69822b4071 fix ModalBottomSheetWrapper 2022-06-22 03:44:08 +03:00
gdlbo 91117a5dea added Toggles.java with hook 2022-06-22 00:42:42 +03:00
gdlbo 2a1b799f7e fix Toggles.java 2022-06-22 00:17:14 +03:00
gdlbo 119d759105 added Toggles.java 2022-06-22 00:13:13 +03:00
aliveoutside b94462fdf0 fix galo4ki 2022-06-22 02:07:39 +03:00
aliveoutside 2820a132d8 fix OTAHelper 2022-06-22 02:07:39 +03:00
gdlbo 46625fdecc fixed imports and Themes.java 2022-06-21 23:05:33 +03:00
Vologhat 3ec0cfad4d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:55:08 +03:00
aliveoutside 6e08ec86ae fix DeletedMessagesHandler 2022-06-22 01:52:15 +03:00
Vologhat 125abe9e36 extended ReflectionUtils 2022-06-21 22:54:44 +03:00
gdlbo eaf94aa97f Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:38:15 +03:00
aliveoutside 8a0c0f61f5 fix DockBarFragment 2022-06-22 01:31:01 +03:00
aliveoutside a49efd7403 fix otadownloader 2022-06-22 01:24:48 +03:00
aliveoutside 6196b828c3 fix net/request 2022-06-22 01:18:00 +03:00
aliveoutside 7a5421706e fix ExternalLinkHandler 2022-06-22 01:13:58 +03:00
gdlbo 43f62669e9 debuggable true 2022-06-21 22:36:49 +03:00
gdlbo f1d77a639c fixed setup with official vk 2022-06-21 22:36:18 +03:00
gdlbo b2e6f55487 Merge branch 'vtl-remaster' of https://github.com/vtosters/lite into vtl-remaster 2022-06-21 20:40:46 +03:00
aliveoutside c6b520fb65 fix dnr and dnt 2022-06-21 23:39:00 +03:00
aliveoutside e5d5447957 remove okhttp request 2022-06-21 23:39:00 +03:00
aliveoutside 3048b098b5 fix foaf 2022-06-21 23:39:00 +03:00
gdlbo b71430f135 fixes refl theme 2022-06-21 20:40:29 +03:00
gdlbo 20bae023d9 fixes refl theme 2022-06-21 20:38:10 +03:00
aliveoutside 9fd973c496 fix materialfragment is settings 2022-06-21 23:14:56 +03:00
aliveoutside 97ed8000b8 add activity to manifest 2022-06-21 23:14:56 +03:00
aliveoutside c7f18e434f fix materialfragment 2022-06-21 23:14:56 +03:00
gdlbo 6d5b9dd188 Update R.java 2022-06-21 20:14:42 +03:00
aliveoutside af59a13dd9 update jars 2022-06-21 23:00:13 +03:00
aliveoutside 771ac02c77 Revert "fixes private/public"
This reverts commit c49e985013.
2022-06-21 22:51:21 +03:00
aliveoutside 925065b317 dev mode 2022-06-21 22:37:24 +03:00
aliveoutside 2893050504 ssl 2022-06-21 22:28:30 +03:00
gdlbo 849a48597c Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 19:16:12 +03:00
aliveoutside ab85d0b03a enable music 2022-06-21 22:13:58 +03:00
aliveoutside 7ce2dd95e2 disable calls 2022-06-21 22:13:57 +03:00
gdlbo 07032c21db fixes analytics 2022-06-21 19:16:07 +03:00
gdlbo 9cb56466c8 fixes private/public 2022-06-21 19:11:41 +03:00
gdlbo c49e985013 fixes private/public 2022-06-21 19:08:51 +03:00
aliveoutside fbd3f1798a Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-21 22:01:12 +03:00
aliveoutside 66a53f3486 спустя два дня пофиксили 2022-06-21 21:58:55 +03:00
aliveoutside 45acdecedc Revert "deobf"
This reverts commit 755268de
2022-06-20 00:31:48 +03:00
aliveoutside ec105f2b55 partially ifx 2022-06-20 00:19:11 +03:00
gdlbo 858c5b9342 fixes 2022-06-19 23:37:59 +03:00
gdlbo b548f6adf3 fixes 2022-06-19 20:44:33 +03:00
gdlbo 719147997c fixes 2022-06-19 20:13:27 +03:00
gdlbo 9489ddad5e added new fonts 2022-06-19 20:13:18 +03:00
gdlbo f479c36fcd fix 2022-06-19 19:28:04 +03:00
gdlbo 9a925e7100 fix 2022-06-19 19:17:30 +03:00
gdlbo 7e7f091ab5 fixes 2022-06-19 15:32:24 +03:00
aliveoutside 8aa6c41037 update r.java 2022-06-19 18:21:48 +03:00
gdlbo f30994b82e fixes 2022-06-19 14:52:27 +03:00
gdlbo 873b83cb31 fixes 2022-06-19 14:38:22 +03:00
aliveoutside 4a04f50f98 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 17:17:50 +03:00
aliveoutside ff31cb0377 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 17:01:32 +03:00
aliveoutside 8c16e3dc42 fix preferences 2022-06-19 16:57:53 +03:00
aliveoutside 799d06dd10 fix preferences 2022-06-19 16:54:07 +03:00
gdlbo 985a2b30c6 fixes 2022-06-19 14:17:37 +03:00
gdlbo 66a8c909ee Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 14:01:28 +03:00
gdlbo 6439021fc2 fixes 2022-06-19 14:01:24 +03:00
gdlbo 0a09423e10 fixed all res 2022-06-19 13:11:07 +03:00
gdlbo 119ae933e2 added resources + fixed animfrag 2022-06-19 12:47:35 +03:00
aliveoutside 1fd27c5acf add assests 2022-06-19 07:05:35 +03:00
aliveoutside e3f338c91f update jars 2022-06-19 07:03:08 +03:00
aliveoutside 39723bcf5b remove multiacc (it's already in the client) 2022-06-19 07:02:55 +03:00
aliveoutside d570a77bd5 fix StickersPreferencesFragment 2022-06-19 06:59:52 +03:00
aliveoutside 7b1fcfb15a fix DeletedMessagesHandler 2022-06-19 06:52:32 +03:00
aliveoutside 17ba841440 add update jars script 2022-06-19 06:49:32 +03:00
aliveoutside 6ea830cbc7 fix verifications 2022-06-19 05:57:58 +03:00
aliveoutside 179b1769ae fix vkx 2022-06-19 05:53:17 +03:00
aliveoutside 3cae6da5d7 fix settings 2022-06-19 05:49:10 +03:00
aliveoutside b1ce420393 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 05:44:34 +03:00
aliveoutside a8d1bdc8a8 Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 05:30:56 +03:00
aliveoutside f9d0d239b8 fix messages settings 2022-06-19 05:03:00 +03:00
aliveoutside 877153a998 fix 2022-06-19 04:54:56 +03:00
aliveoutside 35c7c4c08d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 04:48:03 +03:00
aliveoutside e3340a76db fix video downloader 2022-06-19 04:42:43 +03:00
aliveoutside 94cef1b5f8 deobf 2022-06-19 04:32:02 +03:00
gdlbo ecc224776e fixes 2022-06-19 02:44:29 +03:00
gdlbo 7deb1bba58 fixes 2022-06-19 02:13:23 +03:00
gdlbo 7ff965c73d Merge remote-tracking branch 'origin/vtl-remaster' into vtl-remaster 2022-06-19 02:06:52 +03:00
gdlbo 9cc136bfda fixes 2022-06-19 02:06:47 +03:00
gdlbo 8ef0aeef13 fixes 2022-06-19 01:47:55 +03:00
gdlbo d906c1103b fixes 2022-06-19 00:27:34 +03:00
gdlbo 7bfdc6255c dev mode 2022-06-18 23:52:54 +03:00
gdlbo c5162a05aa music + ssl v2 2022-06-18 23:29:48 +03:00
gdlbo d5353a87dc ssl + debug check 2022-06-18 23:29:05 +03:00
aliveoutside 3072531c24 rename 2022-06-18 23:01:03 +03:00
aliveoutside d87ff342d4 disable calls 2022-06-18 20:04:41 +03:00
aliveoutside 3266b8ccd6 fix music 2022-06-18 20:01:17 +03:00
aliveoutside 03cc03b6bf fix buildscripts 2022-06-18 20:01:07 +03:00
aliveoutside 2df8cc5f2a add new files 2022-06-18 19:27:15 +03:00
aliveoutside 8fd7116759 init new ver 2022-06-18 19:12:50 +03:00
gdlbo bd4310e6e8 fixed deleting acc 2022-06-17 22:52:50 +03:00
gdlbo dfa7ba031e shakal mode 2022-06-17 19:49:41 +03:00
gdlbo 6ddea672ad fixed multi account 2022-06-17 19:27:35 +03:00
gdlbo 047378a11d updated gh actions script 2022-06-17 19:13:27 +03:00
gdlbo 3420c4abb0 added compress disabler 2022-06-17 19:10:57 +03:00
gdlbo 15a8d70f5f added compress disabler 2022-06-17 19:08:37 +03:00
gdlbo 91f90a6609 Merge remote-tracking branch 'origin/master' 2022-06-17 18:35:06 +03:00
gdlbo e170b70999 added auto cleaning cache 2022-06-17 18:35:01 +03:00
gdlbo b489011d24 Merge pull request #342 from k1zn/master
Fix avatar position on tablet
2022-06-17 18:27:20 +03:00
gdlbo 58adfbd261 added auto cleaning cache 2022-06-17 18:21:10 +03:00
Erik Kiznov 3bb18b6daf Fix README.md 2022-06-17 20:09:03 +05:00
Erik Kiznov 120bf18416 Fix avatar position on tablet 2022-06-17 19:36:42 +05:00
Vologhat 428c4ef7d6 changed buttons style 2022-06-17 17:12:26 +03:00
gdlbo 40fc05fc15 fix foxbin.f0x1d.com/enotik 2022-06-17 15:12:59 +03:00
gdlbo 2e913223a2 fix 2022-06-17 14:54:47 +03:00
gdlbo 48f12a912c fix 99% problems on android 11 and lower 2022-06-17 14:19:27 +03:00
gdlbo 0228c0b8a1 fixed colors 2022-06-17 13:58:41 +03:00
gdlbo ba07aeb4d7 fix vk icon in menu 2022-06-17 13:53:17 +03:00
gdlbo 529b13f18b fixed crash android 5.1 2022-06-17 13:34:40 +03:00
gdlbo 5720fddb59 fix crash MusicFragment 2022-06-16 23:30:08 +03:00
gdlbo f5c80b230a gcmfix v2 is here 2022-06-16 22:46:07 +03:00
gdlbo 87ee01bac9 gcmfix v2 is here 2022-06-16 22:32:00 +03:00
gdlbo 126ad044f2 gcmfix v2 is here 2022-06-16 22:30:00 +03:00
gdlbo b636648457 counters is back 2022-06-16 21:58:13 +03:00
gdlbo bf3672a8c4 fix rounded msg + improved vkme msg mode 2022-06-16 21:25:41 +03:00
gdlbo e6478d5161 fixed bg stickers issue 2022-06-16 21:14:13 +03:00
gdlbo ddea78aa4b VKID Protection alert in music settings 2022-06-16 20:25:02 +03:00
gdlbo b872fb17b8 VKID Protection alert 2022-06-16 19:38:18 +03:00
gdlbo 4ec2c17df1 VKID Protection alert 2022-06-16 19:35:45 +03:00
gdlbo 38a51f48d0 fix sharing action buttons 2022-06-16 17:05:42 +03:00
gdlbo 838897611c small fixes 2022-06-16 16:51:27 +03:00
gdlbo f42150063c small fixes 2022-06-16 16:37:35 +03:00
gdlbo d164d1219d verif icon coloring in dialogs 2022-06-16 16:24:23 +03:00
gdlbo fb71b4d781 toolbar fixes 2022-06-16 16:02:19 +03:00
gdlbo f338738c1e writebar fix 2022-06-16 14:16:46 +03:00
gdlbo fb704c7388 fix msg loading 2022-06-16 14:03:39 +03:00
gdlbo c99bca4200 online fixes 2022-06-16 13:18:09 +03:00
gdlbo 92f43acb80 fix 2022-06-16 09:12:39 +03:00
gdlbo a7c85a24f2 added signature check to detect github actions builds and etc 2022-06-16 01:26:07 +03:00
gdlbo fe5616b3f7 fixes 2022-06-16 01:06:11 +03:00
gdlbo 5c882c5ce2 fixes 2022-06-16 00:33:40 +03:00
gdlbo 61a4ed43b9 fixed toast 2022-06-16 00:15:31 +03:00
Vologhat b242ad7ae4 Merge branch 'ota' 2022-06-16 00:09:40 +03:00
Vologhat 1b02e806f8 Final fixes 2022-06-16 00:04:34 +03:00
gdlbo eaf23a24ba impossible color fix 2022-06-15 23:08:58 +03:00
gdlbo ce64296c01 kill androidx 2022-06-15 21:47:21 +03:00
Vologhat 6e3716fe01 final changes
added apk downloading and installing features, bottomshit wrapper with mirroring
2022-06-15 21:29:09 +03:00
gdlbo dcdd83243b color fixes 2022-06-15 21:11:30 +03:00
gdlbo 986ec2987c wtf debuggable must be false 2022-06-15 17:20:01 +03:00
gdlbo c98609db5d fixes 2022-06-15 17:13:18 +03:00
Vologhat 0b4e3c6303 added ota 2022-06-15 16:41:21 +03:00
gdlbo bc3e5a706d fixed auto theme 2022-06-15 07:59:10 +03:00
gdlbo 0b56d9dd23 fixes 2022-06-15 02:36:25 +03:00
gdlbo 62ccdf8eba upgraded new settings
refactored multi account counter
2022-06-15 02:13:33 +03:00
gdlbo 72f4226419 fixes 2022-06-14 23:48:07 +03:00
gdlbo f6a45beac5 isdarktheme now should work depending on the dark theme of the app v2 2022-06-14 13:26:47 +03:00
gdlbo a657ddef58 Merge pull request #313 from iNotFlying/master
New VK logo
2022-06-14 13:10:11 +03:00
gdlbo 726e38ff2e isdarktheme now should work depending on the dark theme of the app 2022-06-14 13:08:20 +03:00
iNotFlying 191d3f760e Some fixes 2022-06-14 10:48:25 +03:00
iNotFlying 2cd3b0f39c Merge branch 'vtosters:master' into master 2022-06-14 11:41:47 +04:00
gdlbo abd990eef7 injected new setting to default theme 2022-06-14 01:19:20 +03:00
gdlbo cd875af7d7 fixed dark theme in new settings 2022-06-14 01:07:17 +03:00
gdlbo b1e8f93371 fixed amoled css 2022-06-14 00:15:25 +03:00
gdlbo 64afd0222b amoled theme now is fully amoled theme 2022-06-14 00:11:33 +03:00
gdlbo 32369f1f38 fixes 2022-06-13 23:57:53 +03:00
gdlbo f00be506cc fixes 2022-06-13 22:49:22 +03:00
gdlbo 248fd1ce9c fixes 2022-06-13 22:40:10 +03:00
gdlbo 3e2d4bb665 vkme mode updated 2022-06-13 22:34:35 +03:00
iNotFlying 92689941ca New VK logo 2022-06-13 21:45:29 +03:00
gdlbo c46110cfea vkme mode updated 2022-06-13 21:07:16 +03:00
gdlbo b5250e0b8d vkme mode updated 2022-06-13 21:06:36 +03:00
gdlbo 0e81397305 vkme mode updated 2022-06-13 21:04:16 +03:00
gdlbo 95d306eaed vkme mode updated 2022-06-13 18:18:38 +03:00
gdlbo 339a4fe01f vkme mode updated 2022-06-13 12:38:50 +03:00
gdlbo 48cdbc7681 vkme mode updated 2022-06-13 12:20:21 +03:00
gdlbo 5e85ba10f4 vkme mode updated 2022-06-13 12:01:04 +03:00
gdlbo ea7dd7aba5 vkme mode test 2022-06-13 01:03:10 +03:00
gdlbo c60b766f37 test coloring bottomsheet 2022-06-12 20:02:15 +03:00
gdlbo da9ded2ae1 mini refactoring 2022-06-12 16:19:45 +03:00
gdlbo 29eb517bb9 fix https://github.com/vtosters/lite/issues/156 2022-06-12 15:44:05 +03:00
gdlbo 84a3f6caff fix 2022-06-12 01:49:10 +03:00
gdlbo b34821463a fix hardcoded text 2022-06-12 01:29:19 +03:00
gdlbo 127abbaaeb fix 2022-06-12 01:12:01 +03:00
gdlbo d462d42775 dropdown menu text color fix 2022-06-12 00:36:18 +03:00
gdlbo 5e80ad7e4e dropdown menu coloring!!!!!!! 2022-06-11 23:51:48 +03:00
gdlbo e1aadade5f fixes 2022-06-11 23:08:16 +03:00
gdlbo 77d6f5d977 fixes 2022-06-11 22:57:52 +03:00
gdlbo c4ae2ec0a3 fixes 2022-06-11 22:45:55 +03:00
gdlbo 07ee9269b7 fixes 2022-06-11 20:16:10 +03:00
gdlbo 3ee43f1c50 Animation fragment injector (beta) 2022-06-11 19:46:22 +03:00
gdlbo dd65196af9 fixed games button 2022-06-11 17:29:05 +03:00
gdlbo 5547de006b upgraded ColorStateList recoloring 2022-06-11 16:42:39 +03:00
gdlbo 0fbf571c60 some fixes of color inj 2022-06-11 15:24:04 +03:00
gdlbo f5f05697b6 Merge remote-tracking branch 'origin/master' 2022-06-11 14:26:43 +03:00
gdlbo 5f179f6a26 fixed search color 2022-06-11 14:26:39 +03:00
gdlbo 37c6d29e84 Fix string 2022-06-10 22:22:46 +03:00
gdlbo 0e81ba31cb fixed crash docs 2022-06-10 21:49:12 +03:00
gdlbo 1f24d32109 fixed crash docs 2022-06-10 21:37:52 +03:00
gdlbo ff16f84c43 some improves 2022-06-10 21:00:37 +03:00
gdlbo 5b929bf515 fixed issue with undelete by default (oops) 2022-06-10 19:42:20 +03:00
gdlbo bdcb3db238 fixed issue with dateformat value 2022-06-10 19:00:26 +03:00
gdlbo f7960b1695 Added an expanded view of the date format type selection
Full date in private messages
Minor improvements
Fixed a bug with anti-deletion of messages
2022-06-10 18:58:19 +03:00
gdlbo 825d1b95da improved disabling number shortening 2022-06-10 17:26:40 +03:00
gdlbo 0e7abaf3f0 fixed pic rounding 2022-06-10 16:40:50 +03:00
gdlbo 2731989ae8 fixed serach text coloring 2022-06-10 16:19:00 +03:00
gdlbo 5ad09e11df fixed casino moment 2022-06-10 16:17:32 +03:00
gdlbo 653d2eeeee fixed casino moment 2022-06-10 15:29:46 +03:00
gdlbo 756ad615ed fixed rounded msgs colors monet 2022-06-10 15:26:40 +03:00
gdlbo dd6abafad5 added pref disableanimstickers to debug 2022-06-09 00:04:14 +03:00
gdlbo 0434f06bb5 fixed some accents 2022-06-08 23:44:58 +03:00
gdlbo 50971098ad fixed accent vkim link 2022-06-08 23:26:30 +03:00
gdlbo 1787f10fca fixed load friends page 2022-06-08 22:58:52 +03:00
gdlbo 6d2684db70 added shadow in dialogs vkme 2022-06-08 21:18:05 +03:00
gdlbo f0f1b3a946 disabled divider in dialogs 2022-06-08 21:09:12 +03:00
gdlbo ae9b703726 fixed shadow 2022-06-08 20:55:19 +03:00
gdlbo 10512fb74b fixed shadow on 31 sdk+ 2022-06-08 20:47:52 +03:00
gdlbo ce9bdba30c sdk 31 rounded msgs 2022-06-08 20:29:30 +03:00
gdlbo 188c98589c amoled theme for rounded msgs 2022-06-08 19:55:11 +03:00
gdlbo e5fa42ff14 some fixes 2022-06-08 19:32:29 +03:00
gdlbo f42aa95003 init rounded msg for light theme 2022-06-08 19:26:01 +03:00
gdlbo b16dc816b6 added applying theme after restart 2022-06-08 19:25:01 +03:00
gdlbo b86fe4d65d init rounded msg for dark theme 2022-06-08 18:50:28 +03:00
gdlbo d7e17416f1 init rounded theme 2022-06-08 18:41:03 +03:00
gdlbo 91355f1dd5 fixed stickers time color 2022-06-08 18:28:56 +03:00
gdlbo ae9e3ed07c fixes some themes logic 2022-06-08 17:22:11 +03:00
gdlbo f701993b0f fixes + more translations 2022-06-08 15:14:34 +03:00
gdlbo c5bf617f65 fixes + more translations 2022-06-08 14:02:45 +03:00
gdlbo f09cae1684 fixes 2022-06-07 17:50:02 +03:00
gdlbo 99d7f06981 New feature open news settings via settings lmao 2022-06-07 11:56:23 +03:00
gdlbo eaaf7e2bbf fixed news logic 2022-06-07 11:26:29 +03:00
gdlbo 897382de2b Fixed some translations + fixed settings logic 2022-06-07 11:24:44 +03:00
gdlbo 55d02a8412 Fixed links 2022-06-07 10:51:24 +03:00
gdlbo 7733582238 Casino update from 7 to 5 2022-06-04 22:14:36 +03:00
gdlbo 754c8339df Added randomize to disable donate alert 2022-06-04 21:18:50 +03:00
gdlbo ebf7baaa65 fixed links + disable recomms 2022-06-04 20:36:00 +03:00
gdlbo 8b26b12813 Added donate banners lmao 2022-06-04 20:04:28 +03:00
gdlbo 5deb4186f9 Fixed market colors 2022-06-04 11:25:38 +03:00
gdlbo d3d501f94a Fix dark accent color on monet 2022-06-04 10:25:41 +03:00
gdlbo 634f1213d4 Merge pull request #283 from bxkr/master 2022-06-04 09:32:58 +03:00
Andrew 6fa97ee435 Update R.java 2022-06-04 06:10:16 +03:00
gdlbo 05b3342763 Fix pull requests building 2022-06-04 04:54:54 +03:00
Andrew d434f42d12 Preferences localization
- Added en,ru translations for hardcoded strings in preferences
- Updated public.xml
- Fixed some ru strings
2022-06-03 23:38:52 +03:00
gdlbo 084f13eda4 Fix actions compiling 2022-06-03 20:36:56 +03:00
gdlbo ed59b54618 Fix actions compiling 2022-06-03 20:33:29 +03:00
gdlbo df282b95ad fix some strings 2022-06-03 19:43:23 +03:00
gdlbo 1b38533c83 color fixes 2022-06-03 17:47:29 +03:00
gdlbo 8f4c370ab2 Update build.gradle 2022-06-03 16:00:11 +03:00
gdlbo 9360ea4d85 Color article fixes 2022-06-02 19:45:49 +03:00
gdlbo c87d6581c8 Color fixes 2022-06-02 19:28:16 +03:00
gdlbo 7133fc6c03 Disabled discover ads 2022-06-02 19:04:24 +03:00
gdlbo 46af5af250 Fix https://github.com/vtosters/lite/issues/266 2022-06-02 17:38:28 +03:00
gdlbo 5b9cc6778c Fixes 2022-06-02 16:42:45 +03:00
gdlbo 5260ad8243 Fixed comments load 2022-06-02 14:25:32 +03:00
gdlbo 2996772020 Updated gitignore 2022-06-02 14:02:37 +03:00
gdlbo d37534cb6b Fixed icon changing 2022-06-02 13:25:19 +03:00
gdlbo 92eb48c21e Fixed crash + fixed msg cache 2022-06-02 13:06:55 +03:00
gdlbo d9e867cb6e Refactoring of some code that suggested what to fix in the comments in our vk group 2022-06-02 12:33:52 +03:00
gdlbo f200c6e59a Refactoring of some code that suggested what to fix in the comments in our vk group 2022-06-02 11:20:11 +03:00
gdlbo c668f3bf9a Refactoring 2022-05-31 16:55:19 +03:00
gdlbo bd7afee09b added more documentations 2022-05-31 16:43:58 +03:00
gdlbo ff09a4aec0 Added our git links 2022-05-26 20:25:51 +03:00
gdlbo 1e6c60f2ed Fixed statusbar and navbar light coloring 2022-05-17 23:08:12 +03:00
gdlbo beedb1538d Poll fix 2022-05-17 20:05:16 +03:00
gdlbo 8463f9e963 Fixes 2022-05-17 18:40:56 +03:00
gdlbo ce8f88b8d4 reworked statusbar coloring 2022-05-17 00:35:39 +03:00
gdlbo ff7d080b5a fix music tabs 2022-05-16 22:38:57 +03:00
gdlbo 12ad83c607 reworked do not read 2022-05-16 21:50:32 +03:00
gdlbo cdf5d2c37c fixes 2022-05-16 21:27:59 +03:00
gdlbo 9af8e1729e copyright posts detect 2022-05-16 21:21:39 +03:00
gdlbo d5219ed322 Fixes + some imp of custom msg loader 2022-05-16 00:11:00 +03:00
gdlbo 7af9a72e77 Fixes 2022-05-15 21:23:48 +03:00
gdlbo 08817bde7e Reworked some cringe code 2022-05-15 21:11:25 +03:00
gdlbo d1e9aadd71 fixed white screamers (maybe) 2022-05-13 20:28:20 +03:00
gdlbo b6307182cd fixes 2022-05-13 19:59:36 +03:00
gdlbo cc70e55b53 Fix summ 2022-05-13 15:36:42 +03:00
gdlbo ed08e97a50 Color fixes 2022-05-13 15:12:02 +03:00
gdlbo 44904786d9 Some corrections 2022-05-13 14:13:36 +03:00
gdlbo 12b67ce189 color fix header 2022-05-13 14:10:18 +03:00
gdlbo 21b0edf092 Fixes 2022-05-13 14:05:00 +03:00
gdlbo 2adb446d80 Fix open notifs 2022-05-13 12:40:42 +03:00
gdlbo 60738458bb Fixes 2022-05-13 11:59:15 +03:00
gdlbo a591026258 Fix article custom verifs 2022-05-12 18:47:42 +03:00
gdlbo 1bab7fa17c Monet dockbar icons coloring 2022-05-12 18:04:12 +03:00
gdlbo 2713216728 Added more summaries 2022-05-12 16:50:30 +03:00
gdlbo f9a529275a System theme at start 2022-05-11 20:59:37 +03:00
gdlbo e992203b7c Some color fixes + upped default app version 2022-05-10 22:34:56 +03:00
gdlbo 0ed057d705 Added another cringe feature 2022-05-10 22:12:40 +03:00
gdlbo 9b70ca6faf Fixed doc upload 2022-05-10 21:27:25 +03:00
gdlbo 422c3e4a6c Fixed stats crash 2022-05-10 21:07:29 +03:00
gdlbo 6dac880d61 Custom opus lib bridges 2022-05-10 20:22:39 +03:00
gdlbo c911b2d64e Custom opus lib bridges 2022-05-10 20:18:59 +03:00
gdlbo 39f72f9058 Crashreporter fix 2022-05-10 14:35:33 +03:00
gdlbo 2bff354ad0 Amoled monet accent + color fixes 2022-05-10 14:11:14 +03:00
gdlbo cb55e9b96f Disabled stats.track*** 2022-05-10 13:53:14 +03:00
gdlbo 33f551d464 Fixed vk cringe refl 2022-05-10 13:26:00 +03:00
gdlbo 282fa7bdda Beautify code 2022-05-07 18:31:07 +03:00
gdlbo 0abd97e8e1 Deleted unused code 2022-05-07 11:16:22 +03:00
gdlbo 5dd616685d Decrypt 2022-05-06 14:50:02 +03:00
gdlbo aff99be92d Fixes 2022-05-06 14:05:23 +03:00
gdlbo c255f1e498 Undelete feature + fixes 2022-05-06 13:43:42 +03:00
gdlbo 70342daf07 Merge branch 'master' of https://github.com/vtosters/lite 2022-05-06 01:58:35 +03:00
gdlbo f95672e57d Encryption + Undelete code base 2022-05-06 01:57:33 +03:00
gdlbo 8f5da42df4 color fixes 2022-05-04 16:41:59 +03:00
gdlbo 4022903069 Fixed crash 2022-05-04 14:23:25 +03:00
gdlbo 4600c185e4 Added proxy user/pass auth 2022-05-04 13:12:39 +03:00
gdlbo 30e8ec0038 Update README.md 2022-05-03 23:45:37 +03:00
gdlbo 367b212ca3 Updated build gradle 2022-05-03 22:19:23 +03:00
gdlbo 6533feb62b Merge remote-tracking branch 'origin/master' 2022-05-03 22:11:35 +03:00
gdlbo 95ef37f6a3 Fix 2022-05-03 22:11:19 +03:00
Vologhat 6216c66d95 fix #204 (null pointer while account deleting) 2022-05-02 18:07:04 +03:00
gdlbo 02b6e4a728 Fix dockbar issue 2022-05-02 13:30:51 +03:00
gdlbo 00c1e926e6 Fixed store stickers colors 2022-05-02 12:54:58 +03:00
gdlbo ef8109e2e8 Reworked some about menu 2022-05-02 12:40:57 +03:00
gdlbo 732ee76957 Disabled anim stickers 2022-05-02 12:31:30 +03:00
gdlbo b97d2261de Fixed bug with new feed design 2022-05-02 11:03:39 +03:00
gdlbo c362bfc8da Fixes + new update feed logic 2022-05-02 10:44:57 +03:00
gdlbo cc445e4aea Oh sh*t I am sorry (for refactoring) 2022-05-02 09:44:30 +03:00
gdlbo 4ac83d59b5 Color fixes 2022-04-30 14:25:40 +03:00
gdlbo 5025a5fa94 Refactoring + renaming 2022-04-30 13:48:04 +03:00
gdlbo b8cb19c8db Refactoring + renaming 2022-04-30 13:17:32 +03:00
gdlbo 593153de8f Updated README.md + version null fix 2022-04-29 22:22:07 +03:00
gdlbo 6c36b83d64 Github Actions test 2022-04-29 21:51:56 +03:00
gdlbo 1381fdd3bb Github Actions test 2022-04-29 21:48:08 +03:00
gdlbo f680a37eb1 gh actions test 3 2022-04-29 21:42:51 +03:00
gdlbo 4531b7af52 gh actions test 2 2022-04-29 21:38:24 +03:00
gdlbo 0c4d1af2dc fix 2022-04-29 21:29:20 +03:00
gdlbo d6a18ecca6 gh actions test 2022-04-29 21:27:25 +03:00
gdlbo dc768952c3 Updated README.md 2022-04-29 20:56:14 +03:00
gdlbo 57cdcfcbd1 color fixes 2022-04-29 16:49:30 +03:00
gdlbo fb4837ce40 color fixes 2022-04-28 22:02:35 +03:00
gdlbo b85e1e6937 color fixes 2022-04-28 21:56:54 +03:00
gdlbo 727201ece9 Some fixes 2022-04-28 21:21:20 +03:00
gdlbo c711c3126e Clean up code 2022-04-28 21:11:04 +03:00
gdlbo cdcf218160 Fixes 2022-04-28 20:57:57 +03:00
gdlbo ee652593c0 Backup system fixes 2022-04-28 19:07:11 +03:00
gdlbo 90773529e6 Reset/Save prefs system init 2022-04-28 18:29:31 +03:00
gdlbo 0134a7c82c Reset/Save prefs system init 2022-04-28 18:29:21 +03:00
gdlbo fec3d40d7d fixes 2022-04-27 23:06:43 +03:00
gdlbo bdf36f42d3 fixes for music popup 2022-04-27 21:34:14 +03:00
gdlbo 23967490e9 https://github.com/vtosters/lite/issues/181 + color fixes for tabs 2022-04-27 21:09:29 +03:00
gdlbo 3bcd197618 Fixed crash
https://github.com/vtosters/lite/issues/192
2022-04-27 20:29:18 +03:00
gdlbo ac3eba5654 Deleted exit button :) 2022-04-27 20:25:29 +03:00
gdlbo 9576856b0b Added debug feature for clear all sticks cache 2022-04-27 20:15:47 +03:00
gdlbo f17975c92f Fixed pic theme 2022-04-27 20:08:23 +03:00
gdlbo 07a24eab2f Fixed header coloring 2022-04-27 19:37:48 +03:00
gdlbo edc9276fac Max tabs updated 2022-04-26 14:28:37 +03:00
gdlbo c7531eb652 Updated icons 2022-04-25 19:37:14 +03:00
gdlbo 5c1452ff57 Fixed msg strange bug + fixes 2022-04-25 17:24:13 +03:00
gdlbo e467044e41 Improved Dark theme 2022-04-25 16:47:43 +03:00
gdlbo 5c5780f720 Improved player progress color 2022-04-25 16:31:02 +03:00
gdlbo 7119bab9c9 Refactored vkui injector + added headers coloring 2022-04-25 15:51:07 +03:00
gdlbo 2eccc92510 Monet fixes 2022-04-25 14:23:18 +03:00
gdlbo b9e0fcdb04 Update preferences_themes.xml 2022-04-24 22:44:06 +03:00
gdlbo 5c15912b1b Update DockBarManager.java 2022-04-24 22:32:39 +03:00
gdlbo ac6525e49a Improved dark theme 2022-04-24 19:22:35 +03:00
gdlbo 3e67973a27 added more info + reformated xml 2022-04-24 18:42:17 +03:00
gdlbo ed4e295e71 Update ThemesFragment.java 2022-04-24 18:28:12 +03:00
gdlbo 73b57399d5 Improved Theme changing 2022-04-24 18:16:24 +03:00
gdlbo 9e0b67478d fixed comments 2022-04-24 17:57:26 +03:00
gdlbo 341eb37ff4 Fixes + Added comments sorting 2022-04-24 17:43:02 +03:00
gdlbo 6d68a77e42 fixes 2022-04-24 16:58:17 +03:00
gdlbo b50f56a5d4 Oh, fixes?
-Added styles list for dark and light themes
-Updated libs
-Auto refactored resources for easy editing
-Improved amoled theme
2022-04-23 21:36:08 +03:00
gdlbo e226438b09 Improved Amoled Theme 2022-04-23 00:03:37 +03:00
gdlbo a5db0793d6 Revert "Improved navbar coloring"
This reverts commit 07e1f1a1d3.
2022-04-22 23:01:45 +03:00
gdlbo 07e1f1a1d3 Improved navbar coloring 2022-04-22 19:29:18 +03:00
gdlbo de77e3484b Update preferences_themes.xml 2022-04-22 18:59:48 +03:00
gdlbo 24571ea22f Amoled Theme feature 2022-04-22 18:51:42 +03:00
gdlbo 515f90105c Improved Amoled Theme + Added support for SSFS 2022-04-22 18:04:56 +03:00
gdlbo 0d305dbc7e Amoled Theme Styles for VKIM + fixed vk refl 2022-04-22 17:39:37 +03:00
gdlbo 05bf888ba6 Test Amoled Theme Styles + Updated R.java 2022-04-22 17:03:41 +03:00
gdlbo a2a53e8215 Updated Libs 2022-04-22 16:08:23 +03:00
gdlbo e6290b8aba Updated gradle + amoled inject 2022-04-22 14:07:56 +03:00
gdlbo aa5f6e7cbe Improved dark theme 2022-04-16 18:41:11 +03:00
gdlbo 054b447236 Fixed bot keyboard 2022-04-16 17:58:12 +03:00
gdlbo 52db475469 Custom load of msg 2022-04-16 01:56:12 +03:00
gdlbo 6282800fdb Fixed all issues with msgs 2022-04-16 00:23:32 +03:00
gdlbo 20517fdf51 Fixed video downloading 2022-04-16 00:01:21 +03:00
gdlbo 40400817c1 Downgraded msg api 2022-04-15 23:41:18 +03:00
gdlbo 834e454eb2 Zaborona fix 2022-04-15 23:40:06 +03:00
gdlbo 2747c9efc8 Improved dark theme 2022-04-12 17:34:09 +03:00
gdlbo c2cc782ee3 Fixed vk refl 2022-04-12 16:37:52 +03:00
gdlbo d414e79b6b Fixed msg loading null 2022-04-12 15:07:35 +03:00
gdlbo 9e0f95ed94 Fixed strange twitter crash 2022-04-12 13:49:11 +03:00
gdlbo 167da56a0b Fixed strange statusbar coloring 2022-04-12 13:29:32 +03:00
gdlbo af213869c8 Improved white theme 2022-04-12 13:17:45 +03:00
gdlbo 39b9e42f62 Fixed crash 2022-04-11 22:56:11 +03:00
gdlbo 1aa07afabc haha bruh dev->beta
1989 китай ничего не было
2022-04-11 22:38:51 +03:00
gdlbo 84d7d0bef6 Fixed bugs 2022-04-11 22:22:13 +03:00
gdlbo fbb7f2320e Improved dark theme 2022-04-11 21:46:32 +03:00
gdlbo 506f5c7597 deleted confidential logging 2022-04-11 21:12:00 +03:00
gdlbo 38d3a40d7a Update MultiAccountAdapter.java 2022-04-11 21:10:16 +03:00
gdlbo 44cb073de8 fixes + disabled debuggable mode 2022-04-11 21:07:08 +03:00
Vologhat 8a680e5429 update multi account 2022-04-11 20:57:52 +03:00
gdlbo 16dbdc5ec3 Improved dark theme 2022-04-11 16:27:10 +03:00
gdlbo 4cece4566c Improved coloring 2022-04-11 14:24:50 +03:00
gdlbo 2340cbbbb2 Msg fixes 2022-04-11 01:23:12 +03:00
gdlbo e00feded18 Fixes 2022-04-11 01:01:08 +03:00
gdlbo d7c5e88c00 FIxed authactiviry cringe accent color on sdk31+ 2022-04-11 00:54:21 +03:00
gdlbo 7462d739f4 Improved dark theme 2022-04-11 00:29:28 +03:00
gdlbo f1bbdeac45 Improved dark theme 2022-04-11 00:13:21 +03:00
gdlbo 178bdbf988 Deleted new video feature 2022-04-10 23:54:53 +03:00
gdlbo 82a5d40a10 Improved dark theme 2022-04-10 23:47:51 +03:00
gdlbo c888bd3f3c Improved dark theme 2022-04-10 23:10:12 +03:00
gdlbo 53f45f49c3 Improved dark theme 2022-04-10 22:52:05 +03:00
gdlbo 3c108c7520 multiaccount fixes 2022-04-10 22:00:21 +03:00
Vologhat 11bce261ae multi account refactoring 2022-04-10 20:17:47 +03:00
gdlbo 5f8204c48e Improved dark theme 2022-04-10 19:53:51 +03:00
gdlbo f6043ed413 Update Prefs.java 2022-04-10 19:02:23 +03:00
Vologhat 5ab22cd5c4 fix notifications updater 2022-04-10 16:08:08 +03:00
gdlbo ee20e461d2 Update InterfaceFragment.java 2022-04-09 20:40:06 +03:00
gdlbo 9fa6513d4b Improved dark theme 2022-04-09 19:28:53 +03:00
gdlbo e86c7b190a Improved dark theme 2022-04-09 18:26:11 +03:00
gdlbo 0b2c5dc578 Improved dark theme 2022-04-09 17:57:00 +03:00
gdlbo 55b569c057 Improved dark theme 2022-04-09 16:50:33 +03:00
gdlbo 02d6fb3b14 Improved dark theme 2022-04-08 21:58:08 +03:00
gdlbo 8ed21f8fa9 Improved dark theme 2022-04-08 21:29:00 +03:00
gdlbo 6c1a12b345 Improved dark theme 2022-04-08 20:45:47 +03:00
gdlbo 05f4462195 Improved dark theme 2022-04-08 15:03:42 +03:00
gdlbo e4bb903391 Improved dark theme 2022-04-08 13:46:35 +03:00
gdlbo 5028fe9d7f Improved dark theme 2022-04-08 13:31:09 +03:00
gdlbo 9bca7a3598 Improved dark theme 2022-04-08 13:14:44 +03:00
gdlbo dddb414c7d Fixed crash crop 2022-04-08 11:57:33 +03:00
gdlbo ad67bed400 Fixed installing app 2022-04-07 20:43:15 +03:00
gdlbo 5ffa2fac40 Fixed win script 2022-04-07 20:30:26 +03:00
gdlbo cca1bc6607 Fixed win script 2022-04-07 20:28:38 +03:00
gdlbo 55f49d7d3a Updated keystore 2022-04-07 19:47:02 +03:00
gdlbo a24f8bef3d Fixed versioning null 2022-04-07 19:44:20 +03:00
gdlbo c41a0de1af Updated scripts 2022-04-07 19:15:46 +03:00
gdlbo d4c8b795fa Updated README.md 2022-04-07 19:10:11 +03:00
gdlbo 47c219ad8c Fixed podcasts colors 2022-04-07 18:55:01 +03:00
gdlbo 59b34ddf3e Added old icons feature 2022-04-07 18:40:04 +03:00
gdlbo 01f1e3993c Improved external video link parser 2022-04-07 18:23:57 +03:00
gdlbo c21cadad1d Disabled monet coloring for dockbar 2022-04-07 17:38:52 +03:00
gdlbo 307d15ff24 Fixed some color issues 2022-04-07 17:32:52 +03:00
gdlbo 5edebee51e Fixed some color issues 2022-04-07 16:44:55 +03:00
gdlbo 3d936f4abd Fixed miniplayer text color issues 2022-04-07 15:30:39 +03:00
gdlbo e725c05e9c Fixed settings stickers color issues 2022-04-07 15:26:02 +03:00
gdlbo 5a8a33cebc Fixed docs text color issue 2022-04-07 15:01:51 +03:00
gdlbo da28a5feca Fixed a11+ issue 2022-04-07 14:55:34 +03:00
gdlbo a058e84ddb Fixed crash 2022-04-07 13:54:15 +03:00
gdlbo 49ccf080ad Fixed crash on sdk31+ 2022-04-07 13:17:17 +03:00
gdlbo 176a9a89b6 Deleted libverify button 2022-04-04 20:45:48 +03:00
gdlbo 40f907300d Fixed crash 2022-04-04 20:34:38 +03:00
gdlbo 0219b14844 Update LinkProcessor1.smali 2022-04-03 18:30:23 +03:00
Vologhat 08acebd2c6 fix recycler view wrong resizing 2022-04-03 17:09:59 +03:00
gdlbo 9bf0109c0d Update DockBarManager.java 2022-04-03 14:15:12 +03:00
gdlbo 1f31ddd8d0 Update DockBarManager.java 2022-04-03 14:05:08 +03:00
gdlbo 9540fb68dc Update StandartFilter.txt 2022-04-03 13:44:58 +03:00
gdlbo 432975f409 Fixed crash
https://github.com/vtosters/lite/issues/103
2022-04-03 13:17:55 +03:00
Vologhat 8b2acc764a add saving and resetting 2022-04-03 12:26:17 +03:00
Vologhat f79ca38ef4 fix dockbar tabs limit 2022-04-03 12:23:42 +03:00
gdlbo 446cc973d6 Fixes fixes fixes 2022-04-02 23:53:54 +03:00
gdlbo a847d6a3eb Fixes dockbar 2022-04-02 23:41:20 +03:00
gdlbo 67f9d9bbd9 Fixes 2022-04-02 22:30:51 +03:00
gdlbo 2d49885572 Merge branch 'master' of https://github.com/vtosters/lite 2022-04-02 22:05:09 +03:00
gdlbo a940674c6f Some improvements 2022-04-02 22:04:16 +03:00
Vologhat 7bbb073552 add outline icons 2022-04-02 22:00:04 +03:00
Vologhat 105d784b4a add inability to unselect menu tab 2022-04-02 22:00:04 +03:00
Vologhat 23eb0fef69 add possibility to choice alternative fragments for "news" and "discover" 2022-04-02 22:00:04 +03:00
Vologhat b9afb74a01 level down min tabs count 2022-04-02 22:00:04 +03:00
Vologhat edfb68c946 fix color palette and tab items 2022-04-02 22:00:04 +03:00
Vologhat 66897e8e93 fix dockbar 2022-04-02 22:00:04 +03:00
Vologhat 3b754b79e7 add dockbar injector 2022-04-02 22:00:03 +03:00
Vologhat 11fa834af7 migration to android support due to androidx instability 2022-04-02 22:00:03 +03:00
Vologhat d319c97430 докбар 2022-04-02 22:00:03 +03:00
gdlbo 744f9866da Updated README.md 2022-04-02 22:00:02 +03:00
gdlbo 251746a57e Updated README.md https://github.com/vtosters/lite/pull/89 2022-04-02 22:00:02 +03:00
Daniil Isakov b1bbfe7e1b Grammar check, a bit of rephrasing 2022-04-02 22:00:02 +03:00
gdlbo 7a911de8ca updated multiacc 2022-04-02 22:00:02 +03:00
gdlbo e5398cc1be updated adblock filter 2022-04-02 22:00:02 +03:00
gdlbo b87f28f8bf updated resources + R.java again 2022-04-02 22:00:02 +03:00
gdlbo 5f8e16eb5d translation fixes 2022-04-02 22:00:02 +03:00
gdlbo f83e1cc0b7 Updated R.java + some fixes 2022-04-02 22:00:02 +03:00
gdlbo 447bc94100 Added multi account feature 2022-04-02 22:00:02 +03:00
gdlbo 17cdb9c87b Improved adblock 2022-04-02 22:00:02 +03:00
gdlbo 2cb35c17b2 Improvements of multiacc + added migrating from old type of accounts to new type 2022-04-02 22:00:01 +03:00
gdlbo 0e0ca2a504 Improvements of multiacc + deleted old accs xD 2022-04-02 22:00:01 +03:00
gdlbo dca61fcd16 Improvements of multiacc 2022-04-02 22:00:01 +03:00
gdlbo d0a198c6ad Multiaccount impl test 2022-04-02 22:00:01 +03:00
gdlbo c1211123dd fixed picker crash 2022-04-02 22:00:01 +03:00
gdlbo 3a9d4ffa12 Updated README.md 2022-04-01 19:05:57 +03:00
gdlbo 5855dc2abf Updated README.md https://github.com/vtosters/lite/pull/89 2022-04-01 18:56:52 +03:00
gdlbo ed3e6314d1 Merge pull request #84 from oplexz/patch-1 2022-04-01 09:53:41 +03:00
Daniil Isakov b83a36d41a Grammar check, a bit of rephrasing 2022-04-01 09:40:25 +03:00
gdlbo 1beaf3f436 updated multiacc 2022-04-01 08:43:52 +03:00
gdlbo 0bb9145288 updated adblock filter 2022-04-01 08:39:04 +03:00
gdlbo ba76a1f0fd updated resources + R.java again 2022-03-31 21:09:42 +03:00
gdlbo f0732ae3c3 translation fixes 2022-03-31 20:41:10 +03:00
gdlbo 8a761382f0 Updated R.java + some fixes 2022-03-31 20:19:28 +03:00
gdlbo 481e3ba041 Added multi account feature 2022-03-31 19:22:37 +03:00
gdlbo 4615a174f0 Improved adblock 2022-03-30 18:03:52 +03:00
gdlbo 18de5e9289 Improvements of multiacc + added migrating from old type of accounts to new type 2022-03-30 17:16:23 +03:00
gdlbo 122c6d8b80 Improvements of multiacc + deleted old accs xD 2022-03-30 17:01:50 +03:00
gdlbo d00f93ee94 Improvements of multiacc 2022-03-30 14:51:50 +03:00
gdlbo bbc2a8132a Multiaccount impl test 2022-03-30 00:22:49 +03:00
gdlbo f4e61583fa fixed picker crash 2022-03-28 10:13:12 +03:00
gdlbo 9ee72b2c6b Update SettingsListFragment$b.smali 2022-03-27 21:12:45 +03:00
Vologhat dd2c17e4ac fix script for windows 2022-03-27 20:31:31 +03:00
gdlbo e87dde9c6a fixed compilation on windows 2022-03-27 18:04:47 +03:00
gdlbo 83a5723dee fixed compilation on windows 2022-03-27 18:01:02 +03:00
aliveoutside 3e6b968400 fix icons in dropdown menu in newsfeed 2022-03-27 12:19:11 +03:00
aliveoutside c3f9dffd50 fix text color in dropdown menu in newsfeed 2022-03-27 12:19:11 +03:00
gdlbo 972504202e fixed proxy issue 2022-03-27 11:50:14 +03:00
gdlbo d26b0bed38 fixed video catalog issue 2022-03-27 11:40:32 +03:00
gdlbo e5b886ed21 fixed pic edit crash 2022-03-27 11:35:30 +03:00
gdlbo d9e6082f1a Fix doc upload crash 2022-03-26 23:38:53 +03:00
gdlbo 67001e272b Fix graffiti crash 2022-03-26 23:15:47 +03:00
gdlbo 5534aa3fda Updated shit Filter 2022-03-26 22:57:17 +03:00
gdlbo 55e73d3469 Updated ADBlock Filter + new test filter 2022-03-26 22:41:07 +03:00
gdlbo 8a7b03676d Updated ADBlock Filter 2022-03-26 21:37:17 +03:00
gdlbo 0adafcb433 Now some new features are enabled by default 2022-03-26 21:32:24 +03:00
gdlbo 356eb98b94 updated README.md 2022-03-26 21:25:43 +03:00
gdlbo 86b5af9210 fixed some color issues 2022-03-26 21:16:15 +03:00
gdlbo c4a5406330 fixed some crashes and other problems 2022-03-26 21:07:27 +03:00
gdlbo 857e6ff86b fixed some issues 2022-03-26 20:38:38 +03:00
aliveoutside 5bec30d2c7 fix animated stickers 2022-03-26 19:59:29 +03:00
gdlbo c7a226999f fixed some issues 2022-03-26 17:43:49 +03:00
gdlbo 1bea6d3f3e updated prefs 2022-03-26 17:03:58 +03:00
gdlbo ffa70d5684 updated README.md 2022-03-26 16:52:38 +03:00
gdlbo 8de9ea9c1b updated debug 2022-03-26 16:44:55 +03:00
gdlbo f8c4393074 updated README.md 2022-03-26 16:28:15 +03:00
gdlbo 79cada7128 Improvements + updated R.java and README.md 2022-03-26 16:27:02 +03:00
aliveoutside 4c40edd00c fix pinned dialogs loading 2022-03-26 16:17:37 +03:00
aliveoutside 20ab276cef fix "popular" videos 2022-03-26 15:44:24 +03:00
gdlbo 689f2d3876 libverify preference 2022-03-25 19:43:52 +03:00
gdlbo c403deb38d fix fix 2fa auth........ 2022-03-25 19:15:28 +03:00
gdlbo d90ecbb8d1 fixed versioning on macos/linux 2022-03-25 18:45:11 +03:00
gdlbo ae16a513ed fixed versioning on macos/linux 2022-03-25 18:30:26 +03:00
gdlbo 7339a28d92 updated README.md 2022-03-25 17:51:00 +03:00
gdlbo d544a633cc added bug report button 2022-03-25 17:28:14 +03:00
gdlbo a6b78dca57 fixed ssfs domain 2022-03-25 16:52:36 +03:00
gdlbo 7dd78345f1 fix Jetifier 2022-03-25 16:45:49 +03:00
gdlbo 0a67c2a910 fixed 2fa, fixed some issues with proxy, deleted xtrafrancyz proxy, fixed compiling, some other fixes 2022-03-25 16:42:25 +03:00
aliveoutside 4e9475a6eb update framework and add apksigner.jar 2022-03-25 16:16:13 +03:00
aliveoutside b5a6a8d027 fix crash when music download button clicked 2022-03-24 22:31:43 +03:00
aliveoutside 1e1869718f fix serverside features 2022-03-24 22:30:52 +03:00
aliveoutside ee69e29153 Update README.md 2022-03-24 19:59:23 +03:00
aliveoutside 137ba631af Update README.md 2022-03-24 19:41:44 +03:00
aliveoutside aa972fa5b3 init 2022-03-24 19:37:43 +03:00
1345 changed files with 7767 additions and 25897 deletions
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
ea0425fab4379ae5f7e9db05a22d4b7afd709560
Binary file not shown.
@@ -0,0 +1 @@
3b92d8876dd59d5afc60a53bb23b103cede6a194
Binary file not shown.
Binary file not shown.
@@ -1,51 +0,0 @@
package com.vk.core.ui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
public class VKLayoutInflater extends LayoutInflater {
private final static String[] DEFAULT_PACKAGES = {
"android.widget.", "android.webkit.", "android.app."
};
public VKLayoutInflater(LayoutInflater original, Context context) {
super(original, context);
}
@Override
public LayoutInflater cloneInContext(Context newContext) {
return new VKLayoutInflater(this, newContext);
}
public final View createView(View parent, String name, Context context, AttributeSet attrs) {
if (!name.startsWith("android.")) {
try {
return onCreateView(parent, name, attrs);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
try {
return createView(name, null, attrs);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected View onCreateView(String name, AttributeSet attrs) throws ClassNotFoundException {
for (var defPackage : DEFAULT_PACKAGES) {
try {
View view = createView(name, defPackage, attrs);
if (view != null) return view;
} catch (ClassCastException | ClassNotFoundException ignored) {
}
}
return super.onCreateView(name, attrs);
}
}
@@ -1,119 +0,0 @@
package com.vk.core.ui;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.util.AttributeSet;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebView;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.SwitchCompat;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.OsUtil;
import com.vk.core.view.NavigationSpinner;
import com.vk.core.view.TextViewColorStateListAndAlphaSupportPreV23;
import com.vk.core.view.VKAppBarLayout;
public class VKUILayoutFactory implements LayoutInflater.Factory2 {
private final static int[] FONT_ATTR = { android.R.attr.font };
private AppCompatDelegate mDelegate;
private VKLayoutInflater mInflater;
public VKUILayoutFactory(AppCompatDelegate delegate, VKLayoutInflater inflater) {
mDelegate = delegate;
mInflater = inflater;
}
private void setTypeface(TextView textView, Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, FONT_ATTR, android.R.attr.textViewStyle, 0);
if (ta == null) return;
Font font = Font.Companion.a(ta.getString(0));
if (font != null && Build.VERSION.SDK_INT < font.a())
textView.setTypeface(font.c());
ta.recycle();
}
@Nullable
@Override
public View onCreateView(@Nullable View parent, @NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {
View view = null;
try {
if (!(parent instanceof NavigationSpinner) && !OsUtil.b())
view = new TextViewColorStateListAndAlphaSupportPreV23(context, attrs, 0);
else if (mDelegate != null)
view = mDelegate.createView(parent, name, context, attrs);
else if (mInflater != null)
view = mInflater.createView(parent, name, context, attrs);
} catch (Throwable unused) {
throw new InflateException(
"parent=" + parent.getClass().getName()
+ ":" + getResourceIdName(view)
+ ", view=" + name
+ ":" + getResourceIdName(context, attrs));
}
if (view == null &&
("com.google.android.material.appbar.AppBarLayout".equals(name)
|| "android.support.design.widget.AppBarLayout".equals(name)))
view = new VKAppBarLayout(context, attrs);
if (view != null) {
if (!(view.getTag() instanceof String)) {
if (view instanceof TextView) {
setTypeface((TextView) view, context, attrs);
if (view instanceof CheckBox)
VKThemeHelper.k.a((CheckBox) view);
else if (view instanceof RadioButton)
VKThemeHelper.k.a((RadioButton) view);
else if (view instanceof SwitchCompat)
VKThemeHelper.k.a((SwitchCompat) view);
else if (view instanceof Switch)
VKThemeHelper.k.a((Switch) view);
} else if (view instanceof WebView) {
VKThemeHelper.a((WebView) view);
}
VKThemeHelper.k.a(view, attrs);
}
}
return view;
}
private String getResourceIdName(View view) {
try {
if (view != null) {
if (view.getId() != -1)
return view.getResources().getResourceName(view.getId());
return "NO_ID";
}
return "null";
} catch (Throwable unused) {
return "FAILED_TO_GET_ID";
}
}
private String getResourceIdName(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.id });
int resId = ta.getResourceId(0, -1);
ta.recycle();
return resId != -1
? context.getResources().getResourceName(resId)
: "NO_ID";
}
@Nullable
@Override
public View onCreateView(@NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {
return onCreateView(null, name, context, attrs);
}
}
@@ -0,0 +1,220 @@
package com.vk.core.util;
import static ru.vtosters.lite.utils.Preferences.getDownloadsDir;
import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import static ru.vtosters.lite.utils.Preferences.getPhotosDir;
import static ru.vtosters.lite.utils.Preferences.getVideosDir;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import com.facebook.common.i.MediaUtils;
import com.facebook.x.g.EncodedImage;
import com.vk.core.concurrent.VkExecutors;
import com.vk.imageloader.VKImageLoader;
import com.vk.log.L;
import com.vk.metrics.eventtracking.VkTracker;
import com.vtosters.lite.R;
import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.util.HashSet;
import b.h.g.m.CameraUtils;
import b.h.g.m.FileUtils;
public class DownloadUtils {
public static final HashSet<Long> a = new HashSet<>();
public static void a(Context context, String str, String str2) {
a(context, str, str2, false);
}
public static void b(Context context, String str, String str2) {
a(context, str, str2, true);
}
private static void a(Context context, String str, String str2, boolean z) {
try {
b(context, str, str2, z);
} catch (Exception e2) {
L.d(e2);
ToastUtils.a(context.getString(R.string.error) + " [" + e2.getMessage() + "]");
}
}
private static void b(final Context context, String str, String str2, boolean z) {
if (TextUtils.isEmpty(str2)) {
return;
}
String file = a(str, str2);
File b2;
boolean c2 = MediaUtils.c(MediaUtils.b(str2));
if (str.endsWith("png") || str.endsWith("jpg") || str.endsWith("jpeg")) {
b2 = new File(getPhotosDir(), file);
} else if (str.endsWith("mp3") || str.endsWith("wav") || str.endsWith("ogg") || str.endsWith("aac") || str.endsWith("flac") || str.endsWith("m4a")) {
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")) {
b2 = new File(getVideosDir(), file);
} else {
b2 = new File(getDownloadsDir(), file);
}
if (c2) {
EncodedImage c3 = VKImageLoader.c(Uri.parse(str2));
final InputStream h = c3 == null ? null : c3.h();
if (h != null) {
try {
if (b2.exists() || FileUtils.b(b2)) {
VkExecutors.x.a().execute(() -> ToastUtils.a(context.getString(R.string.file_saved, b2.getAbsoluteFile())));
}
} catch (Exception e2) {
L.a(e2);
}
CameraUtils.a(context, b2, null);
return;
}
}
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(str2));
request.setDestinationUri(Uri.fromFile(b2));
request.setMimeType(FileUtils.f(new File(str)));
request.setNotificationVisibility(1);
request.allowScanningByMediaScanner();
request.setTitle(str);
DownloadManager a2 = a(context);
if (a2 == null) {
return;
}
try {
long enqueue = a2.enqueue(request);
if (!z) {
return;
}
a.add(enqueue);
} catch (IllegalArgumentException e3) {
L.a(e3);
b(context);
}
}
private static String a(String str, String str2) {
String lastPathSegment = Uri.parse(str2).getLastPathSegment();
if (!TextUtils.isEmpty(str)) {
String replace = str.replace('/', '_');
return !replace.contains(".") ? lastPathSegment : replace;
}
return lastPathSegment;
}
@SuppressLint("Range")
public static boolean a(Context context, Uri uri) {
try {
Cursor query = a(context).query(new DownloadManager.Query().setFilterByStatus(11));
if (query != null && query.moveToFirst()) {
while (!uri.toString().equals(query.getString(query.getColumnIndex("uri")))) {
if (!query.moveToNext()) {
query.close();
return false;
}
}
@SuppressLint("Range")
int i = query.getInt(query.getColumnIndex("status"));
@SuppressLint("Range")
String string = query.getString(query.getColumnIndex("local_uri"));
query.close();
if (i == 1 || i == 2) {
ToastUtils.a(R.string.download_is_in_progress);
query.close();
return true;
} else if (i != 8) {
query.close();
return false;
} else {
boolean a2 = a(context, string);
query.close();
return a2;
}
}
return false;
} catch (SQLiteException e2) {
VkTracker.k.b(e2);
return false;
}
}
private static void b(Context context) {
if (context != null) {
try {
context.startActivity(new Intent("android.settings.APPLICATION_DETAILS_SETTINGS").setData(Uri.parse("package:com.android.providers.downloads")));
} catch (ActivityNotFoundException e2) {
L.a(e2);
context.startActivity(new Intent("android.settings.MANAGE_APPLICATIONS_SETTINGS"));
}
ToastUtils.a("Please enable download manager", true);
}
}
public static boolean a(Context context, String str) {
File file;
try {
try {
file = new File(new URI(str));
try {
if (!file.exists()) {
return false;
}
Intent intent = new Intent("android.intent.action.VIEW");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
String f2 = FileUtils.f(file);
if (!TextUtils.isEmpty(f2)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(FileUtils.n(file), f2);
context.startActivity(intent);
return true;
}
throw new ActivityNotFoundException();
} catch (ActivityNotFoundException unused) {
return a(context, file);
}
} catch (ActivityNotFoundException unused2) {
unused2.printStackTrace();
}
} catch (Throwable th) {
VkTracker.k.b(th);
return false;
}
return false;
}
private static boolean a(Context context, File file) {
if (file != null && file.exists()) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(Uri.parse(file.getAbsolutePath()), "application/*");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException e2) {
L.a(e2);
}
}
return false;
}
private static DownloadManager a(Context context) {
return (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
}
}
@@ -0,0 +1,131 @@
package com.vk.im.ui.views;
import androidx.annotation.NonNull;
public class Corners{
private int topLeft;
private int topRight;
private int bottomLeft;
private int bottomRight;
public Corners(int i, int i2, int i3, int i4){
this.topLeft = i;
this.topRight = i2;
this.bottomLeft = i3;
this.bottomRight = i4;
}
public Corners(int i, int i2, int i3, int i4, int i5) {
this((i5 & 1) != 0 ? 0 : i, (i5 & 2) != 0 ? 0 : i2, (i5 & 4) != 0 ? 0 : i3, (i5 & 8) != 0 ? 0 : i4);
}
public Corners() {
this(0, 0, 0, 0, 15);
}
public static Corners a(Corners corners, int i, int i2, int i3, int i4, int i5, Object obj){
if ((i5 & 1) != 0) {
i = corners.topLeft;
}
if ((i5 & 2) != 0) {
i2 = corners.topRight;
}
if ((i5 & 4) != 0) {
i3 = corners.bottomLeft;
}
if ((i5 & 8) != 0) {
i4 = corners.bottomRight;
}
corners.a(i, i2, i3, i4);
return corners;
}
public int a(){
return this.bottomLeft;
}
public int b(){
return this.bottomRight;
}
public int c(){
return this.topLeft;
}
public int d(){
return this.topRight;
}
public boolean e(){
int i;
int i2 = this.topLeft;
int i3 = this.topRight;
return i2 == i3 && i3 == (i = this.bottomRight) && this.bottomLeft == i;
}
public boolean equals(Object obj){
if (this != obj) {
if (!(obj instanceof Corners)) {
return false;
}
Corners corners = (Corners) obj;
return this.topLeft == corners.topLeft && this.topRight == corners.topRight && this.bottomLeft == corners.bottomLeft && this.bottomRight == corners.bottomRight;
}
return true;
}
public boolean f(){
return this.topLeft == 0 && e();
}
public void g(){
a(0, 0);
}
public int hashCode(){
return (((((this.topLeft * 31) + this.topRight) * 31) + this.bottomLeft) * 31) + this.bottomRight;
}
@NonNull
public String toString(){
return "Corners(topLeft=" + this.topLeft + ", topRight=" + this.topRight + ", bottomLeft=" + this.bottomLeft + ", bottomRight=" + this.bottomRight + ")";
}
public Corners a(int i, int i2){
if ((i2 & 1) > 0) {
this.topLeft = i;
}
if ((i2 & 2) > 0) {
this.topRight = i;
}
if ((i2 & 4) > 0) {
this.bottomLeft = i;
}
if ((i2 & 8) > 0) {
this.bottomRight = i;
}
if (i2 == 0) {
this.topLeft = 0;
this.topRight = 0;
this.bottomLeft = 0;
this.bottomRight = 0;
}
return this;
}
public Corners a(int i, int i2, int i3, int i4){
this.topLeft = i;
this.topRight = i2;
this.bottomLeft = i3;
this.bottomRight = i4;
return this;
}
public Corners a(Corners corners){
this.topLeft = corners.topLeft;
this.topRight = corners.topRight;
this.bottomLeft = corners.bottomLeft;
this.bottomRight = corners.bottomRight;
return this;
}
}
@@ -0,0 +1,137 @@
package com.vk.im.ui.views.avatars;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import com.vk.im.ui.o;
public class StoryBorderView extends View {
private boolean B;
private final Paint a;
private LinearGradient f15747b;
private int f15748c;
private int f15749d;
private int f15750e;
private int f15751f;
private final int g;
private final int h;
public StoryBorderView(Context context) {
this(context, null, 0, 6);
}
public StoryBorderView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0, 4);
}
public StoryBorderView(Context context, AttributeSet attributeSet, int i, int i2) {
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
public int getBorderColor() {
return this.f15749d;
}
public int getBorderGradientEndColor() {
return this.h;
}
public int getBorderGradientStartColor() {
return this.g;
}
public int getBorderWidth() {
return this.f15750e;
}
public int getPadding() {
return this.f15751f;
}
public int getViewSize() {
return this.f15748c;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawOval(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom(), this.a);
}
@Override
protected void onMeasure(int i, int i2) {
int i3 = this.f15748c;
setMeasuredDimension(i3, i3);
}
public void setBorderColor(int i) {
if (this.f15749d != i) {
this.f15749d = i;
this.a.setColor(i);
invalidate();
}
}
public void setBorderWidth(int i) {
if (this.f15750e != i) {
this.f15750e = i;
this.a.setStrokeWidth(i);
invalidate();
}
}
@Override
public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
super.setLayoutParams(layoutParams);
boolean z = false;
this.f15748c = Math.min(layoutParams != null ? layoutParams.width : 0, layoutParams != null ? layoutParams.height : 0);
this.f15747b = new LinearGradient(0.0f, 0.0f, 0.0f, this.f15748c, this.g, this.h, Shader.TileMode.MIRROR);
if (this.f15748c > 0) {
z = true;
}
if (z) {
return;
}
throw new IllegalArgumentException("Only exact size supported, specify avatar sizes in layout params");
}
public void setLive(boolean z) {
if (this.B != z) {
this.a.setShader(z ? this.f15747b : null);
this.a.setColor(z ? -1 : this.f15749d);
this.B = z;
invalidate();
}
}
public void setPadding(int i) {
if (this.f15751f != i) {
this.f15751f = i;
setPadding(i, i, i, i);
}
}
public void setViewSize(int i) {
this.f15748c = i;
}
public StoryBorderView(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
this.a = paint;
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, o.StoryBorderView);
setBorderColor(obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderColor, 0));
this.g = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientStartColor, 0);
this.h = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientEndColor, 0);
setBorderWidth(obtainStyledAttributes.getDimensionPixelSize(o.StoryBorderView_vkim_borderWidth, 0));
obtainStyledAttributes.recycle();
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,304 @@
package com.vk.sharing.view;
import static b.h.z.f.roboto_medium;
import static ru.vtosters.lite.utils.Preferences.preferences;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import androidx.annotation.UiThread;
import androidx.core.content.ContextCompat;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.view.DraweeHolder;
import com.vk.core.util.ContextExtKt;
import com.vk.core.util.Screen;
import com.vk.im.ui.views.avatars.AbbreviationAvatarDrawable;
import com.vk.imageloader.view.VKMultiImageView;
import com.vk.navigation.NavigatorKeys;
import com.vtosters.lite.R;
import com.vtosters.lite.a0;
import java.util.Arrays;
import ru.vtosters.lite.utils.AndroidUtils;
@UiThread
public class TargetImageView extends VKMultiImageView {
private static final int I = Screen.a(2);
private final int B;
private final int C;
private Drawable D;
private String[] F;
private int G;
private final RectF f21629d;
private final Paint f21630e;
private Canvas f21631f;
private final RectF g;
private final Paint h;
public TargetImageView(Context context, Drawable d) {
this(context, null, 0, 6);
}
public TargetImageView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0, 4);
}
public TargetImageView(Context context, AttributeSet attributeSet, int i, int i2) {
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
}
private void e() {
int i = this.G;
for (int i2 = 0; i2 < i; i2++) {
a(i2, this.F[i2]);
}
}
private void f() {
int paddingLeft = getPaddingLeft();
int paddingTop = getPaddingTop();
int width = (getWidth() - paddingLeft) - getPaddingRight();
int height = (getHeight() - paddingTop) - getPaddingBottom();
int i = width / 2;
int i2 = height / 2;
int i3 = this.G;
if (i3 == 1) {
DraweeHolder<GenericDraweeHierarchy> a2 = this.a.a(0);
Drawable d2 = a2.d();
if (d2 != null) {
d2.setBounds(paddingLeft, paddingTop, width + paddingLeft, height + paddingTop);
}
} else if (i3 == 2) {
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(0);
Drawable d3 = a3.d();
if (d3 != null) {
int i4 = i + paddingLeft;
int i5 = height + paddingTop;
d3.setBounds(paddingLeft, paddingTop, i4, i5);
DraweeHolder<GenericDraweeHierarchy> a4 = this.a.a(1);
Drawable d4 = a4.d();
if (d4 != null) {
d4.setBounds(i4, paddingTop, paddingLeft + width, i5);
}
}
} else if (i3 == 3) {
DraweeHolder<GenericDraweeHierarchy> a5 = this.a.a(0);
Drawable d5 = a5.d();
if (d5 != null) {
int i6 = i + paddingLeft;
int i7 = height + paddingTop;
d5.setBounds(paddingLeft, paddingTop, i6, i7);
DraweeHolder<GenericDraweeHierarchy> a6 = this.a.a(1);
Drawable d6 = a6.d();
if (d6 != null) {
int i9 = paddingLeft + width;
int i10 = i2 + paddingTop;
d6.setBounds(i6, paddingTop, i9, i10);
DraweeHolder<GenericDraweeHierarchy> a7 = this.a.a(2);
Drawable d7 = a7.d();
if (d7 != null) {
d7.setBounds(i6, i10, i9, i7);
}
}
}
} else {
DraweeHolder<GenericDraweeHierarchy> a8 = this.a.a(0);
Drawable d8 = a8.d();
if (d8 != null) {
int i11 = i + paddingLeft;
int i13 = i2 + paddingTop;
d8.setBounds(paddingLeft, paddingTop, i11, i13);
DraweeHolder<GenericDraweeHierarchy> a9 = this.a.a(1);
Drawable d9 = a9.d();
if (d9 != null) {
int i16 = height + paddingTop;
d9.setBounds(paddingLeft, i13, i11, i16);
DraweeHolder<GenericDraweeHierarchy> a10 = this.a.a(2);
Drawable d10 = a10.d();
if (d10 != null) {
int i18 = paddingLeft + width;
d10.setBounds(i11, paddingTop, i18, i13);
DraweeHolder<GenericDraweeHierarchy> a11 = this.a.a(3);
Drawable d11 = a11.d();
if (d11 != null) {
d11.setBounds(i11, i13, i18, i16);
}
}
}
}
}
}
private void g() {
if (getWidth() == 0 || getHeight() == 0) {
return;
}
f();
}
private AbbreviationAvatarDrawable getAbbreviationDrawable() {
return a(getContext(), null, 2);
}
private AbbreviationAvatarDrawable a(Context context, Typeface typeface, int i) {
return new AbbreviationAvatarDrawable(context, (i & 2) != 0 ? ContextExtKt.e(context, roboto_medium) : typeface);
}
public void a(String str) {
Arrays.fill(this.F, null);
if (str == null) {
b();
this.G = 1;
g();
e();
return;
}
Uri uri = Uri.parse(str);
if (uri.getScheme().equals("vkchatphoto")) {
this.G = 0;
while (true) {
String queryParameter = uri.getQueryParameter("photo" + this.G);
if (queryParameter != null) {
int i = this.G;
this.G = i + 1;
this.F[i] = queryParameter;
} else {
g();
e();
return;
}
}
} else if (uri.getScheme().equals("vkchatplaceholder")) {
this.G = 1;
g();
AbbreviationAvatarDrawable abbreviationDrawable = getAbbreviationDrawable();
String queryParameter2 = uri.getQueryParameter(NavigatorKeys.Q);
int parseInt = queryParameter2 != null ? Integer.parseInt(queryParameter2) : 0;
String queryParameter3 = uri.getQueryParameter(NavigatorKeys.d);
if (queryParameter3 == null) {
queryParameter3 = "";
}
abbreviationDrawable.a(parseInt, queryParameter3);
a(0, getAbbreviationDrawable());
} else {
this.F[0] = str;
this.G = 1;
g();
e();
}
}
@Override // android.view.View
protected void onDraw(Canvas canvas) {
Canvas canvas2 = this.f21631f;
int pref = preferences.getInt("pic_rounding", 0);
if (canvas2 != null) {
canvas2.drawColor(0, PorterDuff.Mode.CLEAR);
}
int i = this.G;
for (int i2 = 0; i2 < i; i2++) {
DraweeHolder<GenericDraweeHierarchy> a2 = this.a.a(i2);
Drawable d2 = a2.d();
if (d2 != null) {
Canvas canvas3 = this.f21631f;
d2.draw(canvas3);
}
}
if (pref > 0) {
canvas.drawRoundRect(this.f21629d, pref, pref, this.f21630e);
} else {
canvas.drawOval(this.f21629d, this.f21630e);
}
if (isSelected()) {
if (pref > 0) {
canvas.drawRoundRect(this.g.left, this.g.top, this.g.right, this.g.bottom, pref, pref, this.h);
} else {
canvas.drawCircle(this.g.centerX(), this.g.centerY(), this.g.width() / 2, this.h);
}
this.D.draw(canvas);
}
}
@Override // android.view.View
protected void onSizeChanged(int i, int i2, int i3, int i4) {
super.onSizeChanged(i, i2, i3, i4);
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int paddingTop = getPaddingTop();
int i5 = i - paddingRight;
int paddingBottom = i2 - getPaddingBottom();
this.f21629d.set(paddingLeft, paddingTop, i5, paddingBottom);
Bitmap createBitmap = Bitmap.createBitmap(i5, paddingBottom, Bitmap.Config.ARGB_8888);
this.f21631f = new Canvas(createBitmap);
Shader.TileMode tileMode = Shader.TileMode.CLAMP;
this.f21630e.setShader(new BitmapShader(createBitmap, tileMode, tileMode));
float f2 = I / 2;
this.g.set(f2, f2, i - f2, (float) i2 - f2);
float f4 = i / 2;
this.h.setShader(new LinearGradient(f4, 0.0f, f4, (float) i2, this.B, this.C, Shader.TileMode.CLAMP));
Drawable drawable = this.D;
drawable.setBounds(i - drawable.getIntrinsicWidth(), i2 - this.D.getIntrinsicHeight(), i, i2);
f();
}
public TargetImageView(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
this.f21629d = new RectF();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setDither(true);
paint.setFilterBitmap(true);
this.f21630e = paint;
this.g = new RectF();
Paint paint2 = new Paint();
paint2.setAntiAlias(true);
paint2.setStrokeWidth(I);
paint2.setStyle(Paint.Style.STROKE);
this.h = paint2;
this.B = getAccentColor();
this.C = this.B;
Drawable c2 = ContextExtKt.c(context, R.drawable.ic_check_circle_composite_24_full);
if (c2 != null) {
this.D = c2;
this.F = new String[4];
int i2 = I * 2;
setPadding(i2, i2, i2, i2);
if (attributeSet != null) {
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, a0.TargetImageView);
setSelected(obtainStyledAttributes.getBoolean(0, false));
obtainStyledAttributes.recycle();
}
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.user_placeholder);
for (int i3 = 0; i3 <= 3; i3++) {
a();
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(i3);
a3.b().e(drawable);
}
setScaleType(ScalingUtils.b.o);
}
}
}
@@ -55,8 +55,8 @@ public class DNRInjector {
hashMap.put(DialogAction.valueOf("DNT_OFF"), getIdentifier("DNT_OFF", "string"));
hashMap.put(DialogAction.valueOf("pinmsg"), getIdentifier("pinmsg", "string"));
hashMap.put(DialogAction.valueOf("unpinmsg"), getIdentifier("unpinmsg", "string"));
// hashMap.put(DialogAction.valueOf("pinmsg"), getIdentifier("pinmsg", "string"));
// hashMap.put(DialogAction.valueOf("unpinmsg"), getIdentifier("unpinmsg", "string"));
return hashMap;
}
@@ -36,6 +36,16 @@ public class AudioDownloader {
}
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
var musicDir = new File(musicPath);
if (!musicDir.exists()) {
if (musicDir.mkdirs()) {
Log.d("AudioDownloader", "Created music dir");
} else {
Log.e("AudioDownloader", "Failed to create music dir");
return;
}
}
var tempId = track.d;
var downloadPath = musicPath + File.separator + tempId;
@@ -2,6 +2,7 @@ package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.downloaders.VideoDownloader.downloadVideo;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getPhotosDir;
import android.app.DownloadManager;
import android.content.Context;
@@ -23,7 +24,7 @@ public class StoryDownloader {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("photo" + story.E.a);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DCIM, "/Stories/photo" + story.E.a + ".jpg");
request.setDestinationInExternalPublicDir(getPhotosDir().getAbsolutePath(), "/Stories/photo" + story.E.a + ".jpg");
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
return;
}
@@ -5,6 +5,7 @@ import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getVideosDir;
import android.app.AlertDialog;
import android.app.DownloadManager;
@@ -104,7 +105,7 @@ public class VideoDownloader {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(videoFile.toString());
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, videoFile + ".mp4");
request.setDestinationInExternalPublicDir(getVideosDir().getAbsolutePath(), videoFile + ".mp4");
((DownloadManager) getGlobalContext().getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
return;
}
@@ -115,7 +116,7 @@ public class VideoDownloader {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(videoFile.toString());
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, videoFile + ".mp4");
request.setDestinationInExternalPublicDir(getVideosDir().getAbsolutePath(), videoFile + ".mp4");
((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
}));
builder.show();
@@ -1,17 +0,0 @@
package ru.vtosters.lite.hooks;
import com.vk.extensions.ViewExtKt;
import com.vk.navigation.right.RightMenuPresenter;
import ru.vtosters.lite.ui.views.VTLCheckableButton;
public class DayNightButtonHook {
public static void injectOnClick(VTLCheckableButton button, RightMenuPresenter presenter) {
button.postOnAnimationDelayed(() -> {
var rect = ViewExtKt.e(button);
presenter.a(new float[] { rect.centerX(), rect.centerY() });
}, 550); // minimal delay for fix toggle animation
button.toggle();
}
}
@@ -53,7 +53,6 @@ import java.util.Map;
import ru.vtosters.lite.ui.components.DockBarEditorManager;
import ru.vtosters.lite.ui.items.DockBarTab;
import ru.vtosters.lite.utils.ThemesUtils;
public class DockBarInjector {
private static final DockBarEditorManager sManager = DockBarEditorManager.getInstance();
@@ -68,7 +67,6 @@ public class DockBarInjector {
@SuppressLint("RestrictedApi")
public static void inject(BottomNavigationView navigationView) {
navigationView.setBackgroundColor(ThemesUtils.getBackgroundContent());
Menu menu = navigationView.getMenu();
menu.clear();
try {
@@ -88,11 +86,14 @@ public class DockBarInjector {
e.printStackTrace();
}
for (DockBarTab tab : sManager.getSelectedTabs())
menu.add(0, tab.id, 0, tab.titleID)
.setIcon(tab.iconID)
.setCheckable(true);
for (DockBarTab tab : sManager.getSelectedTabs()) {
MenuItem add = menu.add(0, tab.id, 0, tab.titleID);
Drawable drawable = getResources().getDrawable(tab.iconID);
add.setIcon(new RecoloredDrawable(drawable, getCSTDock()));
add.setTitle(getGlobalContext().getString(tab.titleID));
add.setCheckable(true);
}
if (getBoolValue("dockbar_tab_titles", true)) {
var menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
@@ -17,14 +17,10 @@ import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.hasVerification;
import static ru.vtosters.lite.utils.Preferences.podcastcatalog;
import static ru.vtosters.lite.utils.Preferences.postsrecomm;
import static ru.vtosters.lite.utils.ThemesUtils.accentColors;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.hex2;
import static ru.vtosters.lite.utils.VTVerifications.isDeveloper;
import static ru.vtosters.lite.utils.VTVerifications.isPrometheus;
import static ru.vtosters.lite.utils.VTVerifications.isVerified;
import android.graphics.Color;
import android.util.Log;
import com.vk.core.network.Network;
@@ -37,7 +33,6 @@ import org.json.JSONObject;
import java.io.IOException;
import java.text.ParseException;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;
@@ -68,17 +63,6 @@ public class JsonInjectors {
newItem.put(vktesters(id));
}
// get text color from all items
for (int i = 0; i < newItem.length(); i++) {
var item = newItem.getJSONObject(i);
if (item.has("text_color")) {
var textColor = item.getString("text_color");
if (accentColors.contains(Color.parseColor(textColor.startsWith("#") ? textColor : "#" + textColor))) {
item.put("text_color", hex2(getAccentColor()));
}
}
}
orig.put("buttons", newItem);
return orig;
@@ -543,7 +527,7 @@ public class JsonInjectors {
Log.d("VKMusic", "title: " + title + " id: " + id + " url: " + url + " value: " + value);
if (url.contains(value)) {
if (url.contains(value) && !value.isEmpty()) {
catalog.put("default_section", id);
if (dev()) Log.d("VKMusic", "Added " + title + " as default music section");
}
@@ -2,6 +2,7 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.ui.dialogs.ServerDialog.sendRequest;
import static ru.vtosters.lite.utils.CacheUtils.getInstance;
import static ru.vtosters.lite.utils.DeletedMessagesHandler.reloadMessagesList;
import static ru.vtosters.lite.utils.Preferences.checkupdates;
import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme;
import static ru.vtosters.lite.utils.ThemesUtils.setNeededTheme;
@@ -18,11 +19,13 @@ import ru.vtosters.lite.ui.dialogs.ServerDialog;
import ru.vtosters.lite.ui.dialogs.Start;
public class MainActivityInjector {
public static void inject(Activity activity) {
setNeededTheme(activity);
ServerDialog.activity = activity;
sendRequest();
if (checkupdates()) OTADialog.checkUpdates(activity);
reloadMessagesList();
Start.alert(activity);
InstallGMS.alert(activity);
DisableBattery.alert(activity);
@@ -34,6 +37,7 @@ public class MainActivityInjector {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannels.createChannels();
}
// VKIDProtection.alert(activity);
}
}
@@ -14,6 +14,10 @@ import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isMusicBlock;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isNewsBlock;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isPostRecommendations;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isRecomsGroup;
import static ru.vtosters.lite.utils.Preferences.ads;
import static ru.vtosters.lite.utils.Preferences.adsslider;
import static ru.vtosters.lite.utils.Preferences.authorsrecomm;
import static ru.vtosters.lite.utils.Preferences.friendsrecomm;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.vkme;
@@ -23,6 +27,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class NewsfeedHook {
@@ -73,4 +78,42 @@ public class NewsfeedHook {
}
return list;
}
public static String[] feedParams(){
HashSet<String> params = new HashSet<>();
params.add("post");
params.add("photo");
params.add("photo_tag");
if (!friendsrecomm()) {
params.add("friends_recomm");
}
if (!ads()) {
params.add("app_widget");
params.add("promo_button");
}
if (!authorsrecomm()) {
params.add("authors_rec");
}
return params.toArray(new String[0]);
}
public static void adsParams(HashSet hashSet) {
if (ads() || adsslider()) {
hashSet.add("ads_disabled");
return;
}
hashSet.add("ads_app");
hashSet.add("ads_site");
hashSet.add("ads_post");
hashSet.add("ads_app_slider");
hashSet.add("ads_site_slider");
hashSet.add("ads_app_video");
hashSet.add("ads_post_pretty_cards");
hashSet.add("ads_post_snippet_video");
}
}
@@ -0,0 +1,66 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.Preferences.preferences;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import com.facebook.drawee.generic.RoundingParams;
import ru.vtosters.lite.utils.AndroidUtils;
public class PicRoundingHook{
private static final int pref = preferences.getInt("pic_rounding", 0);
public static RoundingParams inject() {
if (pref > 0) {
return customParams();
} else {
return new RoundingParams().a(true);
}
}
public static RoundingParams inject(float orig) {
if (pref > 0) {
return customParams();
} else {
return new RoundingParams().b(orig);
}
}
public static RoundingParams inject(float orig, float orig2, float orig3, float orig4) {
if (pref > 0) {
return new RoundingParams().a(AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref));
} else {
return new RoundingParams().a(orig, orig2, orig3, orig4);
}
}
public static void inject(float orig, Canvas canvas, Paint paint){
if (pref > 0) {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), paint);
} else {
canvas.drawCircle(orig, orig, orig, paint);
}
}
public static void inject(Bitmap bitmap, Bitmap bitmap2, Paint b2) {
Shader.TileMode tileMode = Shader.TileMode.CLAMP;
b2.setShader(new BitmapShader(bitmap2, tileMode, tileMode));
Canvas canvas = new Canvas(bitmap);
float width = bitmap2.getWidth() / 2;
if (pref > 0) {
canvas.drawRoundRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), b2);
} else {
canvas.drawCircle(width, width, width, b2);
}
}
private static RoundingParams customParams(){
return RoundingParams.b(AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref), AndroidUtils.dp2px(pref));
}
}
@@ -9,7 +9,7 @@ import java.util.LinkedHashMap;
public class RequestDumper{
public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap params, String apiver) {
if (method.contains("execute.getGiftByStickerId")) {
if (method.contains("execute.getGiftByStickerId") || method.contains("execute.getNewsfeedCustom")) {
apiver = "5.187";
}
@@ -5,6 +5,7 @@ import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.milkshake;
import static ru.vtosters.lite.utils.Preferences.superapp;
import static ru.vtosters.lite.utils.Preferences.useNewSettings;
import static ru.vtosters.lite.utils.Preferences.videonewcatalog;
import static ru.vtosters.lite.utils.Preferences.vkme;
@@ -33,8 +34,6 @@ import com.vtosters.lite.fragments.y2.VideosFragment;
import com.vtosters.lite.general.fragments.GamesFragment;
import com.vtosters.lite.general.fragments.PhotosFragment;
import ru.vtosters.lite.ui.fragments.VTSettings;
public class StartFragmentHook {
public static Class getStartFragment() {
if (vkme()) {
@@ -56,7 +55,7 @@ public class StartFragmentHook {
case "videos":
return videonewcatalog() ? VideoCatalogFragment.class : VideosFragment.class;
case "settings":
return VTSettings.class;
return useNewSettings();
case "apps":
return AppsFragment.class;
case "discover":
@@ -1,11 +1,16 @@
package ru.vtosters.lite.music;
import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import android.app.DownloadManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import com.vk.dto.music.MusicTrack;
import org.json.JSONException;
@@ -53,12 +58,10 @@ public class MP3Downloader {
if (responseNode.has("url")) {
var url = responseNode.optString("url");
Log.d("MP3Downloader", url);
if (url != null) {
if (url.endsWith(".mp3")) {
downloadMP3(track.toString(), url);
} else if (VKM3UParser.isM3U8(url)) {
AudioDownloader.downloadM3U8(track);
}
if (url.endsWith(".mp3")) {
downloadMP3(track.toString(), url);
} else if (VKM3UParser.isM3U8(url)) {
AudioDownloader.downloadM3U8(track);
}
}
}
@@ -69,13 +72,14 @@ public class MP3Downloader {
});
}
@RequiresApi(api = Build.VERSION_CODES.M)
private static void downloadMP3(String title, String url) {
var downloadManager = AndroidUtils.getGlobalContext().getSystemService(DownloadManager.class);
var request = new DownloadManager.Request(Uri.parse(url))
.setAllowedOverRoaming(true)
.setTitle("Downloading " + title)
.setDestinationInExternalFilesDir(AndroidUtils.getGlobalContext(),
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(),
getMusicDir().getAbsolutePath(),
title + ".mp3")
.setVisibleInDownloadsUi(true);
downloadManager.enqueue(request);
@@ -1,38 +0,0 @@
package ru.vtosters.lite.themes;
import android.content.res.ColorStateList;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import com.vk.core.view.TintTextView;
import ru.vtosters.lite.utils.ThemesUtils;
public class Recolor {
private static int getColor(int original) {
var color = VTLColors.getColor(original);
if (color != -1) return color;
return original;
}
public static void recolorToolbar(Toolbar toolbar) {
if (ThemesUtils.isCustomThemeApplied())
toolbar.setBackgroundColor(ThemesUtils.getHeaderBackground());
}
public static void recolorIconToAccent(ImageView iv) {
if (ThemesUtils.isCustomThemeApplied())
iv.setImageTintList(ColorStateList.valueOf(VTLColors.getAccentColor()));
}
public static void recolorTextToAccent(TextView iv) {
iv.setTextColor(VTLColors.getAccentColor());
}
public static void recolorTintTextViewToAccent(TintTextView ttv) {
ttv.setDrawableTint(VTLColors.getAccentColor());
}
}
@@ -1,94 +0,0 @@
package ru.vtosters.lite.themes;
import android.content.Context;
import android.util.Log;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.ContextExtKt;
import com.vtosters.lite.R;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.themes.models.ThemeModel;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.lite.utils.ThemesUtils;
public class VTLColors {
private static final ThemesManager themesManager = ThemesManager.getInstance();
private static final ThemeModel currentTheme = themesManager.getCurrentTheme();
public static int getAccentColor() {
return getColor(R.attr.accent, R.attr.accentColor, R.attr.colorAccent, R.attr.vk_accent);
}
public static int getTextPrimaryColor() {
return getColor(R.attr.text_primary);
}
public static int getTextSecondaryColor() {
return getColor(R.attr.text_secondary);
}
public static int getTabbarBackground() {
return getColor(R.attr.tabbar_background);
}
public static int getTabbarActiveColor() {
if (ThemesUtils.isCustomThemeApplied())
return getColor(R.attr.tabbar_active_icon);
return Preferences.dockbar_accent()
? getAccentColor()
: AndroidUtils.getResources().getColor(ThemesUtils.isDarkTheme() ? R.color.white : R.color.gray_700);
}
public static int getTabbarInactiveColor() {
if (ThemesUtils.isCustomThemeApplied())
return getColor(R.attr.tabbar_inactive_icon);
return AndroidUtils.getResources().getColor(ThemesUtils.isDarkTheme() ? R.color.gray_500 : R.color.vk_steel_gray_300);
}
public static int getBackgroundContent() {
return getColor(R.attr.background_content);
}
public static int getBackgroundPage() {
return getColor(R.attr.background_page);
}
public static int getHeaderBackground() {
return getColor(R.attr.header_background);
}
public static int getHeaderText() {
return getColor(R.attr.header_text);
}
//region Hooks
public static int getColor(int... attrs) {
return getColor(attrs[0]);
}
public static int getColor(int attr) {
if (ThemesUtils.isCustomThemeApplied()) {
int color = currentTheme.getColor(attr);
if (color != -1)
return color;
}
return VKThemeHelper.d(attr);
}
public static int getColor(Context context, int colorId) {
try {
Log.d("VTLColors", "getColor(Landroid/content/Context;I): " + AndroidUtils.getResources().getResourceEntryName(colorId));
} catch (Throwable ignored) {
}
if (ThemesUtils.isCustomThemeApplied()) {
int color = currentTheme.getColor(colorId);
if (color != -1)
return color;
}
return ContextExtKt.h(context, colorId);
}
//endregion
}
@@ -1,140 +0,0 @@
package ru.vtosters.lite.themes;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Build;
import android.util.AttributeSet;
import android.util.SparseIntArray;
import android.util.TypedValue;
import com.vtosters.lite.R;
import java.lang.reflect.Field;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.utils.ReflectionUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class VTLResources {
private static final int STYLE_NUM_ENTRIES = Build.VERSION.SDK_INT >= 29 ? 7 : 6;
public static final SparseIntArray forcedAttrs = new SparseIntArray();
public static final SparseIntArray otherAttrs = new SparseIntArray();
private static Field dataField;
static {
try {
dataField = ReflectionUtils.getDeclaredField(TypedArray.class, "mData");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
otherAttrs.put(R.attr.vklib_alv_optionIconTint, R.attr.im_dropdown_icon_color);
otherAttrs.put(R.attr.vkim_colorPrimary, R.attr.accent);
otherAttrs.put(R.attr.statusBarColorBack, R.attr.statusBarColorBack);
otherAttrs.put(R.attr.statusBarColorFront, R.attr.statusBarColorFront);
// android attributes
otherAttrs.put(android.R.attr.backgroundTint, R.attr.accent);
otherAttrs.put(android.R.attr.tint, R.attr.accent);
otherAttrs.put(android.R.attr.color, R.attr.accent);
forcedAttrs.put(-0x8e5515, R.attr.accent);
forcedAttrs.put(-0xe6e6e6, R.attr.background_content);
}
public static void prepareTypedArray(TypedArray target, int[] attrs) {
if (!ThemesUtils.isCustomThemeApplied() || attrs == null) return;
var theme = ThemesManager.getInstance().getCurrentTheme();
var data = getData(target);
for (int i = 0; i < attrs.length; i++) {
//var attr = attrs[i];
var off = STYLE_NUM_ENTRIES * i;
var type = data[off];
var replacement = -1;
if (type == TypedValue.TYPE_ATTRIBUTE) {
replacement = theme.getColor(data[off + 0x1]);
} else if (type == TypedValue.TYPE_INT_COLOR_ARGB8 || type == TypedValue.TYPE_INT_COLOR_RGB8) {
replacement = forcedAttrs.get(data[off + 0x1], -1);
if (replacement == -1
&& ThemesUtils.accentColors.contains(data[off + 0x1]))
replacement = ThemesUtils.getAccentColor();
}
if (replacement == -1) continue;
try {
data[off] = TypedValue.TYPE_INT_COLOR_RGB8; // type
data[off + 0x1] = replacement; // data
data[off + 0x2] = 0x0; // asset cookie
data[off + 0x3] = 0x0; // resource id
} catch (Throwable ignored) {
}
}
}
private static int[] getData(TypedArray target) {
try {
return (int[]) dataField.get(target);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return new int[0];
}
//region Hooks
public static TypedArray obtainStyledAttributes(Context context, int[] attrs) {
var target = context.obtainStyledAttributes(attrs);
prepareTypedArray(target, attrs);
return target;
}
public static TypedArray obtainStyledAttributes(Context context, int resId, int[] attrs) {
var target = context.obtainStyledAttributes(resId, attrs);
prepareTypedArray(target, attrs);
return target;
}
public static TypedArray obtainStyledAttributes(Context context, AttributeSet set, int[] attrs) {
var target = context.obtainStyledAttributes(set, attrs);
prepareTypedArray(target, attrs);
return target;
}
public static TypedArray obtainStyledAttributes(Context context, AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
var target = context.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes);
prepareTypedArray(target, attrs);
return target;
}
public static int getColor(Resources res, int colorId) {
return VTLColors.getColor(colorId);//res.getColor(colorId);
}
@SuppressLint("NewApi")
public static int getColor(Resources res, int colorId, Resources.Theme theme) {
return VTLColors.getColor(colorId);
}
@SuppressLint("UseCompatLoadingForColorStateLists")
public static ColorStateList getColorStateList(Resources res, int colorId) {
if (ThemesUtils.isCustomThemeApplied()) {
int color = VTLColors.getColor(colorId);
if (color != -1)
return ColorStateList.valueOf(color);
}
return res.getColorStateList(colorId);
}
@SuppressLint("NewApi")
public static ColorStateList getColorStateList(Resources res, int colorId, Resources.Theme theme) {
if (ThemesUtils.isCustomThemeApplied()) {
int color = VTLColors.getColor(colorId);
if (color != -1)
return ColorStateList.valueOf(color);
}
return res.getColorStateList(colorId, theme);
}
//endregion
}
@@ -1,97 +0,0 @@
package ru.vtosters.lite.themes.managers;
import android.os.Environment;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import ru.vtosters.lite.themes.models.PaletteModel;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
public class PalettesManager {
private static PalettesManager instance;
private static File palettesDir = new File(Environment.getExternalStorageDirectory(), "VTL/themes/palettes");
private List<PaletteModel> palettes = new ArrayList<>();
public static PalettesManager getInstance() {
if (instance == null)
instance = new PalettesManager();
return instance;
}
public PalettesManager() {
load();
}
public void load() {
palettes.clear();
if (!palettesDir.exists())
palettesDir.mkdirs();
final var palettes = palettesDir.listFiles((dir, name) -> name.endsWith(".json"));
var check = true;
if (palettes == null || palettes.length == 0)
check = copyPaletteFromAssets();
if (check)
parsePalettes();
}
private boolean copyPaletteFromAssets() {
try {
final var manager = AndroidUtils.getGlobalContext().getAssets();
final var assets = manager.list("vtl_themes/palettes/");
if (assets == null || assets.length == 0) return false;
var i = 0;
for (var asset : assets) {
try {
IOUtils.copyFile(manager.open("vtl_themes/palettes/" + asset), new File(palettesDir, asset));
i++;
} catch (IOException e) {
e.printStackTrace();
}
}
return i > 0;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
private void parsePalettes() {
var arr = palettesDir.listFiles((dir, name) -> name.endsWith(".json"));
if (arr == null || arr.length == 0)
throw new RuntimeException("Can't load palettes");
for (var file : arr) {
try {
var json = new JSONObject(IOUtils.readAllLines(file));
palettes.add(PaletteModel.fromJson(json));
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}
}
public PaletteModel getPalette(String id) {
for (PaletteModel palette : palettes) {
if (id.equals(palette.id))
return palette;
}
return null;
}
public PaletteModel getPalette(int i) {
return palettes.get(i);
}
public int getPalettesCount() {
return palettes.size();
}
}
@@ -1,247 +0,0 @@
package ru.vtosters.lite.themes.managers;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;
import com.vtosters.lite.auth.VKAccountManager;
import org.json.JSONException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import ru.vtosters.lite.ui.dialogs.ThemesEditorBottomSheetDialog;
import ru.vtosters.lite.themes.models.ThemeModel;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class ThemesManager {
private static File themesDir;
private static ThemesManager instance;
private static ThemeModel currentTheme = null;
private List<ThemeModel> themes = new ArrayList<>();
public static ThemesManager getInstance() {
if (instance == null)
instance = new ThemesManager();
return instance;
}
public ThemesManager() {
init();
}
private void init() {
themes = new ArrayList<>();
currentTheme = new ThemeModel().setName("Тема по умолчанию")
.setAuthor("Разработчики ВК")
.setDarkMode(ThemesUtils.isDarkTheme())
.setId("default");
themes.add(currentTheme);
themesDir = new File(Environment.getExternalStorageDirectory(), "VTL/themes");
if (!themesDir.exists()) {
themesDir.mkdirs();
return;
}
// Support themes from Sova V RE (.svt)
var files = themesDir.listFiles((dir, name) -> name.endsWith(".vtlt") || name.endsWith(".svt") || name.endsWith(".json"));
if (files == null || files.length == 0)
return;
var currentThemeId = AndroidUtils.getPreferences().getString("vtl_theme_id", "default");
for (File file : files) {
try {
ThemeModel theme;
var abs = file.getAbsolutePath();
if (abs.endsWith(".svt") || abs.endsWith(".json"))
theme = svt2vtlt(file);
else
theme = read(file);
if (theme != null) {
Log.d("ThemesManager", theme.toString());
if (currentThemeId.equals(theme.id))
currentTheme = theme;
themes.add(theme);
}
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}
if ("default".equals(currentTheme.id))
setTheme(currentTheme);
}
private ThemeModel svt2vtlt(File file) {
try {
var theme = read(file);
save(theme);
return theme;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void reload() {
init();
}
public File getThemeFile(ThemeModel theme) throws IOException {
if (!themesDir.exists()) {
themesDir.mkdirs();
throw new FileNotFoundException("theme file not found");
}
var themeFile = new File(themesDir, theme.id + ".svt");
if (!themeFile.exists()) {
themeFile = new File(themesDir, theme.id + ".vtlt");
if (!themeFile.exists())
themeFile.createNewFile();
}
return themeFile;
}
public void setTheme(ThemeModel theme) {
AndroidUtils.getPreferences()
.edit()
.putString("vtl_theme_id", theme.id)
.commit();
}
public ThemeModel getTheme(int i) {
return themes.get(i);
}
public ThemeModel getCurrentTheme() {
return currentTheme;
}
public int getThemesCount() {
return themes.size();
}
public boolean isCurrentTheme(ThemeModel theme) {
return currentTheme.id.equals(theme.id);
}
public boolean hasTheme(ThemeModel theme) {
return hasTheme(theme.id);
}
public boolean hasTheme(String id) {
for (ThemeModel theme : themes) {
if (id.equals(theme.id))
return true;
}
return false;
}
/*
* Theme file storing method from Sova V RE is storing json clearly or compressed with gzip.
* If first byte byte is 0x1 or 0x2 json has been compressed with gzip,
* but if first byte is 0x2 next int is length of json string. */
private ThemeModel read(InputStream fis) throws IOException, JSONException {
InputStream is = fis;
var first = is.read();
if (first > 0x0 && first < 0x3) {
var gzis = new GZIPInputStream(is);
var dis = new DataInputStream(gzis);
if (first == 0x2)
dis.readInt();
is = dis;
}
return ThemeModel.fromJson(IOUtils.readAllLines(is));
}
private ThemeModel read(File file) throws IOException, JSONException {
return read(new FileInputStream(file));
}
public void save(ThemeModel theme) throws IOException, JSONException {
var buffer = theme.toJson().toString().getBytes(StandardCharsets.UTF_8);
var fos = new FileOutputStream(getThemeFile(theme));
// writing with data length
fos.write(0x2);
var gzos = new GZIPOutputStream(fos);
var dos = new DataOutputStream(gzos);
dos.writeInt(buffer.length);
dos.write(buffer);
dos.close();
}
public void delete(ThemeModel theme) {
try {
getThemeFile(theme).delete();
} catch (IOException e) {
e.printStackTrace();
}
themes.remove(theme);
if (isCurrentTheme(theme)) {
setTheme(null);
}
}
public void create(Activity activity, String name) throws JSONException, IOException {
var id = name.toLowerCase().replace(" ", "-");
if (hasTheme(id)) {
var i = 1;
while (hasTheme(id + "-" + i)) {
i++;
}
id += "-" + i;
}
var userProfile = VKAccountManager.d().e1();
ThemeModel theme = new ThemeModel()
.setName(name)
.setAuthor(userProfile.c + " " + userProfile.e)
.setDarkMode(true)
// .setColors(DEFAULT_COLORS)
.setId(id);
themes.add(theme);
ThemesEditorBottomSheetDialog.create(activity, theme, false);
save(theme);
}
public void copy(ContentResolver contentResolver, Uri uri) throws IOException, JSONException {
var theme = read(contentResolver.openInputStream(uri));
if (isCurrentTheme(theme)) {
int i = 1;
while (hasTheme(theme.id + "-" + i)) {
i++;
}
theme.id += "-" + i;
}
themes.add(theme);
save(theme);
}
public void share(Context context, ThemeModel theme) throws Exception {
var vmPolicy = StrictMode.getVmPolicy();
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().build());
var intent = new Intent(Intent.ACTION_SEND)
.setType("file/*")
.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(getThemeFile(theme)));
context.startActivity(Intent.createChooser(intent, ""));
StrictMode.setVmPolicy(vmPolicy);
}
}
@@ -1,26 +0,0 @@
package ru.vtosters.lite.themes.models;
public class ColorModel {
public String resName;
public int id;
public int color;
public ColorModel(int id, int color) {
this.id = id;
this.color = color;
}
public ColorModel(String resName, int id, int color) {
this.resName = resName;
this.id = id;
this.color = color;
}
public static ColorModel create(int id, int color) {
return new ColorModel(id, color);
}
public static ColorModel create(String resName, int id, int color) {
return new ColorModel(resName, id, color);
}
}
@@ -1,94 +0,0 @@
package ru.vtosters.lite.themes.models;
import android.graphics.Color;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class PaletteModel {
public String id;
public String name;
public String author;
public List<ColorModel> colors = new ArrayList<>();
public PaletteModel() {
}
public PaletteModel(String id, String name, String author, List<ColorModel> colors) {
this.id = id;
this.name = name;
this.author = author;
this.colors = colors;
}
public PaletteModel setId(String id) {
this.id = id;
return this;
}
public PaletteModel setName(String name) {
this.name = name;
return this;
}
public PaletteModel setAuthor(String author) {
this.author = author;
return this;
}
public PaletteModel setColors(List<ColorModel> colors) {
this.colors = colors;
return this;
}
public PaletteModel setColor(String name, int color) {
this.colors.add(new ColorModel(name, 0, color));
return this;
}
public int getColor(String name) {
for (var item : colors)
if (name.equals(item.resName))
return item.color;
return -1;
}
public static PaletteModel fromJson(JSONObject json) throws JSONException {
var palette = new PaletteModel()
.setId(json.optString("palette_id"))
.setName(json.optString("name"))
.setAuthor(json.optString("author"));
var paletteNode = json.getJSONArray("palette");
for (int i = 0; i < paletteNode.length(); i++) {
var colorNode = paletteNode.getJSONObject(i);
var name = colorNode.getString("name");
if (colorNode.has("colors")) {
var colorsNode = colorNode.getJSONArray("colors");
for (int j = 0; j < colorsNode.length(); j++) {
var subColorNode = colorsNode.getJSONObject(j);
var index = subColorNode.getString("index");
var subColor = subColorNode.getString("color");
if (!subColor.startsWith("#")) subColor = "#" + subColor;
palette.setColor(name + " " + index, Color.parseColor(subColor));
}
} else {
var color = colorNode.getString("color");
if (!color.startsWith("#")) color = "#" + color;
palette.setColor(name, Color.parseColor(color));
}
}
return palette;
}
public static PaletteModel valuesOf(String id, String name, String author, List<ColorModel> colors) {
return new PaletteModel()
.setId(id)
.setName(name)
.setAuthor(author)
.setColors(colors);
}
}
@@ -1,152 +0,0 @@
package ru.vtosters.lite.themes.models;
import android.content.res.Resources;
import android.graphics.Color;
import android.util.Pair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import ru.vtosters.lite.themes.managers.PalettesManager;
import ru.vtosters.lite.utils.AndroidUtils;
public class ThemeModel {
public String author;
public String name;
public boolean isDarkMode;
public String id;
public List<ColorModel> colors = new ArrayList<>();
public ThemeModel() {
}
public ThemeModel(String author, String name, boolean darkMode, String id, List<ColorModel> colors) {
this.author = author;
this.name = name;
this.isDarkMode = darkMode;
this.id = id;
this.colors = colors;
}
public ThemeModel setAuthor(String author) {
this.author = author;
return this;
}
public ThemeModel setName(String name) {
this.name = name;
return this;
}
public ThemeModel setDarkMode(boolean b) {
this.isDarkMode = b;
return this;
}
public ThemeModel setId(String id) {
this.id = id;
return this;
}
public ThemeModel setColors(List<ColorModel> colors) {
this.colors = colors;
return this;
}
public ThemeModel setColor(int attrId, int color) {
this.colors.add(new ColorModel(attrId, color));
return this;
}
public int getColor(int attrId) {
for (var item : colors)
if (attrId == item.id)
return item.color;
return -1;
}
public static ThemeModel valuesOf(String author, String name, boolean darkMode, String id, List<ColorModel> colors) {
var theme = new ThemeModel()
.setAuthor(author)
.setName(name)
.setDarkMode(darkMode)
.setId(id)
.setColors(colors);
return theme;
}
public static ThemeModel fromJson(String json) throws JSONException {
return fromJson(new JSONObject(json));
}
public static ThemeModel fromJson(JSONObject json) {
List<String> palettes;
if (json.has("palettes")) {
palettes = new ArrayList<>();
var arr = json.optString("palettes")
.split("\\||,|&|;");
Collections.addAll(palettes, arr);
}
List<ColorModel> colors = new ArrayList<>();
var colorsJson = json.optJSONObject("colors");
var names = colorsJson.names();
for (int i = 0; i < colorsJson.length(); i++) {
var name = names.optString(i);
var value = colorsJson.optString(name);
int attrId;
try {
attrId = AndroidUtils.getIdentifier(name, "attr");
} catch (Resources.NotFoundException e) {
attrId = AndroidUtils.getIdentifier(name, "color");
}
final int color;
if (value.contains(".")) {
var paletteId = value.substring(0, value.indexOf("."));
var palette = PalettesManager.getInstance().getPalette(paletteId);
var paletteColor = value.substring(value.indexOf(".") + 1);
color = palette.getColor(paletteColor);
} else {
color = Color.parseColor(value.startsWith("#") ? value : "#" + value);
}
colors.add(new ColorModel(name, attrId, color));
}
return valuesOf(
json.optString("author"),
json.optString("name"),
json.optBoolean("dark"),
json.optString("id"),
colors
);
}
public JSONObject toJson() throws JSONException {
var colorsJson = new JSONObject();
for (var item : colors)
colorsJson.put(item.resName, Integer.toHexString(item.color).toUpperCase());
return new JSONObject()
.put("author", this.author)
.put("name", this.name)
.put("dark", this.isDarkMode)
.put("id", this.id)
.put("colors", colorsJson);
}
public ThemeModel clone() {
return new ThemeModel(
author,
name,
isDarkMode,
id,
colors.stream()
.map(colorModel -> new ColorModel(colorModel.resName, colorModel.id, colorModel.color))
.collect(Collectors.toList())
);
}
}
@@ -1,14 +0,0 @@
package ru.vtosters.lite.themes.models;
import android.util.Pair;
import androidx.annotation.IdRes;
import java.util.ArrayList;
import java.util.List;
public class ViewModel {
@IdRes public int id;
public List<Pair<Integer, Integer>> attrs = new ArrayList<>();
}
@@ -1,67 +0,0 @@
package ru.vtosters.lite.themes.proxy;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.XmlRes;
import ru.vtosters.lite.themes.VTLResources;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.utils.ThemesUtils;
public class ProxyResources extends Resources {
private final Resources mOriginalResource;
public ProxyResources(Context context, Resources original) {
this(original);
}
public ProxyResources(Resources original) {
super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration());
mOriginalResource = original;
}
@Override
public int getColor(int id, @Nullable Resources.Theme theme) throws Resources.NotFoundException {
if (ThemesUtils.isCustomThemeApplied()) {
var color = ThemesManager.getInstance().getCurrentTheme().getColor(id);
if (color != -1)
return color;
}
return mOriginalResource.getColor(id, theme);
}
@RequiresApi(api = Build.VERSION_CODES.M)
@NonNull
@Override
public ColorStateList getColorStateList(@XmlRes int id, @Nullable Resources.Theme theme)
throws Resources.NotFoundException {
var target = mOriginalResource.getColorStateList(id, theme);
if (ThemesUtils.isCustomThemeApplied() && ThemesUtils.isAccentedColor(target)) {
return ColorStateList.valueOf(ThemesUtils.getAccentColor());
}
return target;
}
@Nullable
@Override
public Drawable getDrawableForDensity(int id, int density, @Nullable Resources.Theme theme) {
return mOriginalResource.getDrawableForDensity(id, density, theme);
}
@Override
public TypedArray obtainAttributes(AttributeSet set, int[] attrs) {
var ta = super.obtainAttributes(set, attrs);
VTLResources.prepareTypedArray(ta, attrs);
return ta;
}
}
@@ -1,23 +0,0 @@
package ru.vtosters.lite.ui.activities;
import android.os.Bundle;
import android.view.MenuInflater;
import com.vk.core.ui.themes.ThemableActivity;
import ru.vtosters.lite.utils.LifecycleUtils;
public class VTLThemableActivity extends ThemableActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
LifecycleUtils.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
LifecycleUtils.removeActivity(this);
}
}
@@ -1,81 +0,0 @@
package ru.vtosters.lite.ui.adapters;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.vk.core.drawable.BorderDrawable;
import com.vk.core.util.Screen;
import com.vk.stories.view.StoryCircleImageView;
import java.util.List;
import ru.vtosters.lite.themes.models.ColorModel;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class ColorPickerAdapter extends RecyclerView.Adapter<ColorPickerAdapter.ColorPickerViewHolder> {
private List<ColorModel> mColors;
private OnColorSelectListener mSelectListener;
public ColorPickerAdapter(List<ColorModel> colors, OnColorSelectListener selectListener) {
this.mColors = colors;
this.mSelectListener = selectListener;
}
@NonNull
@Override
public ColorPickerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
var container = LayoutInflater.from(parent.getContext())
.inflate(AndroidUtils.getIdentifier("color_picker_item", "layout"), parent, false);
return new ColorPickerViewHolder(container);
}
@Override
public void onBindViewHolder(@NonNull ColorPickerViewHolder holder, int pos) {
holder.bind(mColors.get(pos));
}
@Override
public int getItemCount() {
return mColors.size();
}
public class ColorPickerViewHolder extends RecyclerView.ViewHolder {
private View mContainer;
private FrameLayout mColorPreviewBorder;
private StoryCircleImageView mColorPreview;
private TextView mColorName;
private TextView mColorValue;
public ColorPickerViewHolder(@NonNull View view) {
super(view);
mContainer = view;
mColorPreviewBorder = view.findViewById(AndroidUtils.getIdentifier("color_preview_border", "id"));
mColorPreview = view.findViewById(AndroidUtils.getIdentifier("color_preview", "id"));
mColorName = view.findViewById(AndroidUtils.getIdentifier("color_name", "id"));
mColorValue = view.findViewById(AndroidUtils.getIdentifier("color_value", "id"));
}
public void bind(ColorModel item) {
mContainer.setOnClickListener(v -> mSelectListener.onColorSelected(ColorPickerAdapter.this, item));
mColorPreviewBorder.setBackground(new BorderDrawable(ThemesUtils.isDarkTheme() ? Color.WHITE : Color.BLACK, Screen.c(24.0f), Screen.c(1.0f)));
mColorPreview.setPlaceholderColor(item.color);
mColorName.setText(item.resName);
mColorValue.setText("#" + Integer.toHexString(item.color).toUpperCase());
}
}
public interface OnColorSelectListener {
void onColorSelected(ColorPickerAdapter adapter, ColorModel colorModel);
}
}
@@ -1,63 +0,0 @@
package ru.vtosters.lite.ui.adapters;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.vtosters.lite.R;
import ru.vtosters.lite.themes.managers.PalettesManager;
import ru.vtosters.lite.ui.dialogs.PalettesBottomSheetDialog;
import ru.vtosters.lite.themes.models.PaletteModel;
import ru.vtosters.lite.utils.AndroidUtils;
public class PalettesAdapter extends RecyclerView.Adapter<PalettesAdapter.PaletteViewHolder> {
private PalettesManager manager = PalettesManager.getInstance();
@NonNull
@Override
public PaletteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
var container = LayoutInflater.from(parent.getContext()).inflate(
AndroidUtils.getIdentifier("palette_manager_item", "layout"), parent, false
);
return new PaletteViewHolder(container);
}
@Override
public void onBindViewHolder(@NonNull PaletteViewHolder holder, int pos) {
holder.bind(manager.getPalette(pos));
}
@Override
public int getItemCount() {
return manager.getPalettesCount();
}
public static class PaletteViewHolder extends RecyclerView.ViewHolder {
private View mContainer;
private TextView mName;
private TextView mAuthor;
public PaletteViewHolder(@NonNull View view) {
super(view);
mContainer = view;
mName = view.findViewById(R.id.name);
mAuthor = view.findViewById(AndroidUtils.getIdentifier("author", "id"));
}
public void bind(PaletteModel palette) {
mContainer.setOnClickListener(v -> {
PalettesBottomSheetDialog.create((Activity) v.getContext(), palette);
});
mName.setText(palette.name);
mAuthor.setText(palette.author);
}
}
}
@@ -1,166 +0,0 @@
package ru.vtosters.lite.ui.adapters;
import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import com.vk.core.drawable.BorderDrawable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.Screen;
import com.vk.core.util.ToastUtils;
import com.vtosters.lite.R;
import org.json.JSONException;
import java.io.IOException;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.ui.dialogs.EditTextDialog;
import ru.vtosters.lite.ui.dialogs.ThemesEditorBottomSheetDialog;
import ru.vtosters.lite.themes.models.ThemeModel;
import ru.vtosters.lite.ui.views.NoTouchRadioButton;
import ru.vtosters.lite.ui.vkui.VKUIActionPopup;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class ThemesAdapter extends RecyclerView.Adapter<ThemesAdapter.ThemeViewHolder> {
public ThemesManager mManager = ThemesManager.getInstance();
@NonNull
@Override
public ThemeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
var container = LayoutInflater.from(parent.getContext()).inflate(
AndroidUtils.getIdentifier("theme_manager_item", "layout"), parent, false
);
return new ThemeViewHolder(container);
}
@Override
public void onBindViewHolder(@NonNull ThemeViewHolder holder, int pos) {
holder.bind(mManager.getTheme(pos));
}
@Override
public int getItemCount() {
return mManager.getThemesCount();
}
public class ThemeViewHolder extends RecyclerView.ViewHolder {
private ConstraintLayout mContainer;
private FrameLayout mThemeModePreviewBorder;
private ImageView mThemeModePreview;
private TextView mName;
private TextView mAuthor;
private NoTouchRadioButton mRadioButton;
public ThemeViewHolder(@NonNull View view) {
super(view);
mContainer = (ConstraintLayout) view;
mThemeModePreviewBorder = view.findViewById(AndroidUtils.getIdentifier("theme_mode_preview_border", "id"));
mThemeModePreview = view.findViewById(AndroidUtils.getIdentifier("theme_mode_preview", "id"));
mName = view.findViewById(R.id.name);
mAuthor = view.findViewById(AndroidUtils.getIdentifier("author", "id"));
mRadioButton = view.findViewById(AndroidUtils.getIdentifier("selection", "id"));
}
public void bind(ThemeModel theme) {
var accent = getAccentColorFromCustomTheme(theme);
mThemeModePreviewBorder.setBackground(new BorderDrawable(accent, Screen.c(24.0f), Screen.c(1.0f)));
mThemeModePreview.setImageResource(AndroidUtils.getIdentifier(
"vk_icon_" + (theme.isDarkMode ? "moon" : "sun") + "_outline_28",
"drawable"));
mThemeModePreview.setImageTintList(ColorStateList.valueOf(accent));
var isCurrentTheme = mManager.isCurrentTheme(theme);
if (!isCurrentTheme)
mContainer.setOnClickListener(v -> {
mManager.setTheme(theme);
LifecycleUtils.restartApplication();
});
if (!"default".equals(theme.id))
mContainer.setOnLongClickListener(v -> {
showActionPopup(v.getContext(), v, isCurrentTheme, theme);
return true;
});
else
mContainer.setOnLongClickListener(null);
mRadioButton.setChecked(isCurrentTheme);
mName.setText(theme.name);
mAuthor.setText(theme.author);
}
private void showActionPopup(Context context, View anchorView, boolean isCurrentTheme, ThemeModel theme) {
var builder = new VKUIActionPopup(context, anchorView, true, R.color.colorAccent)
.setItem("Редактировать название",
() -> showEditThemeNameDialog(context, theme))
.setItem("Изменить цвета",
() -> ThemesEditorBottomSheetDialog.create((Activity) context, theme, isCurrentTheme))
.setItem("Поделиться темой", () -> {
try {
mManager.share(context, theme);
} catch (Exception e) {
e.printStackTrace();
ToastUtils.a("Не удалось поделиться темой");
}})
.setItem("Удалить тему", () -> {
mManager.delete(theme);
if (isCurrentTheme)
LifecycleUtils.restartApplication();
else
notifyDataSetChanged();
});
builder.create().d();
}
private void showEditThemeNameDialog(Context context, ThemeModel theme) {
EditTextDialog.create(context, "Редактирование названия темы", "Название темы", theme.name, (dialog, which, editText) -> {
var newName = editText.getText().toString();
if (TextUtils.isEmpty(newName)) {
ToastUtils.a("Название не может быть пустым");
return;
}
if (newName.equals(theme.name)) {
ToastUtils.a("Вы не изменили название");
return;
}
theme.setName(newName);
try {
mManager.save(theme);
notifyDataSetChanged();
} catch (IOException | JSONException e) {
e.printStackTrace();
ToastUtils.a("Не удалось изменить название темы");
}
});
}
}
private int getAccentColorFromCustomTheme(ThemeModel theme) {
if (!"default".equals(theme.id)) {
int color = theme.getColor(R.attr.accent);
if (color != -1)
return color;
color = theme.getColor(R.attr.colorAccent);
if (color != -1)
return color;
color = theme.getColor(R.attr.vk_accent);
if (color != -1)
return color;
}
return VKThemeHelper.d((R.attr.accent));
}
}
@@ -5,6 +5,7 @@ import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.milkshake;
import static ru.vtosters.lite.utils.Preferences.superapp;
import static ru.vtosters.lite.utils.Preferences.useNewSettings;
import static ru.vtosters.lite.utils.Preferences.videonewcatalog;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.Preferences.vkme_notifs;
@@ -42,7 +43,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import ru.vtosters.lite.ui.fragments.VTSettings;
import ru.vtosters.lite.ui.items.DockBarTab;
import ru.vtosters.lite.utils.AndroidUtils;
@@ -261,7 +261,7 @@ public class DockBarEditorManager {
R.drawable.ic_settings_outline_28,
R.string.menu_settings,
R.id.menu_settings,
VTSettings.class);
useNewSettings());
}
}
}
@@ -1,58 +0,0 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.themes.VTLColors.getTextSecondaryColor;
import static ru.vtosters.lite.themes.VTLColors.getTextPrimaryColor;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.LinearLayout;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.ui.vkui.VKUIEditText;
import ru.vtosters.lite.ui.vkui.VKUITextView;
import ru.vtosters.lite.utils.LayoutUtils;
public class EditTextDialog {
public static void create(Context context, String title, String hint, String text, OnClickListener clickListener) {
var container = new LinearLayout(context);
container.setOrientation(LinearLayout.VERTICAL);
container.setPadding(
dp2px(8), dp2px(12), dp2px(8), dp2px(12)
);
if (!TextUtils.isEmpty(hint)) {
var hitText = new VKUITextView(context, VKUITextView.STYLE_SUBHEAD_1);
hitText.setText(hint);
hitText.setPadding(dp2px(8), 0, 0, dp2px(8));
container.addView(hitText, LayoutUtils.createLinear(-2, -2));
}
var editText = new VKUIEditText(context);
if (!TextUtils.isEmpty(text))
editText.setText(text);
editText.setTextColor(getTextPrimaryColor());
editText.setHintTextColor(getTextSecondaryColor());
editText.setPadding(dp2px(8), 0, dp2px(8), 0);
var editTextParams = LayoutUtils.createLinear(-1, dp2px(44));
container.addView(editText, editTextParams);
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
if (!TextUtils.isEmpty(title))
builder.setTitle(title);
builder.setPositiveButton("OK", (dialog, which) -> clickListener.onClick(dialog, which, editText));
builder.setNegativeButton("Отмена", (dialog, which) -> dialog.cancel());
var alert = builder.create();
alert.setView(container);
alert.show();
}
public interface OnClickListener {
void onClick(DialogInterface dialog, int which, EditText editText);
}
}
@@ -29,13 +29,13 @@ public class OTADialog implements OTAUtils.OTAListener {
public void onUpdateApplied() {
mActivity.runOnUiThread(() -> {
// Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show();
// new ModalBottomSheetWrapper(mActivity)
// .setTitle(getString("newversion") + " " + mHelper.getNewVersionName())
// // .setUpdateInfoView(mHelper.getUpdateDescription())
// .setPositiveButton(getString("updateanddownload"), () -> {
// OTADownloader.downloadBuild(mHelper.getDownloadUrl());
// })
// .show();
new ModalBottomSheetWrapper(mActivity)
.setTitle(getString("newversion") + " " + mHelper.getNewVersionName())
.setUpdateInfoView(mHelper.getUpdateDescription())
.setPositiveButton(getString("updateanddownload"), () -> {
OTADownloader.downloadBuild(mHelper.getDownloadUrl());
})
.show();
});
}
@@ -1,29 +0,0 @@
package ru.vtosters.lite.ui.dialogs;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import com.vk.core.util.ToastUtils;
import ru.vtosters.lite.ui.adapters.ColorPickerAdapter;
import ru.vtosters.lite.themes.models.PaletteModel;
public class PalettesBottomSheetDialog {
private static final String TAG = "palettes_copy_color";
public static void create(Activity activity, PaletteModel palette) {
var instance = new VTColorPickerBottomSheetDialog(activity);
var colorPickerAdapter = new ColorPickerAdapter(palette.colors, (adapter, color) -> {
var manager = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(ClipData.newPlainText("color", Integer.toHexString(color.color).toUpperCase()));
ToastUtils.a("Скопировано в буфер обмена");
instance.dismiss();
});
instance.setTitle(palette.name)
.setAdapter(colorPickerAdapter, true)
.show(TAG, true);
}
}
@@ -1,5 +1,4 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
@@ -9,6 +8,7 @@ import android.content.Context;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.utils.LayoutUtils;
@@ -97,18 +97,18 @@ public class ServerDialog {
if (activity != null) {
activity.runOnUiThread(() -> {
// VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
// builder.setTitle(title);
// builder.setMessage(message);
// builder.setCancelable(cancelable);
// builder.setPositiveButton(positiveButton, (dialogInterface, i) -> edit().putBoolean(key, false).apply());
// builder.setNeutralButton(neutralButton, (dialogInterface, i) -> {
// edit().putBoolean(key, false).apply();
// activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse(link)));
// });
// if (getBoolValue(key, true) && showForNotVerified() && showAlert) {
// builder.show();
// }
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(title);
builder.setMessage(message);
builder.setCancelable(cancelable);
builder.setPositiveButton(positiveButton, (dialogInterface, i) -> edit().putBoolean(key, false).apply());
builder.setNeutralButton(neutralButton, (dialogInterface, i) -> {
edit().putBoolean(key, false).apply();
activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse(link)));
});
if (getBoolValue(key, true) && showForNotVerified() && showAlert) {
builder.show();
}
});
}
}
@@ -1,212 +0,0 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import android.app.Activity;
import android.view.Gravity;
import android.widget.LinearLayout;
import androidx.appcompat.widget.SwitchCompat;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.util.ToastUtils;
import org.json.JSONException;
import java.io.IOException;
import ru.vtosters.lite.themes.VTLColors;
import ru.vtosters.lite.themes.managers.PalettesManager;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.themes.models.ColorModel;
import ru.vtosters.lite.ui.adapters.ColorPickerAdapter;
import ru.vtosters.lite.themes.models.PaletteModel;
import ru.vtosters.lite.themes.models.ThemeModel;
import ru.vtosters.lite.ui.views.flask.builder.ColorPickerDialogBuilder;
import ru.vtosters.lite.ui.views.rarepebble.ColorPickerView;
import ru.vtosters.lite.utils.LayoutUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
public class ThemesEditorBottomSheetDialog {
private static final String THEME_EDITOR_TAG = "theme_editor";
private static final String PALETTES_EDITOR_TAG = "palettes_editor";
private static final String[] COLOR_PICKERS = {
"Wheel Color Picker by QuadFlask",
"Palettes",
"Advanced Color Picker by Martin Stone"
};
public static void create(Activity activity, ThemeModel theme, boolean currentTheme) {
var newTheme = theme.clone();
var colorPickerAdapter = new ColorPickerAdapter(newTheme.colors, (adapter, color) -> {
new VkAlertDialog.Builder(activity)
.setItems(COLOR_PICKERS, (dialog, which) -> {
if (which == 0) {
showQuadFlashWheelColorPicker(activity, adapter, color);
} else if (which == 1) {
showPaletteChoiceDialog(activity, adapter, color);
} else if (which == 2) {
showMartinStoneColorPicker(activity, adapter, color);
}
})
.create()
.show();
});
var instance = new VTColorPickerBottomSheetDialog(activity);
addSwitches(instance.getContainer(), newTheme, colorPickerAdapter);
instance.setAdapter(colorPickerAdapter, false)
.setTitle("Редактирование " + theme.name)
.setPositiveButton("Применить", () -> {
String message;
try {
ThemesManager.getInstance().save(newTheme);
message = "Тема изменена";
} catch (IOException | JSONException e) {
e.printStackTrace();
message = "Ошибка при изменении темы";
}
if (currentTheme) {
LifecycleUtils.restartApplication();
return;
}
ToastUtils.a(message);
instance.dismiss();
})
.show(THEME_EDITOR_TAG, true);
}
private static void addSwitches(LinearLayout container, ThemeModel theme, ColorPickerAdapter adapter) {
var context = container.getContext();
var switchesContainer = new LinearLayout(context);
switchesContainer.setOrientation(LinearLayout.HORIZONTAL);
switchesContainer.setPadding(0, dp2px(5), 0, dp2px(5));
container.addView(switchesContainer, LayoutUtils.createLinear(-1, -2));
var amoledTheme = new SwitchCompat(context);
amoledTheme.setTextColor(VTLColors.getTextPrimaryColor());
amoledTheme.setTextSize(16.0f);
amoledTheme.setText("AMOLED-тема");
amoledTheme.setEnabled(theme.isDarkMode);
amoledTheme.setGravity(Gravity.CENTER);
amoledTheme.setOnCheckedChangeListener((buttonView, isChecked) -> {
theme.isDarkMode = isChecked;
if (isChecked) {
replaceToAmoled(theme, adapter);
} else {
replaceToLight(theme, adapter);
}
adapter.notifyDataSetChanged();
});
var darkTheme = new SwitchCompat(context);
darkTheme.setChecked(theme.isDarkMode);
darkTheme.setTextColor(VTLColors.getTextPrimaryColor());
darkTheme.setGravity(Gravity.CENTER);
darkTheme.setTextSize(16.0f);
darkTheme.setText("Темная тема");
darkTheme.setOnCheckedChangeListener((buttonView, isChecked) -> {
theme.isDarkMode = isChecked;
if (isChecked) {
amoledTheme.setEnabled(true);
replaceToDark(theme, adapter);
} else {
amoledTheme.setChecked(false);
amoledTheme.setEnabled(false);
replaceToLight(theme, adapter);
}
adapter.notifyDataSetChanged();
});
var darkThemeParams = LayoutUtils.createLinear(-1, -2);
darkThemeParams.weight = 1.0f;
switchesContainer.addView(darkTheme, darkThemeParams);
var amoledThemeParams = LayoutUtils.createLinear(-1, -2);
amoledThemeParams.weight = 1.0f;
switchesContainer.addView(amoledTheme, amoledThemeParams);
}
private static void replaceToLight(ThemeModel theme, ColorPickerAdapter adapter) {
}
private static void replaceToDark(ThemeModel theme, ColorPickerAdapter adapter) {
}
private static void replaceToAmoled(ThemeModel theme, ColorPickerAdapter adapter) {
}
private static void showMartinStoneColorPicker(
Activity activity,
ColorPickerAdapter adapter,
ColorModel dest) {
var colorPickerView = new ColorPickerView(activity);
colorPickerView.setColor(dest.color);
var alertDialog = new VkAlertDialog.Builder(activity)
.setTitle("Выберите цвет")
.setPositiveButton("Выбрать", (dialog, which) -> {
dest.color = colorPickerView.getColor();
adapter.notifyDataSetChanged();
dialog.dismiss();
})
.create();
alertDialog.setView(colorPickerView);
alertDialog.show();
}
private static void showQuadFlashWheelColorPicker(
Activity activity,
ColorPickerAdapter adapter,
ColorModel dest) {
ColorPickerDialogBuilder
.with(activity)
.setTitle("Выберите цвет")
.showBorder(true)
.setOnColorSelectedListener((dialog, selectedColor) -> {
dest.color = selectedColor;
adapter.notifyDataSetChanged();
dialog.cancel();
})
.build()
.show();
}
private static void showPaletteChoiceDialog(
Activity activity,
ColorPickerAdapter adapter,
ColorModel dest
) {
var palettesManager = PalettesManager.getInstance();
var titles = new String[palettesManager.getPalettesCount()];
for (int i = 0; i < titles.length; i++)
titles[i] = palettesManager.getPalette(i).name;
new VkAlertDialog.Builder(activity)
.setItems(titles, (dialog, which) -> createPaletteColorPicker(
activity,
adapter,
dest,
palettesManager.getPalette(which)))
.create()
.show();
}
private static void createPaletteColorPicker(
Activity activity,
ColorPickerAdapter themeEditAdapter,
ColorModel dest,
PaletteModel palette
) {
var instance = new VTColorPickerBottomSheetDialog(activity);
var colorPickerAdapter = new ColorPickerAdapter(palette.colors, (adapter, color) -> {
dest.color = color.color;
ToastUtils.a("Цвет был изменён");
themeEditAdapter.notifyDataSetChanged();
instance.dismiss();
});
instance.setTitle(palette.name)
.setAdapter(colorPickerAdapter, true)
.show(PALETTES_EDITOR_TAG, true);
}
}
@@ -1,49 +0,0 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.themes.VTLColors.getTextPrimaryColor;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;
import ru.vtosters.lite.downloaders.OTADownloader;
import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper;
import ru.vtosters.lite.utils.OTAUtils;
public class UpdateBottomSheetDialog extends ModalBottomSheetWrapper<UpdateBottomSheetDialog> {
private static final String TAG = "ota";
private Activity mActivity;
public UpdateBottomSheetDialog(Activity activity) {
super(activity);
this.mActivity = activity;
}
public UpdateBottomSheetDialog setUpdateDescriptionText(String changelog) {
var container = new LinearLayout(mActivity);
var changelogView = new TextView(mActivity);
container.setOrientation(LinearLayout.VERTICAL);
changelogView.setPadding(0, dp2px(8), 0, 0);
changelogView.setText(getString("changelog") + ": \n" + changelog);
changelogView.setTextColor(getTextPrimaryColor());
container.addView(changelogView, new LinearLayout.LayoutParams(-1, -2));
return setView(container);
}
public static void create(Activity activity, OTAUtils helper) {
new UpdateBottomSheetDialog(activity)
.setTitle(getString("newversion") + " " + helper.getNewVersionName())
.setUpdateDescriptionText(helper.getUpdateDescription())
.setPositiveButton(getString("updateanddownload"), () -> {
OTADownloader.downloadBuild(helper.getDownloadUrl());
})
.show(TAG);
}
}
@@ -1,41 +0,0 @@
package ru.vtosters.lite.ui.dialogs;
import android.app.Activity;
import android.widget.LinearLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import ru.vtosters.lite.ui.adapters.ColorPickerAdapter;
import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper;
import ru.vtosters.lite.utils.LayoutUtils;
public class VTColorPickerBottomSheetDialog extends ModalBottomSheetWrapper<VTColorPickerBottomSheetDialog> {
private Activity mActivity;
private LinearLayout mContainer;
public VTColorPickerBottomSheetDialog(Activity activity) {
super(activity);
this.mActivity = activity;
mContainer = new LinearLayout(mActivity);
mContainer.setLayoutParams(LayoutUtils.createLinear(-1, -1));
mContainer.setOrientation(LinearLayout.VERTICAL);
}
public VTColorPickerBottomSheetDialog setAdapter(ColorPickerAdapter adapter, boolean searchMode) {
var recyclerView = new RecyclerView(mActivity);
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
var recyclerViewParams = LayoutUtils.createLinear(-1, -1);
mContainer.addView(recyclerView, recyclerViewParams);
mBuilder.a(mContainer);
return setView(mContainer);
}
public LinearLayout getContainer() {
return mContainer;
}
}
@@ -1,6 +1,7 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.Preferences.copyright_post;
import static ru.vtosters.lite.utils.Preferences.offline;
@@ -25,6 +26,21 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
private void prefs() {
findPreference("officialnewssett").setOnPreferenceClickListener(new openofficialsett());
findPreference("cringecopyright").setEnabled(!copyright_post());
findPreference("spamfilters").setSummary(count(getPrefsValue("spamfilters")));
findPreference("sourcenamefilter").setSummary(count(getPrefsValue("sourcenamefilter")));
findPreference("linkfilter").setSummary(count(getPrefsValue("linkfilter")));
}
private String count(String text) {
// count comma separated words in string
var count = text.split(", ").length;
if (count < 1 || text.isEmpty()) {
return "Нет добавленных элементов";
} else {
return "Добавлено " + count + " элементов";
}
}
@Override
@@ -1,6 +1,7 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
import android.os.Bundle;
@@ -9,6 +10,8 @@ import androidx.preference.Preference;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.dialogs.RoundingSeekbarDialog;
public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
@Override
public void onCreate(Bundle bundle) {
@@ -21,6 +24,17 @@ public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
findPreference("stories").setOnPreferenceClickListener(new restart());
findPreference("swipe").setOnPreferenceClickListener(new restart());
findPreference("is_likes_on_right").setOnPreferenceClickListener(new restart());
findPreference("customrounding").setOnPreferenceClickListener(preference -> {
RoundingSeekbarDialog.dialog(getContext());
return true;
});
if (getPreferences().getInt("pic_rounding", 0) == 0) {
findPreference("customrounding").setSummary("Отключено");
} else {
findPreference("customrounding").setSummary("Размер закругления: " + getPreferences().getInt("pic_rounding", 0) + "dp");
}
}
public boolean restart(Preference preference) {
@@ -13,8 +13,10 @@ import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.util.Log;
@@ -40,40 +42,148 @@ import okhttp3.Request;
import ru.vtosters.lite.downloaders.VideoDownloader;
import ru.vtosters.lite.music.Scrobbler;
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
import ru.vtosters.lite.utils.FileUriUtils;
import ru.vtosters.lite.utils.Preferences;
public class MediaFragment extends MaterialPreferenceToolbarFragment {
public static void download(Context ctx) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle());
alertDialog.setTitle("Введите ссылку на видео");
private final int REQUEST_CODE_SET_DOWNLOAD_DIRECTORY = 665;
private final int REQUEST_CODE_SET_MUSIC_DIRECTORY = 666;
private final int REQUEST_CODE_SET_PHOTOS_DIRECTORY = 667;
private final int REQUEST_CODE_SET_VIDEOS_DIRECTORY = 668;
final EditText input = new EditText(ctx);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
input.setLayoutParams(lp);
input.setTextColor(getTextAttr());
input.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
alertDialog.setView(input);
alertDialog.setPositiveButton("Скачать", (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx));
var alert = alertDialog.create();
alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_media", "xml"));
prefs();
}
private void logout(Context ctx) {
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(ctx);
alertDialog.setTitle("Вы уверены?");
alertDialog.setMessage("Вы действительно хотите выйти из аккаунта?");
alertDialog.setPositiveButton("Да", (dialog, which) -> {
Scrobbler.logout();
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
var path = data.getData();
if (path != null) {
var prefs = getPreferences();
var editor = prefs.edit();
var actualPath = FileUriUtils.getFullPathFromTreeUri(path, getContext());
Log.d("MediaFragment", "onActivityResult: " + actualPath);
Log.d("MediaFragment", "onActivityResult: " + requestCode);
switch (requestCode) {
case REQUEST_CODE_SET_DOWNLOAD_DIRECTORY:
editor.putString("downloads_directory", actualPath);
break;
case REQUEST_CODE_SET_MUSIC_DIRECTORY:
editor.putString("music_directory", actualPath);
break;
case REQUEST_CODE_SET_PHOTOS_DIRECTORY:
editor.putString("photos_directory", actualPath);
break;
case REQUEST_CODE_SET_VIDEOS_DIRECTORY:
editor.putString("videos_directory", actualPath);
break;
default:
return;
}
editor.apply();
}
}
}
@Override
public void onResume() {
super.onResume();
prefs();
}
private void prefs() {
findPreference("download_video").setOnPreferenceClickListener(new MediaFragment.download());
findPreference("clearvideohistory").setOnPreferenceClickListener(preference -> {
deleteVideoHistory();
return true;
});
alertDialog.setNeutralButton("Нет", (dialog, which) -> {
dialog.cancel();
findPreference("dateformat").setOnPreferenceChangeListener(new MediaFragment.restart());
findPreference("lastfm_auth").setOnPreferenceClickListener(preference -> {
if (isLoggedIn()) {
logout(getContext());
} else {
lastfmAuth(getContext());
}
return true;
});
findPreference("downloads_directory").setSummary(
"Текущая папка: " + Preferences.getDownloadsDir()
);
findPreference("photos_directory").setSummary(
"Текущая папка: " + Preferences.getPhotosDir()
);
findPreference("videos_directory").setSummary(
"Текущая папка: " + Preferences.getVideosDir()
);
findPreference("music_directory").setSummary(
"Текущая папка: " + Preferences.getMusicDir()
);
findPreference("downloads_directory").setOnPreferenceClickListener(preference -> {
var intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(intent, REQUEST_CODE_SET_DOWNLOAD_DIRECTORY);
return true;
});
findPreference("photos_directory").setOnPreferenceClickListener(preference -> {
var intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(intent, REQUEST_CODE_SET_PHOTOS_DIRECTORY);
return true;
});
findPreference("videos_directory").setOnPreferenceClickListener(preference -> {
var intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(intent, REQUEST_CODE_SET_VIDEOS_DIRECTORY);
return true;
});
findPreference("music_directory").setOnPreferenceClickListener(preference -> {
var intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(intent, REQUEST_CODE_SET_MUSIC_DIRECTORY);
return true;
});
if (isLoggedIn()) {
findPreference("lastfm_auth").setSummary("Вы авторизованы как " + Scrobbler.getUserName());
} else {
findPreference("lastfm_enabled").setEnabled(false);
}
findPreference("select_photo_search_engine").setOnPreferenceClickListener(preference -> {
var items = Arrays.asList(
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("yandex", "drawable"), "Yandex"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("google", "drawable"), "Google"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("microsoft", "drawable"), "Bing")
);
var alert = new VkAlertDialog.Builder(getActivity())
.create();
var listView = (ListView) LayoutInflater.from(getContext()).inflate(com.vtosters.lite.R.layout.abc_select_dialog_material, null, false);
var adapter = new ImagineArrayAdapter(getContext(), items, i -> {
getPreferences().edit().putInt("search_engine", i).apply();
alert.dismiss();
});
adapter.setSelected(getPreferences().getInt("search_engine", 0));
listView.setAdapter(adapter);
alert.setView(listView);
alert.show();
return true;
});
var alert = alertDialog.create();
alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
alert.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(getResources().getColor(com.vtosters.lite.R.color.red));
}
private void lastfmAuth(Context ctx) {
@@ -115,6 +225,22 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
}
private void logout(Context ctx) {
VkAlertDialog.Builder alertDialog = new VkAlertDialog.Builder(ctx);
alertDialog.setTitle("Вы уверены?");
alertDialog.setMessage("Вы действительно хотите выйти из аккаунта?");
alertDialog.setPositiveButton("Да", (dialog, which) -> {
Scrobbler.logout();
});
alertDialog.setNeutralButton("Нет", (dialog, which) -> {
dialog.cancel();
});
var alert = alertDialog.create();
alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
alert.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(getResources().getColor(com.vtosters.lite.R.color.red));
}
public static void deleteVideoHistory() {
Thread thread = new Thread(() -> {
try {
@@ -139,57 +265,22 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
sendToast("История просмотра видео очищена");
}
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_media", "xml"));
prefs();
}
public static void download(Context ctx) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx, getAlertStyle());
alertDialog.setTitle("Введите ссылку на видео");
private void prefs() {
findPreference("download_video").setOnPreferenceClickListener(new MediaFragment.download());
findPreference("clearvideohistory").setOnPreferenceClickListener(preference -> {
deleteVideoHistory();
return true;
});
findPreference("dateformat").setOnPreferenceChangeListener(new MediaFragment.restart());
findPreference("lastfm_auth").setOnPreferenceClickListener(preference -> {
if (isLoggedIn()) {
logout(getContext());
} else {
lastfmAuth(getContext());
}
return true;
});
if (isLoggedIn()) {
findPreference("lastfm_auth").setSummary("Вы авторизованы как " + Scrobbler.getUserName());
} else {
findPreference("lastfm_enabled").setEnabled(false);
}
findPreference("select_photo_search_engine").setOnPreferenceClickListener(preference -> {
var items = Arrays.asList(
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("yandex", "drawable"), "Yandex"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("google", "drawable"), "Google"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("microsoft", "drawable"), "Bing")
);
var alert = new VkAlertDialog.Builder(getActivity())
.create();
var listView = (ListView) LayoutInflater.from(getContext()).inflate(com.vtosters.lite.R.layout.abc_select_dialog_material, null, false);
var adapter = new ImagineArrayAdapter(getContext(), items, i -> {
getPreferences().edit().putInt("search_engine", i).apply();
alert.dismiss();
});
adapter.setSelected(getPreferences().getInt("search_engine", 0));
listView.setAdapter(adapter);
alert.setView(listView);
alert.show();
return true;
});
final EditText input = new EditText(ctx);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
input.setLayoutParams(lp);
input.setTextColor(getTextAttr());
input.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
alertDialog.setView(input);
alertDialog.setPositiveButton("Скачать", (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx));
var alert = alertDialog.create();
alert.show();
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
}
private class download implements Preference.OnPreferenceClickListener {
@@ -1,38 +0,0 @@
package ru.vtosters.lite.ui.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import ru.vtosters.lite.themes.managers.PalettesManager;
import ru.vtosters.lite.ui.adapters.PalettesAdapter;
import ru.vtosters.lite.utils.LayoutUtils;
public class PalettesManagerFragment extends BaseToolbarFragment {
private final PalettesManager mManager = PalettesManager.getInstance();
private PalettesAdapter mAdapter;
@Override
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
setTitle("Палитры");
var container = new FrameLayout(getContext());
mAdapter = new PalettesAdapter();
var recyclerView = new RecyclerView(getContext());
recyclerView.setAdapter(mAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
container.addView(recyclerView, LayoutUtils.createFrame(-1, -1));
return container;
}
}
@@ -14,9 +14,9 @@ import androidx.preference.Preference;
import com.vk.navigation.Navigator;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.utils.LifecycleUtils;
public class ThemesFragment extends MaterialPreferenceToolbarFragment {
@Override
@@ -27,17 +27,6 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment {
}
private void prefs() {
var themesPreference = findPreference("themes");
var themesManager = ThemesManager.getInstance();
// if (themesManager.getThemesCount() > 0)
// themesPreference.setSummary(themesManager.getCurrentTheme().name);
themesPreference.setOnPreferenceClickListener(preference -> {
var intent = new Navigator(ThemesManagerFragment.class).b(getContext());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(intent);
return false;
});
findPreference("navbar").setOnPreferenceClickListener(new restart());
findPreference("milkshake").setOnPreferenceClickListener(new restart());
findPreference("darktheme").setOnPreferenceChangeListener(new restartdark());
@@ -1,142 +0,0 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.themes.VTLColors.getAccentColor;
import android.app.Activity;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.vk.core.util.ToastUtils;
import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import org.json.JSONException;
import java.io.IOException;
import ru.vtosters.lite.themes.managers.ThemesManager;
import ru.vtosters.lite.ui.adapters.ThemesAdapter;
import ru.vtosters.lite.ui.dialogs.EditTextDialog;
import ru.vtosters.lite.utils.LayoutUtils;
public class ThemesManagerFragment extends BaseToolbarFragment {
private static final int IMPORT_REQUEST_CODE = 0x1;
private ThemesAdapter mAdapter;
private ThemesManager mManager = ThemesManager.getInstance();
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case IMPORT_REQUEST_CODE:
if (resultCode != Activity.RESULT_OK)
return;
try {
var data = intent.getData();
if (data != null) {
mManager.copy(getContext().getContentResolver(), data);
mAdapter.notifyDataSetChanged();
} else {
throw new IOException("Error while getting file path");
}
} catch (IOException | JSONException e) {
e.printStackTrace();
ToastUtils.a("Не удалось импортировать тему");
}
break;
}
}
@Override
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
setTitle("Темы");
var container = new FrameLayout(getContext());
mAdapter = new ThemesAdapter();
var recyclerView = new RecyclerView(getContext());
recyclerView.setAdapter(mAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
container.addView(recyclerView, LayoutUtils.createFrame(-1, -1));
var buttonsContainer = new LinearLayout(getContext());
buttonsContainer.setOrientation(LinearLayout.HORIZONTAL);
var params = LayoutUtils.createFrame(-2, -2);
params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
params.setMargins(0, 0, 0, dp2px(12f));
container.addView(buttonsContainer, params);
var addNewTheme = new FloatingActionButton(getContext());
addNewTheme.setImageResource(getIdentifier("ic_add_24", "drawable"));
addNewTheme.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
addNewTheme.setOnClickListener(v -> {
EditTextDialog.create(v.getContext(), "Новая тема", "Название новой темы", null, (dialog, which, editText) -> {
var name = editText.getText().toString();
if (TextUtils.isEmpty(name)) {
ToastUtils.a("Название не может быть пустым");
return;
}
try {
mManager.create(requireActivity(), name);
mAdapter.notifyDataSetChanged();
} catch (IOException | JSONException e) {
e.printStackTrace();
ToastUtils.a("Не удалось изменить название темы");
}
});
});
buttonsContainer.addView(addNewTheme, LayoutUtils.createLinear(-2, -2));
buttonsContainer.addView(new View(getContext()), LayoutUtils.createLinear(dp2px(5), 0));
var importTheme = new FloatingActionButton(getContext());
importTheme.setImageResource(getIdentifier("ic_import", "drawable"));
importTheme.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
importTheme.setImageTintList(ColorStateList.valueOf(Color.WHITE));
importTheme.setOnClickListener(v -> {
var intent = new Intent(Intent.ACTION_GET_CONTENT)
.setType("*/*")
.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(intent, "Выберите тему (.vtlt, .svt)"), IMPORT_REQUEST_CODE);
ToastUtils.a("Возможен импорт тем из сторонней модификации ВК Sova V RE");
});
buttonsContainer.addView(importTheme, LayoutUtils.createLinear(-2, -2));
buttonsContainer.addView(new View(getContext()), LayoutUtils.createLinear(dp2px(5), 0));
var openPalettes = new FloatingActionButton(getContext());
openPalettes.setImageResource(R.drawable.ic_palette_outline_28);
openPalettes.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
openPalettes.setOnClickListener(v -> {
var intent = new Navigator(PalettesManagerFragment.class, new Bundle()).b(getContext());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(intent);
});
buttonsContainer.addView(openPalettes, LayoutUtils.createLinear(-2, -2));
return container;
}
}
@@ -65,8 +65,6 @@ import ru.vtosters.lite.utils.CacheUtils;
import ru.vtosters.lite.utils.SSFSUtils;
public class VTSettings extends MaterialPreferenceToolbarFragment {
public int hideitems = 0;
public static String getValAsString(String stringid, Boolean value) {
if (disableSettingsSumms()) return null;
@@ -1,26 +0,0 @@
package ru.vtosters.lite.ui.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.appcompat.widget.AppCompatRadioButton;
public class NoTouchRadioButton extends AppCompatRadioButton {
public NoTouchRadioButton(Context context) {
super(context);
}
public NoTouchRadioButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoTouchRadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return false;
}
}
@@ -1,95 +0,0 @@
package ru.vtosters.lite.ui.views;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Checkable;
import androidx.appcompat.widget.AppCompatImageButton;
public class VTLCheckableButton extends AppCompatImageButton implements Checkable {
private boolean mIsChecked;
public VTLCheckableButton(Context context) {
super(context);
}
public VTLCheckableButton(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
}
public VTLCheckableButton(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
}
@Override
public Parcelable onSaveInstanceState() {
var state = new CustomState(super.onSaveInstanceState());
state.setChecked(mIsChecked);
return state;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (state instanceof CustomState) {
var customState = ((CustomState) state);
super.onRestoreInstanceState(customState.getSuperState());
mIsChecked = customState.isChecked();
return;
}
super.onRestoreInstanceState(state);
}
@Override
public boolean isChecked() {
return this.mIsChecked;
}
@Override
public void setChecked(boolean checked) {
mIsChecked = checked;
refreshDrawableState();
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
return mIsChecked
? View.mergeDrawableStates(super.onCreateDrawableState(extraSpace + 1), new int[] { android.R.attr.state_checked })
: super.onCreateDrawableState(extraSpace);
}
@Override
public void toggle() {
setChecked(!mIsChecked);
}
static class CustomState extends View.BaseSavedState {
private boolean checked;
public CustomState(Parcelable source) {
super(source);
}
public CustomState(Parcel source) {
super(source);
checked = source.readInt() != 0;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(checked ? 1 : 0);
}
}
}
@@ -1,54 +0,0 @@
package ru.vtosters.lite.ui.views.flask;
import android.graphics.Color;
public class ColorCircle {
private float x, y;
private float[] hsv = new float[3];
private float[] hsvClone;
private int color;
public ColorCircle(float x, float y, float[] hsv) {
set(x, y, hsv);
}
public double sqDist(float x, float y) {
double dx = this.x - x;
double dy = this.y - y;
return dx * dx + dy * dy;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public float[] getHsv() {
return hsv;
}
public float[] getHsvWithLightness(float lightness) {
if (hsvClone == null)
hsvClone = hsv.clone();
hsvClone[0] = hsv[0];
hsvClone[1] = hsv[1];
hsvClone[2] = lightness;
return hsvClone;
}
public void set(float x, float y, float[] hsv) {
this.x = x;
this.y = y;
this.hsv[0] = hsv[0];
this.hsv[1] = hsv[1];
this.hsv[2] = hsv[2];
this.color = Color.HSVToColor(this.hsv);
}
public int getColor() {
return color;
}
}
@@ -1,39 +0,0 @@
package ru.vtosters.lite.ui.views.flask;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import ru.vtosters.lite.ui.views.flask.builder.PaintBuilder;
public class ColorCircleDrawable extends ColorDrawable {
private float strokeWidth;
private Paint strokePaint = PaintBuilder.newPaint().style(Paint.Style.STROKE).stroke(strokeWidth).color(0xff9e9e9e).build();
private Paint fillPaint = PaintBuilder.newPaint().style(Paint.Style.FILL).color(0).build();
private Paint fillBackPaint = PaintBuilder.newPaint().shader(PaintBuilder.createAlphaPatternShader(26)).build();
public ColorCircleDrawable(int color) {
super(color);
}
@Override
public void draw(Canvas canvas) {
canvas.drawColor(0);
int width = canvas.getWidth();
float radius = width / 2f;
strokeWidth = radius / 8f;
this.strokePaint.setStrokeWidth(strokeWidth);
this.fillPaint.setColor(getColor());
canvas.drawCircle(radius, radius, radius - strokeWidth, fillBackPaint);
canvas.drawCircle(radius, radius, radius - strokeWidth, fillPaint);
canvas.drawCircle(radius, radius, radius - strokeWidth, strokePaint);
}
@Override
public void setColor(int color) {
super.setColor(color);
invalidateSelf();
}
}
@@ -1,433 +0,0 @@
package ru.vtosters.lite.ui.views.flask;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog;
import java.util.ArrayList;
import ru.vtosters.lite.ui.views.flask.builder.PaintBuilder;
import ru.vtosters.lite.ui.views.flask.render.ColorWheelRenderOption;
import ru.vtosters.lite.ui.views.flask.render.ColorWheelRenderer;
import ru.vtosters.lite.ui.views.flask.render.SimpleColorWheelRenderer;
public class ColorPickerView extends View {
private static final float STROKE_RATIO = 1.5f;
private AlertDialog dialog;
private Bitmap colorWheel;
private Canvas colorWheelCanvas;
private Bitmap currentColor;
private Canvas currentColorCanvas;
private boolean showBorder;
private int density = 8;
private float lightness = 1;
private float alpha = 1;
private int backgroundColor = 0x00000000;
private Integer initialColors[] = new Integer[]{null, null, null, null, null};
private int colorSelection = 0;
private Integer initialColor;
private Paint colorWheelFill = PaintBuilder.newPaint().color(0).build();
private Paint selectorStroke = PaintBuilder.newPaint().color(0).build();
private Paint alphaPatternPaint = PaintBuilder.newPaint().build();
private ColorCircle currentColorCircle;
private ArrayList<OnColorChangedListener> colorChangedListeners = new ArrayList<>();
private ArrayList<OnColorSelectedListener> listeners = new ArrayList<>();
private LinearLayout colorPreview;
private ColorWheelRenderer renderer;
public ColorPickerView(Context context) {
super(context);
initWith();
}
private void initWith() {
density = 10;
initialColor = 0xffffffff;
renderer = new SimpleColorWheelRenderer();
setDensity(density);
setInitialColor(initialColor, true);
}
public void setDialog(AlertDialog dialog) {
this.dialog = dialog;
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
updateColorWheel();
currentColorCircle = findNearestByColor(initialColor);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
updateColorWheel();
currentColorCircle = findNearestByColor(initialColor);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
updateColorWheel();
}
private void updateColorWheel() {
int width = getMeasuredWidth();
int height = getMeasuredHeight();
if (height < width)
width = height;
if (width <= 0)
return;
if (colorWheel == null || colorWheel.getWidth() != width) {
colorWheel = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
colorWheelCanvas = new Canvas(colorWheel);
alphaPatternPaint.setShader(PaintBuilder.createAlphaPatternShader(26));
}
if (currentColor == null || currentColor.getWidth() != width) {
currentColor = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
currentColorCanvas = new Canvas(currentColor);
}
drawColorWheel();
invalidate();
}
private void drawColorWheel() {
colorWheelCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
currentColorCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
if (renderer == null) return;
float half = colorWheelCanvas.getWidth() / 2f;
float strokeWidth = STROKE_RATIO * (1f + ColorWheelRenderer.GAP_PERCENTAGE);
float maxRadius = half - strokeWidth - half / density;
float cSize = maxRadius / (density - 1) / 2;
ColorWheelRenderOption colorWheelRenderOption = renderer.getRenderOption();
colorWheelRenderOption.density = this.density;
colorWheelRenderOption.maxRadius = maxRadius;
colorWheelRenderOption.cSize = cSize;
colorWheelRenderOption.strokeWidth = strokeWidth;
colorWheelRenderOption.alpha = alpha;
colorWheelRenderOption.lightness = lightness;
colorWheelRenderOption.targetCanvas = colorWheelCanvas;
renderer.initWith(colorWheelRenderOption);
renderer.draw();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int width = 0;
if (widthMode == MeasureSpec.UNSPECIFIED)
width = widthMeasureSpec;
else if (widthMode == MeasureSpec.AT_MOST)
width = MeasureSpec.getSize(widthMeasureSpec);
else if (widthMode == MeasureSpec.EXACTLY)
width = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int height = 0;
if (heightMode == MeasureSpec.UNSPECIFIED)
height = heightMeasureSpec;
else if (heightMode == MeasureSpec.AT_MOST)
height = MeasureSpec.getSize(heightMeasureSpec);
else if (heightMode == MeasureSpec.EXACTLY)
height = MeasureSpec.getSize(heightMeasureSpec);
int squareDimen = width;
if (height < width)
squareDimen = height;
setMeasuredDimension(squareDimen, squareDimen);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE: {
int lastSelectedColor = getSelectedColor();
currentColorCircle = findNearestByPosition(event.getX(), event.getY());
int selectedColor = getSelectedColor();
callOnColorChangedListeners(lastSelectedColor, selectedColor);
initialColor = selectedColor;
updateColorWheel();
invalidate();
break;
}
case MotionEvent.ACTION_UP: {
int selectedColor = getSelectedColor();
if (listeners != null) {
for (OnColorSelectedListener listener : listeners) {
try {
listener.onColorSelected(dialog, selectedColor);
} catch (Exception e) {
e.printStackTrace();
}
}
}
setColorPreviewColor(selectedColor);
invalidate();
break;
}
}
return true;
}
protected void callOnColorChangedListeners(int oldColor, int newColor) {
if (colorChangedListeners != null && oldColor != newColor) {
for (OnColorChangedListener listener : colorChangedListeners) {
try {
listener.onColorChanged(newColor);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(backgroundColor);
float maxRadius = canvas.getWidth() / (1f + ColorWheelRenderer.GAP_PERCENTAGE);
float size = maxRadius / density / 2;
if (colorWheel != null && currentColorCircle != null) {
colorWheelFill.setColor(Color.HSVToColor(currentColorCircle.getHsvWithLightness(this.lightness)));
colorWheelFill.setAlpha((int) (alpha * 0xff));
// a separate canvas is used to erase an issue with the alpha pattern around the edges
// draw circle slightly larger than it needs to be, then erase edges to proper dimensions
currentColorCanvas.drawCircle(currentColorCircle.getX(), currentColorCircle.getY(), size + 4, alphaPatternPaint);
currentColorCanvas.drawCircle(currentColorCircle.getX(), currentColorCircle.getY(), size + 4, colorWheelFill);
selectorStroke = PaintBuilder.newPaint().color(0xffffffff).style(Paint.Style.STROKE).stroke(size * (STROKE_RATIO - 1)).xPerMode(PorterDuff.Mode.CLEAR).build();
if (showBorder) colorWheelCanvas.drawCircle(currentColorCircle.getX(), currentColorCircle.getY(), size + (selectorStroke.getStrokeWidth() / 2f), selectorStroke);
canvas.drawBitmap(colorWheel, 0, 0, null);
currentColorCanvas.drawCircle(currentColorCircle.getX(), currentColorCircle.getY(), size + (selectorStroke.getStrokeWidth() / 2f), selectorStroke);
canvas.drawBitmap(currentColor, 0, 0, null);
}
}
private ColorCircle findNearestByPosition(float x, float y) {
ColorCircle near = null;
double minDist = Double.MAX_VALUE;
for (ColorCircle colorCircle : renderer.getColorCircleList()) {
double dist = colorCircle.sqDist(x, y);
if (minDist > dist) {
minDist = dist;
near = colorCircle;
}
}
return near;
}
private ColorCircle findNearestByColor(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
ColorCircle near = null;
double minDiff = Double.MAX_VALUE;
double x = hsv[1] * Math.cos(hsv[0] * Math.PI / 180);
double y = hsv[1] * Math.sin(hsv[0] * Math.PI / 180);
for (ColorCircle colorCircle : renderer.getColorCircleList()) {
float[] hsv1 = colorCircle.getHsv();
double x1 = hsv1[1] * Math.cos(hsv1[0] * Math.PI / 180);
double y1 = hsv1[1] * Math.sin(hsv1[0] * Math.PI / 180);
double dx = x - x1;
double dy = y - y1;
double dist = dx * dx + dy * dy;
if (dist < minDiff) {
minDiff = dist;
near = colorCircle;
}
}
return near;
}
public int getSelectedColor() {
int color = 0;
if (currentColorCircle != null)
color = Utils.colorAtLightness(currentColorCircle.getColor(), this.lightness);
return Utils.adjustAlpha(this.alpha, color);
}
public Integer[] getAllColors() {
return initialColors;
}
public void setInitialColors(Integer[] colors, int selectedColor) {
this.initialColors = colors;
this.colorSelection = selectedColor;
Integer initialColor = this.initialColors[this.colorSelection];
if (initialColor == null) initialColor = 0xffffffff;
setInitialColor(initialColor, true);
}
public void setInitialColor(int color, boolean updateText) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
this.alpha = Utils.getAlphaPercent(color);
this.lightness = hsv[2];
this.initialColors[this.colorSelection] = color;
this.initialColor = color;
setColorPreviewColor(color);
currentColorCircle = findNearestByColor(color);
}
public void setLightness(float lightness) {
int lastSelectedColor = getSelectedColor();
this.lightness = lightness;
if (currentColorCircle != null) {
this.initialColor = Color.HSVToColor(Utils.alphaValueAsInt(this.alpha), currentColorCircle.getHsvWithLightness(lightness));
callOnColorChangedListeners(lastSelectedColor, this.initialColor);
updateColorWheel();
invalidate();
}
}
public void setColor(int color, boolean updateText) {
setInitialColor(color, updateText);
updateColorWheel();
invalidate();
}
public void setAlphaValue(float alpha) {
int lastSelectedColor = getSelectedColor();
this.alpha = alpha;
this.initialColor = Color.HSVToColor(Utils.alphaValueAsInt(this.alpha), currentColorCircle.getHsvWithLightness(this.lightness));
callOnColorChangedListeners(lastSelectedColor, this.initialColor);
updateColorWheel();
invalidate();
}
public void addOnColorChangedListener(OnColorChangedListener listener) {
this.colorChangedListeners.add(listener);
}
public void addOnColorSelectedListener(OnColorSelectedListener listener) {
this.listeners.add(listener);
}
public void setDensity(int density) {
this.density = Math.max(2, density);
invalidate();
}
public void setColorPreview(LinearLayout colorPreview, Integer selectedColor) {
if (colorPreview == null)
return;
this.colorPreview = colorPreview;
if (selectedColor == null)
selectedColor = 0;
int children = colorPreview.getChildCount();
if (children == 0 || colorPreview.getVisibility() != View.VISIBLE)
return;
for (int i = 0; i < children; i++) {
View childView = colorPreview.getChildAt(i);
if (!(childView instanceof LinearLayout))
continue;
LinearLayout childLayout = (LinearLayout) childView;
if (i == selectedColor) {
childLayout.setBackgroundColor(Color.WHITE);
}
ImageView childImage = childLayout.findViewWithTag("image_preview");
childImage.setClickable(true);
childImage.setTag(i);
childImage.setOnClickListener(v -> {
if (v == null)
return;
Object tag = v.getTag();
if (tag == null || !(tag instanceof Integer))
return;
setSelectedColor((int) tag);
});
}
}
public void setSelectedColor(int previewNumber) {
if (initialColors == null || initialColors.length < previewNumber)
return;
this.colorSelection = previewNumber;
setHighlightedColor(previewNumber);
Integer color = initialColors[previewNumber];
if (color == null)
return;
setColor(color, true);
}
public void setShowBorder(boolean showBorder) {
this.showBorder = showBorder;
}
private void setHighlightedColor(int previewNumber) {
int children = colorPreview.getChildCount();
if (children == 0 || colorPreview.getVisibility() != View.VISIBLE)
return;
for (int i = 0; i < children; i++) {
View childView = colorPreview.getChildAt(i);
if (!(childView instanceof LinearLayout))
continue;
LinearLayout childLayout = (LinearLayout) childView;
if (i == previewNumber) {
childLayout.setBackgroundColor(Color.WHITE);
} else {
childLayout.setBackgroundColor(Color.TRANSPARENT);
}
}
}
private void setColorPreviewColor(int newColor) {
if (colorPreview == null || initialColors == null || colorSelection > initialColors.length || initialColors[colorSelection] == null)
return;
int children = colorPreview.getChildCount();
if (children == 0 || colorPreview.getVisibility() != View.VISIBLE)
return;
View childView = colorPreview.getChildAt(colorSelection);
if (!(childView instanceof LinearLayout))
return;
LinearLayout childLayout = (LinearLayout) childView;
ImageView childImage = childLayout.findViewWithTag("image_preview");
childImage.setImageDrawable(new ColorCircleDrawable(newColor));
}
}
@@ -1,5 +0,0 @@
package ru.vtosters.lite.ui.views.flask;
public interface OnColorChangedListener {
void onColorChanged(int selectedColor);
}
@@ -1,7 +0,0 @@
package ru.vtosters.lite.ui.views.flask;
import androidx.appcompat.app.AlertDialog;
public interface OnColorSelectedListener {
void onColorSelected(AlertDialog dialog, int selectedColor);
}
@@ -1,40 +0,0 @@
package ru.vtosters.lite.ui.views.flask;
import android.graphics.Color;
/**
* Created by Charles Andersons on 4/17/15.
*/
public class Utils {
public static float getAlphaPercent(int argb) {
return Color.alpha(argb) / 255f;
}
public static int alphaValueAsInt(float alpha) {
return Math.round(alpha * 255);
}
public static int adjustAlpha(float alpha, int color) {
return alphaValueAsInt(alpha) << 24 | (0x00ffffff & color);
}
public static int colorAtLightness(int color, float lightness) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] = lightness;
return Color.HSVToColor(hsv);
}
public static float lightnessOfColor(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
return hsv[2];
}
public static String getHexString(int color, boolean showAlpha) {
int base = showAlpha ? 0xFFFFFFFF : 0xFFFFFF;
String format = showAlpha ? "#%08X" : "#%06X";
return String.format(format, (base & color)).toUpperCase();
}
}
@@ -1,105 +0,0 @@
package ru.vtosters.lite.ui.views.flask.builder;
import android.content.Context;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.ui.views.flask.ColorPickerView;
import ru.vtosters.lite.ui.views.flask.OnColorChangedListener;
import ru.vtosters.lite.ui.views.flask.OnColorSelectedListener;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils;
public class ColorPickerDialogBuilder {
private Context context;
private VkAlertDialog.Builder builder;
private LinearLayout pickerContainer;
private ColorPickerView colorPickerView;
private LinearLayout colorPreview;
private boolean isBorderEnabled = true;
private Integer[] initialColor = new Integer[]{null, null, null, null, null};
private ColorPickerDialogBuilder(Context context) {
this.context = context;
builder = new VkAlertDialog.Builder(context);
pickerContainer = new LinearLayout(context);
pickerContainer.setOrientation(LinearLayout.VERTICAL);
pickerContainer.setGravity(Gravity.CENTER_HORIZONTAL);
LinearLayout.LayoutParams layoutParamsForColorPickerView = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0);
layoutParamsForColorPickerView.weight = 1;
colorPickerView = new ColorPickerView(context);
pickerContainer.addView(colorPickerView, layoutParamsForColorPickerView);
}
public static ColorPickerDialogBuilder with(Context context) {
return new ColorPickerDialogBuilder(context);
}
public ColorPickerDialogBuilder setTitle(String title) {
builder.setTitle(title);
return this;
}
public ColorPickerDialogBuilder setTitle(int titleId) {
builder.setTitle(titleId);
return this;
}
public ColorPickerDialogBuilder density(int density) {
colorPickerView.setDensity(density);
return this;
}
public ColorPickerDialogBuilder setOnColorChangedListener(OnColorChangedListener onColorChangedListener) {
colorPickerView.addOnColorChangedListener(onColorChangedListener);
return this;
}
public ColorPickerDialogBuilder setOnColorSelectedListener(OnColorSelectedListener onColorSelectedListener) {
colorPickerView.addOnColorSelectedListener(onColorSelectedListener);
return this;
}
public ColorPickerDialogBuilder showBorder(boolean showBorder) {
isBorderEnabled = showBorder;
return this;
}
public AlertDialog build() {
colorPickerView.setInitialColors(initialColor, getStartOffset(initialColor));
colorPickerView.setShowBorder(isBorderEnabled);
colorPreview = new LinearLayout(context);
colorPreview.setLayoutParams(LayoutUtils.createLinear(-2, AndroidUtils.dp2px(40)));
colorPreview.setOrientation(LinearLayout.HORIZONTAL);
colorPreview.setGravity(Gravity.CENTER);
pickerContainer.addView(colorPreview);
colorPickerView.setColorPreview(colorPreview, getStartOffset(initialColor));
var dialog = builder.create();
dialog.setView(pickerContainer);
colorPickerView.setDialog(dialog);
return dialog;
}
private Integer getStartOffset(Integer[] colors) {
Integer start = 0;
for (int i = 0; i < colors.length; i++) {
if (colors[i] == null) {
return start;
}
start = (i + 1) / 2;
}
return start;
}
}
@@ -1,82 +0,0 @@
package ru.vtosters.lite.ui.views.flask.builder;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
public class PaintBuilder {
public static PaintHolder newPaint() {
return new PaintHolder();
}
public static class PaintHolder {
private Paint paint;
private PaintHolder() {
this.paint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
public PaintHolder color(int color) {
this.paint.setColor(color);
return this;
}
public PaintHolder antiAlias(boolean flag) {
this.paint.setAntiAlias(flag);
return this;
}
public PaintHolder style(Paint.Style style) {
this.paint.setStyle(style);
return this;
}
public PaintHolder mode(PorterDuff.Mode mode) {
this.paint.setXfermode(new PorterDuffXfermode(mode));
return this;
}
public PaintHolder stroke(float width) {
this.paint.setStrokeWidth(width);
return this;
}
public PaintHolder xPerMode(PorterDuff.Mode mode) {
this.paint.setXfermode(new PorterDuffXfermode(mode));
return this;
}
public PaintHolder shader(Shader shader) {
this.paint.setShader(shader);
return this;
}
public Paint build() {
return this.paint;
}
}
public static Shader createAlphaPatternShader(int size) {
size /= 2;
size = Math.max(8, size * 2);
return new BitmapShader(createAlphaBackgroundPattern(size), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
}
private static Bitmap createAlphaBackgroundPattern(int size) {
Paint alphaPatternPaint = PaintBuilder.newPaint().build();
Bitmap bm = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bm);
int s = Math.round(size / 2f);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
if ((i + j) % 2 == 0) alphaPatternPaint.setColor(0xffffffff);
else alphaPatternPaint.setColor(0xffd0d0d0);
c.drawRect(i * s, j * s, (i + 1) * s, (j + 1) * s, alphaPatternPaint);
}
return bm;
}
}
@@ -1,34 +0,0 @@
package ru.vtosters.lite.ui.views.flask.render;
import java.util.ArrayList;
import java.util.List;
import ru.vtosters.lite.ui.views.flask.ColorCircle;
public abstract class AbsColorWheelRenderer implements ColorWheelRenderer {
protected ColorWheelRenderOption colorWheelRenderOption;
protected List<ColorCircle> colorCircleList = new ArrayList<>();
public void initWith(ColorWheelRenderOption colorWheelRenderOption) {
this.colorWheelRenderOption = colorWheelRenderOption;
this.colorCircleList.clear();
}
@Override
public ColorWheelRenderOption getRenderOption() {
if (colorWheelRenderOption == null) colorWheelRenderOption = new ColorWheelRenderOption();
return colorWheelRenderOption;
}
public List<ColorCircle> getColorCircleList() {
return colorCircleList;
}
protected int getAlphaValueAsInt() {
return Math.round(colorWheelRenderOption.alpha * 255);
}
protected int calcTotalCount(float radius, float size) {
return Math.max(1, (int) ((1f - GAP_PERCENTAGE) * Math.PI / (Math.asin(size / radius)) + 0.5f));
}
}
@@ -1,10 +0,0 @@
package ru.vtosters.lite.ui.views.flask.render;
import android.graphics.Canvas;
public class ColorWheelRenderOption {
public int density;
public float maxRadius;
public float cSize, strokeWidth, alpha, lightness;
public Canvas targetCanvas;
}
@@ -1,17 +0,0 @@
package ru.vtosters.lite.ui.views.flask.render;
import java.util.List;
import ru.vtosters.lite.ui.views.flask.ColorCircle;
public interface ColorWheelRenderer {
float GAP_PERCENTAGE = 0.025f;
void draw();
ColorWheelRenderOption getRenderOption();
void initWith(ColorWheelRenderOption colorWheelRenderOption);
List<ColorCircle> getColorCircleList();
}
@@ -1,46 +0,0 @@
package ru.vtosters.lite.ui.views.flask.render;
import android.graphics.Color;
import android.graphics.Paint;
import ru.vtosters.lite.ui.views.flask.ColorCircle;
import ru.vtosters.lite.ui.views.flask.builder.PaintBuilder;
public class SimpleColorWheelRenderer extends AbsColorWheelRenderer {
private Paint selectorFill = PaintBuilder.newPaint().build();
private float[] hsv = new float[3];
@Override
public void draw() {
final int setSize = colorCircleList.size();
int currentCount = 0;
float half = colorWheelRenderOption.targetCanvas.getWidth() / 2f;
int density = colorWheelRenderOption.density;
float maxRadius = colorWheelRenderOption.maxRadius;
for (int i = 0; i < density; i++) {
float p = (float) i / (density - 1); // 0~1
float radius = maxRadius * p;
float size = colorWheelRenderOption.cSize;
int total = calcTotalCount(radius, size);
for (int j = 0; j < total; j++) {
double angle = Math.PI * 2 * j / total + (Math.PI / total) * ((i + 1) % 2);
float x = half + (float) (radius * Math.cos(angle));
float y = half + (float) (radius * Math.sin(angle));
hsv[0] = (float) (angle * 180 / Math.PI);
hsv[1] = radius / maxRadius;
hsv[2] = colorWheelRenderOption.lightness;
selectorFill.setColor(Color.HSVToColor(hsv));
selectorFill.setAlpha(getAlphaValueAsInt());
colorWheelRenderOption.targetCanvas.drawCircle(x, y, size - colorWheelRenderOption.strokeWidth, selectorFill);
if (currentCount >= setSize)
colorCircleList.add(new ColorCircle(x, y, hsv));
else colorCircleList.get(currentCount).set(x, y, hsv);
currentCount++;
}
}
}
}
@@ -1,53 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.content.Context;
import android.graphics.Bitmap;
public class AlphaView extends SliderViewBase implements ColorObserver {
private ObservableColor observableColor = new ObservableColor(0);
public AlphaView(Context context) {
super(context);
}
public void observeColor(ObservableColor observableColor) {
this.observableColor = observableColor;
observableColor.addObserver(this);
}
@Override
public void updateColor(ObservableColor observableColor) {
setPos((float)observableColor.getAlpha()/0xff);
updateBitmap();
invalidate();
}
@Override
protected void notifyListener(float currentPos) {
observableColor.updateAlpha((int)(currentPos * 0xff), this);
}
@Override
protected int getPointerColor(float currentPos) {
float solidColorLightness = observableColor.getLightness();
float posLightness = 1 + currentPos * (solidColorLightness - 1);
return posLightness > 0.5f ? 0xff000000 : 0xffffffff;
}
@Override
protected Bitmap makeBitmap(int w, int h) {
final boolean isWide = w > h;
final int n = Math.max(w, h);
int color = observableColor.getColor();
int[] colors = new int[n];
for (int i = 0; i < n; ++i) {
float alpha = isWide ? (float)i / n : 1 - (float)i / n;
colors[i] = color & 0xffffff | (int)(alpha * 0xff) << 24;
}
final int bmpWidth = isWide ? w : 1;
final int bmpHeight = isWide ? 1 : h;
return Bitmap.createBitmap(colors, bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888);
}
}
@@ -1,6 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
public interface ColorObserver {
void updateColor(ObservableColor observableColor);
}
@@ -1,148 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.InputFilter;
import android.text.InputType;
import android.text.method.DigitsKeyListener;
import android.view.Gravity;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import ru.vtosters.lite.utils.LayoutUtils;
public class ColorPickerView extends FrameLayout {
private AlphaView alphaView;
private EditText hexEdit;
private ObservableColor observableColor = new ObservableColor(0);
private SwatchView swatchView;
public ColorPickerView(Context context) {
super(context);
var container = new LinearLayout(context);
container.setOrientation(LinearLayout.VERTICAL);
container.setPadding(dp2px(16), dp2px(16), dp2px(16), dp2px(16));
container.setGravity(Gravity.CENTER);
this.addView(container, LayoutUtils.createFrame(-2, -2));
var colorPickerFrame = new FrameLayout(context);
var colorPickerFrameParams = LayoutUtils.createLinear(-2, -2);
colorPickerFrameParams.weight = 1.0f;
container.addView(colorPickerFrame, colorPickerFrameParams);
swatchView = new SwatchView(context);
colorPickerFrame.addView(swatchView, LayoutUtils.createFrame(-2, -2));
HueSatView hueSatView = new HueSatView(context);
colorPickerFrame.addView(hueSatView, LayoutUtils.createFrame(-2, -2));
ValueView valueView = new ValueView(context);
var valueViewParams = LayoutUtils.createLinear(-1, dp2px(36));
valueViewParams.topMargin = dp2px(16);
container.addView(valueView, valueViewParams);
alphaView = new AlphaView(context);
var alphaViewParams = LayoutUtils.createLinear(-1, dp2px(36));
valueViewParams.topMargin = dp2px(16);
container.addView(alphaView, alphaViewParams);
hexEdit = new EditText(context);
hexEdit.setText("00000000");
hexEdit.setKeyListener(DigitsKeyListener.getInstance("0123456789ABCDEFabcdef"));
hexEdit.setGravity(Gravity.CENTER_HORIZONTAL);
hexEdit.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(4) });
hexEdit.setBackground(null);
hexEdit.setTypeface(Typeface.MONOSPACE);
hexEdit.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
hexEdit.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
container.addView(hexEdit, LayoutUtils.createLinear(-1, -2));
swatchView.observeColor(observableColor);
hueSatView.observeColor(observableColor);
valueView.observeColor(observableColor);
alphaView.observeColor(observableColor);
HexEdit.setUpListeners(hexEdit, observableColor);
showAlpha(true);
showHex(true);
showPreview(true);
// We get all our state saved and restored for free,
// thanks to the EditText and its listeners!
}
/** Returns the color selected by the user */
public int getColor() {
return observableColor.getColor();
}
/**
* Sets the original color swatch and the current color to the specified value.<br>
* Using dark colors may lead to a loss of color information caused by the ARGB color space.
* Use {@link #setColor(int, float, float, float)} instead to avoid this.
*/
public void setColor(int color) {
setOriginalColor(color);
setCurrentColor(color);
}
/**
* Sets the original color swatch and the current color to the specified value.
*
* <ul>
* <li>Alpha [0...255]</li>
* <li>Hue [0...360)</li>
* <li>Saturation [0...1]</li>
* <li>Brightness [0...1]</li>
* </ul>
*/ public void setColor(int alpha, float hue, float sat, float bri) {
setOriginalColor(alpha, hue, sat, bri);
setCurrentColor(alpha, hue, sat, bri);
}
/** Sets the original color swatch without changing the current color. */
public void setOriginalColor(int color) {
swatchView.setOriginalColor(color);
}
/** Sets the original color swatch without changing the current color. */
public void setOriginalColor(int alpha, float hue, float sat, float bri) {
int color = Color.HSVToColor(alpha, new float[]{hue, sat, bri});
swatchView.setOriginalColor(color);
}
/** Updates the current color without changing the original color swatch. */
public void setCurrentColor(int color) {
observableColor.updateColor(color, null);
}
/** Updates the current color without changing the original color swatch. */
public void setCurrentColor(int alpha, float hue, float sat, float bri) {
observableColor.updateColor(alpha, hue, sat, bri, null);
}
public void showAlpha(boolean showAlpha) {
alphaView.setVisibility(showAlpha ? View.VISIBLE : View.GONE);
HexEdit.setShowAlphaDigits(hexEdit, showAlpha);
}
public void addColorObserver(ColorObserver observer) {
observableColor.addObserver(observer);
}
public void showHex(boolean showHex) {
hexEdit.setVisibility(showHex ? View.VISIBLE : View.GONE);
}
public void showPreview(boolean showPreview) {
swatchView.setVisibility(showPreview ? View.VISIBLE : View.GONE);
}
}
@@ -1,96 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.graphics.Color;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextWatcher;
import android.widget.EditText;
class HexEdit {
private static InputFilter[] withoutAlphaDigits = {new ColorPasteLengthFilter()};
private static InputFilter[] withAlphaDigits = {new InputFilter.LengthFilter(8)};
public static void setUpListeners(final EditText hexEdit, final ObservableColor observableColor) {
class MultiObserver implements ColorObserver, TextWatcher {
@Override
public void updateColor(ObservableColor observableColor) {
final String colorString = formatColor(observableColor.getColor());
// Prevent onTextChanged getting called when we update text programmatically
hexEdit.removeTextChangedListener(this);
hexEdit.setText(colorString);
hexEdit.addTextChangedListener(this);
}
private String formatColor(int color) {
return shouldTrimAlphaDigits()
? String.format("%06x", color & 0x00ffffff)
: String.format("%08x", color);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int color = parseHexColor(s);
if (shouldTrimAlphaDigits()) color = color | 0xff000000;
observableColor.updateColor(color, this);
}
@Override
public void afterTextChanged(Editable s) {
}
private boolean shouldTrimAlphaDigits() {
return hexEdit.getFilters() == withoutAlphaDigits;
}
}
final MultiObserver multiObserver = new MultiObserver();
hexEdit.addTextChangedListener(multiObserver);
observableColor.addObserver(multiObserver);
setShowAlphaDigits(hexEdit, true);
}
private static int parseHexColor(CharSequence s) {
try {
return (int)(Long.parseLong(s.toString(), 16) & 0xffffffffL);
}
catch (NumberFormatException e) {
return Color.GRAY;
}
}
public static void setShowAlphaDigits(final EditText hexEdit, boolean showAlphaDigits) {
hexEdit.setFilters(showAlphaDigits ? withAlphaDigits : withoutAlphaDigits);
hexEdit.setText(hexEdit.getText()); // trigger a reformat of text
}
private static class ColorPasteLengthFilter implements InputFilter {
private static final int MAX_LENGTH = 6;
private static final int PASTED_LEN = 8;
private final InputFilter sixDigitFilter = new InputFilter.LengthFilter(MAX_LENGTH);
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
// If 8 digits have been pasted, replacing all source, trim alpha digits.
// Otherwise standard LengthFilter behavior.
final int srcLength = end - start;
final int dstSelLength = dend - dstart;
if (srcLength == PASTED_LEN && dstSelLength == dest.length()) {
// Discard alpha digits:
return source.subSequence(PASTED_LEN - MAX_LENGTH, PASTED_LEN);
}
else {
return sixDigitFilter.filter(source, start, end, dest, dstart, dend);
}
}
}
}
@@ -1,205 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
public class HueSatView extends SquareView implements ColorObserver {
private Paint borderPaint;
private Paint pointerPaint;
private Path pointerPath;
private Path borderPath;
private Rect viewRect = new Rect();
private int w;
private int h;
// Bitmap is generated once and shared across instances.
private static Bitmap bitmap;
private final PointF pointer = new PointF();
private ObservableColor observableColor = new ObservableColor(0);
public HueSatView(Context context) {
super(context);
borderPaint = Resources.makeLinePaint();
pointerPaint = Resources.makeLinePaint();
pointerPaint.setColor(0xff000000);
pointerPath = Resources.makePointerPath();
borderPath = new Path();
if (bitmap == null) {
bitmap = makeBitmap(optimalBitmapSize());
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// Need clipPath() and setLayerType()...
throw new UnsupportedOperationException("Android API 10 and below is not supported.");
}
else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
// clipPath() is only supported on a software layer.
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
}
private int optimalBitmapSize() {
final int scale = 2;
final int maxBitmapSize = 128;
final DisplayMetrics dm = getResources().getDisplayMetrics();
return Math.min(maxBitmapSize, Math.min(dm.widthPixels, dm.heightPixels) / scale);
}
public void observeColor(ObservableColor observableColor) {
this.observableColor = observableColor;
observableColor.addObserver(this);
}
@Override
public void updateColor(ObservableColor observableColor) {
setPointer(pointer, observableColor.getHue(), observableColor.getSat(), w);
optimisePointerColor();
invalidate();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.w = w;
this.h = h;
viewRect.set(0, 0, w, h);
float inset = borderPaint.getStrokeWidth() / 2;
makeBorderPath(borderPath, w, h, inset);
// Sets pointer position
updateColor(observableColor);
}
private static void makeBorderPath(Path borderPath, int w, int h, float inset) {
w -= inset;
h -= inset;
borderPath.reset();
borderPath.moveTo(w, inset);
borderPath.lineTo(w, h);
borderPath.lineTo(inset, h);
borderPath.addArc(new RectF(inset, inset, 2 * w, 2 * h), 180, 270);
borderPath.close();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
boolean withinPicker = clamp(pointer, event.getX(), event.getY(), true);
if (withinPicker) update();
return withinPicker;
case MotionEvent.ACTION_MOVE:
clamp(pointer, event.getX(), event.getY(), false);
update();
getParent().requestDisallowInterceptTouchEvent(true);
return true;
}
return super.onTouchEvent(event);
}
private void update() {
observableColor.updateHueSat(
hueForPos(pointer.x, pointer.y, w),
satForPos(pointer.x, pointer.y, w),
this);
optimisePointerColor();
invalidate();
}
private boolean clamp(PointF pointer, float x, float y, boolean rejectOutside) {
x = Math.min(x, w);
y = Math.min(y, h);
final float dx = w - x;
final float dy = h - y;
final float r = (float)Math.sqrt(dx * dx + dy * dy);
boolean outside = r > w;
if (!outside || !rejectOutside) {
if (outside) {
x = w - dx * w / r;
y = w - dy * w / r;
}
pointer.set(x, y);
}
return !outside;
}
private void optimisePointerColor() {
pointerPaint.setColor(
observableColor.getLightnessWithValue(1) > 0.5
? 0xff000000 : 0xffffffff);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.clipPath(borderPath);
canvas.drawBitmap(bitmap, null, viewRect, null);
canvas.translate(pointer.x, pointer.y);
canvas.drawPath(pointerPath, pointerPaint);
canvas.restore();
canvas.drawPath(borderPath, borderPaint);
}
private static Bitmap makeBitmap(int radiusPx) {
int[] colors = new int[radiusPx * radiusPx];
float[] hsv = new float[]{0f, 0f, 1f};
for (int y = 0; y < radiusPx; ++y) {
for (int x = 0; x < radiusPx; ++x) {
final int i = x + y * radiusPx;
final float sat = satForPos(x, y, radiusPx);
final float arcBleed = 2f / radiusPx; // extend curved edge pixels just outside clip area.
if (sat <= 1 + arcBleed) {
hsv[0] = hueForPos(x, y, radiusPx);
hsv[1] = sat;
colors[i] = Color.HSVToColor(0xff, hsv);
}
}
}
return Bitmap.createBitmap(colors, radiusPx, radiusPx, Bitmap.Config.ARGB_8888);
}
private static float hueForPos(float x, float y, float radiusPx) {
final double r = radiusPx - 1; // gives values 0...1 inclusive
final double dx = (r - x) / r;
final double dy = (r - y) / r;
final double angle = Math.atan2(dy, dx);
final double hue = 360 * angle / (Math.PI / 2);
return (float)hue;
}
private static float satForPos(float x, float y, float radiusPx) {
final double r = radiusPx - 1; // gives values 0...1 inclusive
final double dx = (r - x) / r;
final double dy = (r - y) / r;
final double sat = dx * dx + dy * dy; // leave it squared -- exaggerates pale colors
return (float)sat;
}
private static void setPointer(PointF pointer, float hue, float sat, float radiusPx) {
final float r = radiusPx - 1; // for values 0...1 inclusive
final double distance = r * Math.sqrt(sat);
final double angle = hue / 360 * Math.PI / 2;
final double dx = distance * Math.cos(angle);
final double dy = distance * Math.sin(angle);
pointer.set(r - (float)dx, r - (float)dy);
}
}
@@ -1,97 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.graphics.Color;
import java.util.ArrayList;
import java.util.List;
public class ObservableColor {
// Store as HSV & A, otherwise round-trip to int causes color drift.
private final float[] hsv = {0, 0, 0};
private int alpha;
private final List<ColorObserver> observers = new ArrayList<ColorObserver>();
public ObservableColor(int color) {
Color.colorToHSV(color, hsv);
alpha = Color.alpha(color);
}
public void getHsv(float hsvOut[]) {
hsvOut[0] = hsv[0];
hsvOut[1] = hsv[1];
hsvOut[2] = hsv[2];
}
public int getColor() {
return Color.HSVToColor(alpha, hsv);
}
public float getHue() {
return hsv[0];
}
public float getSat() {
return hsv[1];
}
public float getValue() {
return hsv[2];
}
public int getAlpha() {
return alpha;
}
public float getLightness() {
return getLightnessWithValue(hsv[2]);
}
public float getLightnessWithValue(float value) {
float[] hsV = {hsv[0], hsv[1], value};
final int color = Color.HSVToColor(hsV);
return (Color.red(color) * 0.2126f + Color.green(color) * 0.7152f + Color.blue(color) * 0.0722f)/0xff;
}
public void addObserver(ColorObserver observer) {
observers.add(observer);
}
public void updateHueSat(float hue, float sat, ColorObserver sender) {
hsv[0] = hue;
hsv[1] = sat;
notifyOtherObservers(sender);
}
public void updateValue(float value, ColorObserver sender) {
hsv[2] = value;
notifyOtherObservers(sender);
}
public void updateAlpha(int alpha, ColorObserver sender) {
this.alpha = alpha;
notifyOtherObservers(sender);
}
public void updateColor(int color, ColorObserver sender) {
Color.colorToHSV(color, hsv);
alpha = Color.alpha(color);
notifyOtherObservers(sender);
}
public void updateColor(int alpha, float hue, float sat, float bri, ColorObserver sender) {
this.alpha = alpha;
hsv[0] = hue;
hsv[1] = sat;
hsv[2] = bri;
notifyOtherObservers(sender);
}
private void notifyOtherObservers(ColorObserver sender) {
for (ColorObserver observer : observers) {
if (observer != sender) {
observer.updateColor(this);
}
}
}
}
@@ -1,46 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Shader;
import ru.vtosters.lite.utils.AndroidUtils;
class Resources {
private static final float LINE_WIDTH_DIP = 1.5f;
private static final float POINTER_RADIUS_DIP = 7;
private static final int VIEW_OUTLINE_COLOR = 0xff808080;
public static Paint makeLinePaint() {
Paint paint = new Paint();
paint.setColor(VIEW_OUTLINE_COLOR);
paint.setStrokeWidth(dp2px(LINE_WIDTH_DIP));
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
return paint;
}
public static Paint makeCheckerPaint(Context context) {
Paint paint = new Paint();
final Bitmap checkerBmp = BitmapFactory.decodeResource(context.getResources(), AndroidUtils.getIdentifier("checker_background", "drawable"));
paint.setShader(new BitmapShader(checkerBmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT));
paint.setStrokeWidth(dp2px(LINE_WIDTH_DIP));
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
return paint;
}
public static Path makePointerPath() {
Path pointerPath = new Path();
final float radiusPx = dp2px(POINTER_RADIUS_DIP);
pointerPath.addCircle(0, 0, radiusPx, Path.Direction.CW);
return pointerPath;
}
}
@@ -1,112 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.View;
public abstract class SliderViewBase extends View {
private final Paint borderPaint;
private final Paint checkerPaint;
private final Rect viewRect = new Rect();
private int w;
private int h;
private final Path borderPath;
private Bitmap bitmap;
private final Path pointerPath;
private final Paint pointerPaint;
private float currentPos;
public SliderViewBase(Context context) {
super(context);
checkerPaint = Resources.makeCheckerPaint(context);
borderPaint = Resources.makeLinePaint();
pointerPaint = Resources.makeLinePaint();
pointerPath = Resources.makePointerPath();
borderPath = new Path();
}
protected abstract void notifyListener(float currentPos);
protected abstract Bitmap makeBitmap(int w, int h);
protected abstract int getPointerColor(float currentPos);
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.w = w;
this.h = h;
viewRect.set(0, 0, w, h);
float inset = borderPaint.getStrokeWidth() / 2;
borderPath.reset();
borderPath.addRect(new RectF(inset, inset, w - inset, h - inset), Path.Direction.CW);
updateBitmap();
}
protected void setPos(float pos) {
currentPos = pos;
optimisePointerColor();
}
protected void updateBitmap() {
if (w > 0 && h > 0) {
bitmap = makeBitmap(w, h);
optimisePointerColor();
}
// else not ready yet
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
currentPos = valueForTouchPos(event.getX(), event.getY());
optimisePointerColor();
notifyListener(currentPos);
invalidate();
getParent().requestDisallowInterceptTouchEvent(true);
return true;
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(borderPath, checkerPaint);
canvas.drawBitmap(bitmap, null, viewRect, null);
canvas.drawPath(borderPath, borderPaint);
canvas.save();
if (isWide()) {
canvas.translate(w * currentPos, h / 2);
}
else {
canvas.translate(w / 2, h * (1 - currentPos));
}
canvas.drawPath(pointerPath, pointerPaint);
canvas.restore();
}
private boolean isWide() {
return w > h;
}
private float valueForTouchPos(float x, float y) {
final float val = isWide() ? x / w : 1 - y / h;
return Math.max(0, Math.min(1, val));
}
private void optimisePointerColor() {
pointerPaint.setColor(getPointerColor(currentPos));
}
}
@@ -1,38 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import android.content.Context;
import android.view.View;
class SquareView extends View {
private static final int MIN_SIZE_DIP = 200;
private final int minSizePx;
public SquareView(Context context) {
super(context);
minSizePx = dp2px(MIN_SIZE_DIP);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Constrain to square
final int w = MeasureSpec.getSize(widthMeasureSpec);
final int h = MeasureSpec.getSize(heightMeasureSpec);
final int modeW = MeasureSpec.getMode(widthMeasureSpec);
final int modeH = MeasureSpec.getMode(heightMeasureSpec);
int size = minSizePx;
if (modeW == MeasureSpec.UNSPECIFIED) {
size = h;
}
else if (modeH == MeasureSpec.UNSPECIFIED) {
size = w;
}
else {
size = Math.min(w, h);
}
size = Math.max(size, minSizePx);
setMeasuredDimension(size, size);
}
}
@@ -1,125 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import ru.vtosters.lite.utils.AndroidUtils;
public class SwatchView extends SquareView implements ColorObserver {
private final Paint borderPaint;
private final Path borderPath;
private final Paint checkerPaint;
private final Path oldFillPath;
private final Path newFillPath;
private final Paint oldFillPaint;
private final Paint newFillPaint;
private final float radialMarginPx;
public SwatchView(Context context) {
super(context);
radialMarginPx = AndroidUtils.dp2px(16);
borderPaint = Resources.makeLinePaint();
checkerPaint = Resources.makeCheckerPaint(context);
oldFillPaint = new Paint();
newFillPaint = new Paint();
borderPath = new Path();
oldFillPath = new Path();
newFillPath = new Path();
}
void setOriginalColor(int color) {
oldFillPaint.setColor(color);
invalidate();
}
void observeColor(ObservableColor observableColor) {
observableColor.addObserver(this);
}
@Override
public void updateColor(ObservableColor observableColor) {
newFillPaint.setColor(observableColor.getColor());
invalidate();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// We expect to be stacked behind a square HueSatView and fill the top left corner.
final float inset = borderPaint.getStrokeWidth() / 2;
final float r = Math.min(w, h);
// Trim the corners of the swatch is where it is radialMarginPx thick.
// find how long the outeredges are:
final float margin = radialMarginPx;
final float diagonal = r + 2 * margin;
final float opp = (float)Math.sqrt(diagonal * diagonal - r * r);
final float edgeLen = r - opp;
// Arc angles for drawing CCW
final float outerAngle = (float)Math.toDegrees(Math.atan2(opp, r));
final float startAngle = 270 - outerAngle;
// Sweep angle for each half of the swatch:
final float sweepAngle = outerAngle - 45;
// Sweep angle for the smooth corners:
final float cornerSweepAngle = 90 - outerAngle;
// Outer border:
beginBorder(borderPath, inset, edgeLen, margin, cornerSweepAngle);
mainArc(borderPath, r, margin, startAngle, 2 * sweepAngle);
endBorder(borderPath, inset, edgeLen, margin, cornerSweepAngle);
// Old fill shape:
oldFillPath.reset();
oldFillPath.moveTo(inset, inset);
mainArc(oldFillPath, r, margin, 225, sweepAngle);
endBorder(oldFillPath, inset, edgeLen, margin, cornerSweepAngle);
// New fill shape:
beginBorder(newFillPath, inset, edgeLen, margin, cornerSweepAngle);
mainArc(newFillPath, r, margin, startAngle, sweepAngle);
newFillPath.lineTo(inset, inset);
newFillPath.close();
}
private static void beginBorder(Path path, float inset, float edgeLen, float cornerRadius, float cornerSweepAngle) {
path.reset();
path.moveTo(inset, inset);
cornerArc(path, edgeLen, inset, cornerRadius-inset, 0, cornerSweepAngle);
}
private static void endBorder(Path path, float inset, float edgeLen, float cornerRadius, float cornerSweepAngle) {
cornerArc(path, inset, edgeLen, cornerRadius - inset, 90 - cornerSweepAngle, cornerSweepAngle);
path.lineTo(inset, inset);
path.close();
}
private static void cornerArc(Path path, float cx, float cy, float r, float startAngle, float sweepAngle) {
final RectF ovalRect = new RectF(-r, -r, r, r);
ovalRect.offset(cx, cy);
path.arcTo(ovalRect, startAngle, sweepAngle);
}
private static void mainArc(Path path, float viewSize, float margin, float startAngle, float sweepAngle) {
float r = viewSize + margin;
final RectF ovalRect = new RectF(-r, -r, r, r);
ovalRect.offset(viewSize, viewSize);
path.arcTo(ovalRect, startAngle, sweepAngle);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(borderPath, checkerPaint);
canvas.drawPath(oldFillPath, oldFillPaint);
canvas.drawPath(newFillPath, newFillPaint);
canvas.drawPath(borderPath, borderPaint);
}
}
@@ -1,56 +0,0 @@
package ru.vtosters.lite.ui.views.rarepebble;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
public class ValueView extends SliderViewBase implements ColorObserver {
private ObservableColor observableColor = new ObservableColor(0);
public ValueView(Context context) {
super(context);
}
public void observeColor(ObservableColor observableColor) {
this.observableColor = observableColor;
observableColor.addObserver(this);
}
@Override
public void updateColor(ObservableColor observableColor) {
setPos(this.observableColor.getValue());
updateBitmap();
invalidate();
}
@Override
protected void notifyListener(float currentPos) {
observableColor.updateValue(currentPos, this);
}
@Override
protected int getPointerColor(float currentPos) {
float brightColorLightness = observableColor.getLightness();
float posLightness = currentPos * brightColorLightness;
return posLightness > 0.5f ? 0xff000000 : 0xffffffff;
}
protected Bitmap makeBitmap(int w, int h) {
final boolean isWide = w > h;
final int n = Math.max(w, h);
int[] colors = new int[n];
float[] hsv = new float[]{0, 0, 0};
observableColor.getHsv(hsv);
for (int i = 0; i < n; ++i) {
hsv[2] = isWide ? (float)i / n : 1 - (float)i / n;
colors[i] = Color.HSVToColor(hsv);
}
final int bmpWidth = isWide ? w : 1;
final int bmpHeight = isWide ? 1 : h;
return Bitmap.createBitmap(colors, bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888);
}
}
@@ -1,55 +1,76 @@
package ru.vtosters.lite.ui.vkui;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.vk.core.dialogs.bottomsheet.ModalBottomSheet;
public class ModalBottomSheetWrapper<T> {
public final ModalBottomSheet.a mBuilder;
public ModalBottomSheet mBottomSheet;
public class ModalBottomSheetWrapper {
public final ModalBottomSheet.a builder;
public ModalBottomSheetWrapper(Activity activity) {
mBuilder = new ModalBottomSheet.a(activity);
builder = new ModalBottomSheet.a(activity);
}
public T setTitle(String title) {
mBuilder.d(title);
return (T) this;
public ModalBottomSheetWrapper setTitle(String title) {
builder.d(title);
return this;
}
public T setClickableMessage(
@SuppressLint("SetTextI18n")
public ModalBottomSheetWrapper setUpdateInfoView(String changelog) {
var context = getGlobalContext();
var container = new LinearLayout(context);
var changelogView = new TextView(context);
container.setOrientation(LinearLayout.VERTICAL);
changelogView.setPadding(0, dp2px(8), 0, 0);
changelogView.setText(getString("changelog") + ": \n" + changelog);
changelogView.setTextColor(getTextAttr());
container.addView(changelogView, new LinearLayout.LayoutParams(-1, -2));
builder.a(container);
return this;
}
public ModalBottomSheetWrapper setClickableMessage(
String text,
Runnable callback
) {
mBuilder.a(text, listener -> callback.run());
return (T) this;
builder.a(text, listener -> callback.run());
return this;
}
public T setPositiveButton(
public ModalBottomSheetWrapper setPositiveButton(
String text,
Runnable callback
) {
mBuilder.a(text, kostil -> callback.run());
return (T) this;
builder.a(text, kostil -> callback.run());
return this;
}
public T setView(View view) {
mBuilder.a(view);
return (T) this;
public ModalBottomSheetWrapper setView(View view) {
builder.a(view);
return this;
}
public ModalBottomSheet show(String tag) {
return mBuilder.a(tag);
public ModalBottomSheet show() {
return builder.a("");
}
public ModalBottomSheet show(String tag, boolean isCancellable) {
mBottomSheet = mBuilder.a(tag);
mBottomSheet.setCancelable(isCancellable);
return mBottomSheet;
}
public void dismiss() {
mBottomSheet.dismiss();
public ModalBottomSheet show(boolean isCancellable) {
var sheet = builder.a("");
sheet.setCancelable(isCancellable);
return sheet;
}
}
@@ -8,7 +8,7 @@ import android.view.View;
import androidx.annotation.Nullable;
public class VBottomSheetBuilder {
public static void show(Activity activity, VBSContent content, String tag) {
public static void show(Activity activity, VBSContent content) {
ModalBottomSheetWrapper builder = new ModalBottomSheetWrapper(activity);
builder.setView(content.view);
@@ -20,7 +20,7 @@ public class VBottomSheetBuilder {
new Handler(Looper.getMainLooper()).post(content.button.action);
}); // Positive
builder.show(tag); // Build+Show
builder.show(); // Build+Show
}
public static class VBSContent {
@@ -1,70 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.ColorRes;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.recyclerview.widget.RecyclerView;
import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.core.dialogs.adapter.ModalAdapter;
public class VKUIActionPopup {
private final ActionsPopup.b mLocalBuilder;
public VKUIActionPopup(Context context, View anchorView, boolean anchor, @ColorRes int color) {
this.mLocalBuilder = new ActionsPopup.b(anchorView, anchor, color).a(context);
}
public VKUIActionPopup setItem(String title, @Nullable Drawable icon, boolean z, onClickListener clickListener) {
mLocalBuilder.a(title, icon, z, () -> {
clickListener.onClick();
return null;
});
return this;
}
public VKUIActionPopup setItem(String title, @Nullable Drawable icon, onClickListener clickListener) {
return setItem(title, icon, false, clickListener);
}
public VKUIActionPopup setItem(String title, onClickListener clickListener) {
return setItem(title, null, false, clickListener);
}
public VKUIActionPopup setActionCheckIcon(Drawable actionCheckItem) {
mLocalBuilder.a(actionCheckItem);
return this;
}
public VKUIActionPopup setMaxWidth(@Px int maxWidth) {
mLocalBuilder.a(Integer.valueOf(maxWidth));
return this;
}
public VKUIActionPopup setAdapter(ModalAdapter adapter) {
mLocalBuilder.a((ModalAdapter<Object>) adapter);
return this;
}
public VKUIActionPopup setAdapter(RecyclerView.Adapter adapter) {
mLocalBuilder.a(adapter);
return this;
}
public ActionsPopup create() {
return mLocalBuilder.a();
}
public ActionsPopup create(boolean cancel) {
return mLocalBuilder.a(cancel);
}
public interface onClickListener {
void onClick();
}
}
@@ -1,55 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.vtosters.lite.R;
public class VKUIButton extends TextView /*Yes, yes, it's TextView*/ {
public static final int STYLE_PRIMARY = R.style.VKUIButton_Primary;
public static final int STYLE_PRIMARY_ROUNDED = R.style.VKUIButton_Primary_Rounded;
public static final int STYLE_PRIMARY_SMALL = R.style.VKUIButton_Primary_Small;
public static final int STYLE_PRIMARY_SMALL_FLAT = R.style.VKUIButton_Primary_Small_Flat;
public static final int STYLE_PRIMARY_MEDIUM = R.style.VKUIButton_Primary_Medium;
public static final int STYLE_PRIMARY_BIG = R.style.VKUIButton_Primary_Big;
public static final int STYLE_SECONDARY = R.style.VKUIButton_Secondary;
public static final int STYLE_SECONDARY_ROUNDED = R.style.VKUIButton_Secondary_Rounded;
public static final int STYLE_SECONDARY_SMALL = R.style.VKUIButton_Secondary_Small;
public static final int STYLE_SECONDARY_SMALL_FLAT = R.style.VKUIButton_Secondary_Small_Flat;
public static final int STYLE_SECONDARY_MEDIUM = R.style.VKUIButton_Secondary_Medium;
public static final int STYLE_SECONDARY_BIG = R.style.VKUIButton_Secondary_Big;
public static final int STYLE_MUTED = R.style.VKUIButton_Muted;
public static final int STYLE_MUTED_ROUNDED = R.style.VKUIButton_Muted_Rounded;
public static final int STYLE_TERTIARY = R.style.VKUIButton_Tertiary;
public static final int STYLE_TERTIARY_ROUNDED = R.style.VKUIButton_Tertiary_Rounded;
public static final int STYLE_OUTLINE = R.style.VKUIButton_Outline;
public static final int STYLE_OUTLINE_WHITE = R.style.VKUIButton_Outline_White;
public static final int STYLE_GREEN = R.style.VKUIButton_Green;
public static final int STYLE_COMMERCE = STYLE_GREEN;
public static final int STYLE_FLAT = R.style.VKUIButton_Flat;
public static final int STYLE_WHITE = R.style.VKUIButton_White;
public static final int STYLE_MEDIA_OVERLAY = R.style.VKUIButton_MediaOverlay;
public static final int STYLE_SELECTABLE = R.style.VKUIButton_Selectable;
public static final int STYLE_SELECTABLE_FLAT = R.style.VKUIButton_Selectable_Flat;
public VKUIButton(Context context) {
this(context, STYLE_PRIMARY);
}
public VKUIButton(Context context, int style) {
super(new ContextThemeWrapper(context, style));
}
public VKUIButton(Context context, @Nullable AttributeSet attrs) {
super(new ContextThemeWrapper(context, STYLE_PRIMARY), attrs);
}
public VKUIButton(Context context, @Nullable AttributeSet attrs, int style) {
super(new ContextThemeWrapper(context, style), attrs);
}
}
@@ -1,24 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;
public class VKUICheckBox extends CheckBox {
public VKUICheckBox(Context context) {
super(context);
}
public VKUICheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VKUICheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public VKUICheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
@@ -1,77 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.EditText;
import androidx.annotation.Nullable;
import com.vk.core.drawable.VkUiDrawableHelper;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vtosters.lite.R;
import ru.vtosters.lite.themes.VTLColors;
public class VKUIEditText extends EditText {
public VKUIEditText(Context context) {
super(context);
init();
}
public VKUIEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public VKUIEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public VKUIEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
var fieldBackground = VKThemeHelper.d(R.attr.field_background);
var drawable = VkUiDrawableHelper.c.a(getContext(), fieldBackground, fieldBackground, VTLColors.getAccentColor(), fieldBackground);
setBackground(drawable);
}
@Override
public final void setBackground(Drawable background) {
super.setBackground(background);
}
@Override
public final void setBackgroundColor(int color) {
}
@Override
public final void setBackgroundResource(int resid) {
}
@Override
public void setCursorVisible(boolean visible) {
super.setCursorVisible(visible);
}
@Nullable
@Override
public Drawable getTextCursorDrawable() {
return super.getTextCursorDrawable();
}
@Override
public void setTextCursorDrawable(int textCursorDrawable) {
super.setTextCursorDrawable(textCursorDrawable);
}
@Override
public void setTextCursorDrawable(@Nullable Drawable textCursorDrawable) {
super.setTextCursorDrawable(textCursorDrawable);
}
}
@@ -1,18 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import androidx.appcompat.widget.AppCompatRadioButton;
public class VKUIRadioCheckbox extends AppCompatRadioButton {
public VKUIRadioCheckbox(Context context) {
super(new ContextThemeWrapper(context, android.R.style.Widget_CompoundButton_RadioButton));
}
public VKUIRadioCheckbox(Context context, AttributeSet attributeSet) {
super(new ContextThemeWrapper(context, android.R.style.Widget_CompoundButton_RadioButton), attributeSet);
}
}
@@ -1,83 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.Window;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import com.vk.core.dialogs.snackbar.VkSnackbar;
public class VKUISnackbar {
private VkSnackbar.a mLocalBuilder;
public VKUISnackbar(Context context, boolean darkMode) {
this.mLocalBuilder = new VkSnackbar.a(context, darkMode);
}
public VKUISnackbar setIcon(Drawable icon) {
mLocalBuilder.a(icon);
return this;
}
public VKUISnackbar setIcon(@DrawableRes int iconId) {
mLocalBuilder.b(iconId);
return this;
}
public VKUISnackbar setMessage(String message) {
mLocalBuilder.a((CharSequence) message);
return this;
}
public VKUISnackbar setMessage(@StringRes int resId) {
mLocalBuilder.a(resId);
return this;
}
public VKUISnackbar setShowTime(long time) {
mLocalBuilder.a(time);
return this;
}
public VKUISnackbar setView(View anchorView) {
mLocalBuilder.a(anchorView);
return this;
}
public VKUISnackbar setFragment(Fragment fragment) {
mLocalBuilder.a(fragment);
return this;
}
public VKUISnackbar setActionButton(String text, OnClickListener clickListener) {
mLocalBuilder.a(text, vkSnackbar -> {
clickListener.onClick(vkSnackbar);
return null;
});
return this;
}
public VKUISnackbar setActionButton(@StringRes int textId, OnClickListener clickListener) {
mLocalBuilder.a(textId, vkSnackbar -> {
clickListener.onClick(vkSnackbar);
return null;
});
return this;
}
public VkSnackbar create() {
return mLocalBuilder.d();
}
public VkSnackbar create(Window window) {
return mLocalBuilder.a(window);
}
public interface OnClickListener {
void onClick(VkSnackbar snackbar);
}
}
@@ -1,38 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.vtosters.lite.R;
public class VKUITextView extends TextView {
public static final int STYLE_TITLE_1 = R.style.VKUIText_Title1;
public static final int STYLE_TITLE_2 = R.style.VKUIText_Title2;
public static final int STYLE_HEADLINE = R.style.VKUIText_Headline;
public static final int STYLE_DEFAULT = R.style.VKUIText_Text;
public static final int STYLE_SUBHEAD_1 = R.style.VKUIText_Subhead1;
public static final int STYLE_SUBHEAD_2 = R.style.VKUIText_Subhead2;
public static final int STYLE_CAPTION_1 = R.style.VKUIText_Caption1;
public static final int STYLE_CAPTION_2 = R.style.VKUIText_Caption2;
public VKUITextView(Context context) {
this(context, STYLE_DEFAULT);
}
public VKUITextView(Context context, int style) {
super(new ContextThemeWrapper(context, style));
}
public VKUITextView(Context context, @Nullable AttributeSet attrs) {
super(new ContextThemeWrapper(context, STYLE_DEFAULT), attrs);
}
public VKUITextView(Context context, @Nullable AttributeSet attrs, int style) {
super(new ContextThemeWrapper(context, style), attrs);
}
}
@@ -1,23 +0,0 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.text.TextUtils;
import androidx.appcompat.widget.SwitchCompat;
import ru.vtosters.lite.utils.AndroidUtils;
public class VKUiSwitch extends SwitchCompat {
public VKUiSwitch(Context context) {
super(context);
setEllipsize(TextUtils.TruncateAt.END);
setPadding(AndroidUtils.dp2px(8), AndroidUtils.dp2px(8), AndroidUtils.dp2px(8), AndroidUtils.dp2px(8));
setTextSize(16.0f);
}
@Override
public final void setEllipsize(TextUtils.TruncateAt where) {
super.setEllipsize(where);
}
}
@@ -42,7 +42,7 @@ public class AndroidUtils {
@NonNull
public static Context getGlobalContext() {
try {
return (Context) ReflectionUtils.invokeStaticMethod("android.app.AppGlobals", "getInitialApplication");
return ReflectionUtils.invokeStaticMethod("android.app.AppGlobals", "getInitialApplication");
} catch (Exception e) {
e.printStackTrace();
}
@@ -7,9 +7,7 @@ import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.database.Cursor;
import android.text.TextUtils;
import com.vk.im.engine.ImEnvironment;
import com.vk.im.engine.events.OnMsgUpdateEvent;
import com.vk.im.engine.internal.longpoll.tasks.MsgDeleteLpTask;
import com.vk.im.engine.internal.storage.StorageEnvironment;
@@ -79,32 +77,27 @@ public class DeletedMessagesHandler {
}
public static void updateDialog(MsgDeleteLpTask msgDeleteLpTask) throws NoSuchFieldException, IllegalAccessException {
Cursor c = getMessageFromDatabaseById(ReflectionUtils.getObjectField(msgDeleteLpTask.getClass(), "d", msgDeleteLpTask));
if (c == null) return;
var cursor = getMessageFromDatabaseById(msgDeleteLpTask.d);
if (cursor == null) return;
@SuppressLint("Range")
int localId = c.getInt(c.getColumnIndex("local_id"));
int localId = cursor.getInt(cursor.getColumnIndex("local_id"));
String str = DeletedMessagesHandler.class.getSimpleName();
var imEnvironment = (ImEnvironment) ReflectionUtils.getObjectField(msgDeleteLpTask.getClass(), "b", msgDeleteLpTask);
var cint = (int) ReflectionUtils.getObjectField(msgDeleteLpTask.getClass(), "c", msgDeleteLpTask);
imEnvironment.a(str, new OnMsgUpdateEvent(str, cint, localId));
var className = DeletedMessagesHandler.class.getSimpleName();
var imEnvironment = msgDeleteLpTask.b;
var cint = msgDeleteLpTask.c;
imEnvironment.a(className, new OnMsgUpdateEvent(className, cint, localId));
}
public static void hookDeletedMessageId(MsgDeleteLpTask msgDeleteLpTask) throws NoSuchFieldException, IllegalAccessException {
public static void hookDeletedMessageId(MsgDeleteLpTask msgDeleteLpTask) {
if (!hook()) return;
var field = msgDeleteLpTask.getClass().getDeclaredField("c");
field.setAccessible(true);
var messageId = (int) field.get(msgDeleteLpTask);
var messageId = msgDeleteLpTask.d;
Cursor c = getMessageFromDatabaseById(messageId);
if (c == null) return;
if (sBodyIndex == -1) sBodyIndex = c.getColumnIndex("body");
if (TextUtils.isEmpty(c.getString(sBodyIndex))) {
deleteMessageFromDB(messageId);
return;
}
sDeletedMessagesList.add(messageId);
sVTDatabase.saveDeletedMessage(messageId);
@@ -0,0 +1,122 @@
package ru.vtosters.lite.utils;
import android.annotation.TargetApi;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.provider.DocumentsContract;
import androidx.annotation.Nullable;
import java.io.File;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.List;
// https://stackoverflow.com/questions/34927748/android-5-0-documentfile-from-tree-uri/36162691#36162691
public final class FileUriUtils {
private static final String PRIMARY_VOLUME_NAME = "primary";
@Nullable
public static String getFullPathFromTreeUri(@Nullable final Uri treeUri, Context con) {
if (treeUri == null) return null;
String volumePath = getVolumePath(getVolumeIdFromTreeUri(treeUri),con);
if (volumePath == null) return File.separator;
if (volumePath.endsWith(File.separator))
volumePath = volumePath.substring(0, volumePath.length() - 1);
String documentPath = getDocumentPathFromTreeUri(treeUri);
if (documentPath.endsWith(File.separator))
documentPath = documentPath.substring(0, documentPath.length() - 1);
if (documentPath.length() > 0) {
if (documentPath.startsWith(File.separator))
return volumePath + documentPath;
else
return volumePath + File.separator + documentPath;
}
else return volumePath;
}
private static String getVolumePath(final String volumeId, Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
return getVolumePathForAndroid11AndAbove(volumeId, context);
else
return getVolumePathBeforeAndroid11(volumeId, context);
}
private static String getVolumePathBeforeAndroid11(final String volumeId, Context context){
try {
StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getUuid = storageVolumeClazz.getMethod("getUuid");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isPrimary = storageVolumeClazz.getMethod("isPrimary");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String uuid = (String) getUuid.invoke(storageVolumeElement);
Boolean primary = (Boolean) isPrimary.invoke(storageVolumeElement);
if (primary && PRIMARY_VOLUME_NAME.equals(volumeId)) // primary volume?
return (String) getPath.invoke(storageVolumeElement);
if (uuid != null && uuid.equals(volumeId)) // other volumes?
return (String) getPath.invoke(storageVolumeElement);
}
// not found.
return null;
} catch (Exception ex) {
return null;
}
}
@TargetApi(Build.VERSION_CODES.R)
private static String getVolumePathForAndroid11AndAbove(final String volumeId, Context context) {
try {
StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
List<StorageVolume> storageVolumes = mStorageManager.getStorageVolumes();
for (StorageVolume storageVolume : storageVolumes) {
// primary volume?
if (storageVolume.isPrimary() && PRIMARY_VOLUME_NAME.equals(volumeId))
return storageVolume.getDirectory().getPath();
// other volumes?
String uuid = storageVolume.getUuid();
if (uuid != null && uuid.equals(volumeId))
return storageVolume.getDirectory().getPath();
}
// not found.
return null;
} catch (Exception ex) {
return null;
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getVolumeIdFromTreeUri(final Uri treeUri) {
final String docId = DocumentsContract.getTreeDocumentId(treeUri);
final String[] split = docId.split(":");
if (split.length > 0) return split[0];
else return null;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getDocumentPathFromTreeUri(final Uri treeUri) {
final String docId = DocumentsContract.getTreeDocumentId(treeUri);
final String[] split = docId.split(":");
if ((split.length >= 2) && (split[1] != null)) return split[1];
else return File.separator;
}
}
@@ -71,34 +71,10 @@ public class IOUtils {
}
public static void writeToFile(File file, byte[] content) throws IOException {
if (!file.exists())
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(content);
}
public static void copyFileToDirectory(File dest, File targetDir) throws IOException {
if (!targetDir.exists())
targetDir.mkdirs();
var path = dest.getAbsolutePath();
var target = new File(targetDir, path.substring(path.lastIndexOf("/")));
copyFile(dest, target);
}
public static void copyFile(File dest, File target) throws IOException {
var parent = target.getParentFile();
if (!parent.exists())
parent.getParentFile().mkdirs();
writeToFile(target, readAllBytes(dest));
}
public static void copyFile(InputStream is, File target) throws IOException {
var parent = target.getParentFile();
if (!parent.exists())
parent.getParentFile().mkdirs();
writeToFile(target, readAllBytes(is));
}
public static void deleteRecursive(File f) {
deleteRecursive(f, true);
}
@@ -3,12 +3,14 @@ package ru.vtosters.lite.utils;
import static android.graphics.Bitmap.createBitmap;
import static android.graphics.Bitmap.createScaledBitmap;
import static androidx.core.content.ContextCompat.getDrawable;
import static ru.vtosters.lite.utils.Preferences.preferences;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.RectF;
@@ -27,7 +29,7 @@ import okhttp3.Response;
public class ImageUtils {
private static OkHttpClient client = new OkHttpClient();
private static final OkHttpClient client = new OkHttpClient();
public static Bitmap bmp = null;
@@ -105,15 +107,21 @@ public class ImageUtils {
final int width = bitmap.getWidth();
final int height = bitmap.getHeight();
final Bitmap outputBitmap = createBitmap(width, height, Bitmap.Config.ARGB_8888);
int pref = preferences.getInt("pic_rounding", 0);
final Canvas canvas = new Canvas(outputBitmap);
final Path path = new Path();
path.addCircle(
(float) (width / 2),
(float) (height / 2),
(float) Math.min(width, (height / 2)),
Path.Direction.CCW);
final Canvas canvas = new Canvas(outputBitmap);
if (pref > 0) {
path.addRoundRect(new RectF(0, 0, width, height), pref, pref, Path.Direction.CCW);
} else {
path.addCircle(
(float) (width / 2),
(float) (height / 2),
(float) Math.min(width, (height / 2)),
Path.Direction.CCW);
}
canvas.clipPath(path);
canvas.drawBitmap(bitmap, 0, 0, null);
return outputBitmap;
@@ -1,12 +1,9 @@
package ru.vtosters.lite.utils;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import androidx.constraintlayout.widget.ConstraintLayout;
public class LayoutUtils {
public static int MATCH_PARENT = -1;
@@ -24,12 +21,4 @@ public class LayoutUtils {
public static FrameLayout.LayoutParams createFrame(int w, int h) {
return new FrameLayout.LayoutParams(w, h);
}
public static ViewGroup.LayoutParams createViewGroup(int w, int h) {
return new ViewGroup.LayoutParams(w, h);
}
public static ConstraintLayout.LayoutParams createConstraint(int w, int h) {
return new ConstraintLayout.LayoutParams(w, h);
}
}
@@ -1,12 +1,15 @@
package ru.vtosters.lite.utils;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import com.vk.navigation.Navigator;
import com.vtosters.lite.VKActivity;
import java.util.ArrayList;
import java.util.List;
@@ -14,12 +17,40 @@ import java.util.List;
public class LifecycleUtils {
private static final List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void registerActivities(Application application) {
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityPaused(Activity activity) {
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityResumed(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityStarted(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityStopped(Activity activity) {
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityCreated(Activity activity, Bundle bundle) {
if (activity instanceof VKActivity) {
activities.add(activity);
}
}
@Override // android.app.Application.ActivityLifecycleCallbacks
public void onActivityDestroyed(Activity activity) {
activities.remove(activity);
}
});
}
public static Activity getCurrentActivity() {
@@ -27,10 +27,12 @@ import ru.vtosters.lite.hooks.JsonInjectors;
public class NewsFeedFiltersUtils {
public static List<String> mFilters;
public static List<String> mFiltersNames;
public static List<String> mFiltersLinks;
public static void setupFilters() {
mFilters = new ArrayList<>();
mFiltersNames = new ArrayList<>();
mFiltersLinks = new ArrayList<>();
getFilter("refsfilter", "Referals.txt", mFilters);
@@ -41,12 +43,17 @@ public class NewsFeedFiltersUtils {
var customFilters = getPrefsValue("spamfilters");
if (!customFilters.isEmpty()) {
mFilters.addAll(Arrays.asList(customFilters.split(", ")));
mFilters.addAll(Arrays.asList(customFilters.toLowerCase().split(", ")));
}
var sourceNameFilter = getPrefsValue("sourcenamefilter");
if (!sourceNameFilter.isEmpty()) {
mFiltersNames.addAll(Arrays.asList(sourceNameFilter.toLowerCase().split(", ")));
}
var linkFilter = getPrefsValue("linkfilter");
if (!linkFilter.isEmpty()) {
mFiltersLinks.addAll(Arrays.asList(linkFilter.split(", ")));
mFiltersLinks.addAll(Arrays.asList(linkFilter.toLowerCase().split(", ")));
}
}
@@ -99,11 +106,15 @@ public class NewsFeedFiltersUtils {
if (copyright_post()) return true;
var copyright = json.optJSONObject("copyright");
var copyrightName = copyright.getString("name").toLowerCase();
var copyrightLink = copyright.getString("link").toLowerCase();
for (String filter : mFiltersNames) {
if (copyrightName.contains(filter)) return true;
}
for (String filter : mFiltersLinks) {
if (copyrightLink.contains(filter)) {
return true;
}
if (copyrightLink.contains(filter)) return true;
}
}
return false;

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