From 98bbc6a7910a71b4adbb7eea6ba0d701b4ef575c Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sat, 26 Jun 2021 21:58:57 +0300 Subject: [PATCH] code saving --- app/build.gradle | 81 -- app/build.gradle.kts | 95 +++ app/proguard-rules.pro | 2 +- app/src/main/AndroidManifest.xml | 14 - .../java/com/meloda/fast/VKLongPollParser.kt | 10 +- .../fast/activity/DropUserDataActivity.kt | 21 - .../fast/activity/LoginActivityDeprecated.kt | 134 ---- .../com/meloda/fast/activity/MainActivity.kt | 247 +------ .../activity/MessagesActivityDeprecated.kt | 402 ---------- .../activity/SettingsActivityDeprecated.kt | 45 -- .../fast/activity/UpdateActivityDeprecated.kt | 350 --------- .../presenter/MessagesPresenterDeprecated.kt | 254 ------- .../MessagesRepositoryDeprecated.kt | 170 ----- .../ui/view/MessagesViewDeprecated.kt | 24 - .../com/meloda/fast/adapter/ChatsAdapter.kt | 71 -- .../adapter/ConversationsAdapterDeprecated.kt | 696 ------------------ .../fast/adapter/MessagesAdapterDeprecated.kt | 584 --------------- .../meloda/fast/adapter/SimpleItemAdapter.kt | 35 - .../fast/adapter/UsersAdapterDeprecated.kt | 68 -- .../adapter/diffutil/ConversationsCallback.kt | 29 - .../ConversationsCallbackDeprecated.kt | 95 --- .../diffutil/UsersCallbackDeprecated.kt | 51 -- .../java/com/meloda/fast/api}/ErrorCodes.kt | 2 +- .../meloda/fast/api}/OnResponseListener.kt | 2 +- .../main/java/com/meloda/fast/api/Resource.kt | 25 + .../main/java/com/meloda/fast/api}/VKApi.kt | 114 +-- .../java/com/meloda/fast/api}/VKApiKeys.kt | 2 +- .../main/java/com/meloda/fast/api}/VKAuth.kt | 5 +- .../java/com/meloda/fast/api}/VKConstants.kt | 2 +- .../java/com/meloda/fast/api}/VKException.kt | 4 +- .../fast/api/datasource/MessagesDataSource.kt | 4 + .../api/datasource/base/BaseDataSource.kt | 97 +++ .../fast/api}/method/MessageMethodSetter.kt | 18 +- .../meloda/fast/api}/method/MethodSetter.kt | 22 +- .../fast/api}/method/UserMethodSetter.kt | 2 +- .../com/meloda/fast/api/model/ApiResponse.kt | 12 + .../meloda/fast/api}/model/VKAttachments.kt | 2 +- .../com/meloda/fast/api}/model/VKAudio.kt | 2 +- .../meloda/fast/api}/model/VKAudioMessage.kt | 2 +- .../java/com/meloda/fast/api}/model/VKCall.kt | 2 +- .../com/meloda/fast/api}/model/VKComment.kt | 2 +- .../meloda/fast/api}/model/VKConversation.kt | 2 +- .../com/meloda/fast/api}/model/VKDocument.kt | 2 +- .../meloda/fast/api}/model/VKGeolocation.kt | 2 +- .../java/com/meloda/fast/api}/model/VKGift.kt | 2 +- .../com/meloda/fast/api}/model/VKGraffiti.kt | 2 +- .../com/meloda/fast/api}/model/VKGroup.kt | 2 +- .../java/com/meloda/fast/api}/model/VKLink.kt | 2 +- .../fast/api}/model/VKLongPollHistory.kt | 2 +- .../fast/api}/model/VKLongPollServer.kt | 2 +- .../com/meloda/fast/api}/model/VKMessage.kt | 4 +- .../meloda/fast/api}/model/VKMessageAction.kt | 2 +- .../com/meloda/fast/api}/model/VKModel.kt | 2 +- .../com/meloda/fast/api}/model/VKPhoto.kt | 2 +- .../com/meloda/fast/api}/model/VKPhotoSize.kt | 2 +- .../java/com/meloda/fast/api}/model/VKPoll.kt | 2 +- .../com/meloda/fast/api}/model/VKSticker.kt | 2 +- .../java/com/meloda/fast/api}/model/VKUser.kt | 2 +- .../com/meloda/fast/api}/model/VKVideo.kt | 2 +- .../java/com/meloda/fast/api}/model/VKWall.kt | 2 +- .../RequestMessagesGetConversations.kt | 21 + .../ResponseMessagesGetConversations.kt | 6 + .../fast/api/service/MessagesService.kt | 13 + .../java/com/meloda/fast/api}/util/VKUtil.kt | 63 +- .../java/com/meloda/fast/base/BaseActivity.kt | 51 +- .../java/com/meloda/fast/base/BaseAdapter.kt | 177 ----- .../java/com/meloda/fast/base/BaseFragment.kt | 19 +- .../meloda/fast/base/adapter/BaseAdapter.kt | 144 ++++ .../{BaseHolder.kt => adapter/Holders.kt} | 0 .../com/meloda/fast/base/adapter/Listeners.kt | 9 + .../java/com/meloda/fast/common/AppGlobal.kt | 79 -- .../meloda/fast/common/FragmentSwitcher.kt | 13 +- .../com/meloda/fast/common/UpdateManager.kt | 4 +- .../com/meloda/fast}/concurrent/EventInfo.kt | 2 +- .../com/meloda/fast}/concurrent/LowThread.kt | 2 +- .../meloda/fast}/concurrent/TaskManager.kt | 2 +- .../com/meloda/fast/database/CacheStorage.kt | 6 +- .../fast/database/storage/ChatsStorage.kt | 4 +- .../fast/database/storage/GroupsStorage.kt | 4 +- .../fast/database/storage/MessagesStorage.kt | 6 +- .../fast/database/storage/UsersStorage.kt | 4 +- .../com/meloda/fast/dialog/AccountDialog.kt | 113 --- .../com/meloda/fast/dialog/ProfileDialog.kt | 115 --- .../fast}/extensions/ContextExtensions.kt | 2 +- .../fast}/extensions/DrawableExtensions.kt | 2 +- .../fast}/extensions/FloatExtensions.kt | 2 +- .../fast/extensions/LiveDataExtensions.kt | 116 +++ .../fast}/extensions/StringExtensions.kt | 2 +- .../fast}/extensions/TextViewExtensions.kt | 2 +- .../com/meloda/fast/fragment/ChatsFragment.kt | 115 --- .../FragmentConversationsDeprecated.kt | 186 ----- .../fragment/FragmentFriendsDeprecated.kt | 194 ----- .../com/meloda/fast/fragment/LoginFragment.kt | 163 +--- .../meloda/fast/fragment/SettingsFragment.kt | 203 ----- .../fast/fragment/ValidationFragment.kt | 88 --- .../fragment/ui/presenter/ChatsPresenter.kt | 85 --- .../ConversationsPresenterDeprecated.kt | 256 ------- .../presenter/FriendsPresenterDeprecated.kt | 232 ------ .../fragment/ui/presenter/LoginPresenter.kt | 190 ----- .../fragment/ui/repository/ChatsRepository.kt | 7 - .../ConversationsRepositoryDeprecated.kt | 103 --- .../repository/FriendsRepositoryDeprecated.kt | 88 --- .../fragment/ui/repository/LoginRepository.kt | 74 -- .../meloda/fast/fragment/ui/view/ChatsView.kt | 11 - .../ui/view/ConversationsViewDeprecated.kt | 10 - .../fragment/ui/view/FriendsViewDeprecated.kt | 10 - .../meloda/fast/fragment/ui/view/LoginView.kt | 11 - .../com/meloda/fast}/io/BytesOutputStream.kt | 2 +- .../main/java/com/meloda/fast}/io/Charsets.kt | 2 +- .../java/com/meloda/fast}/io/EasyStreams.kt | 2 +- .../java/com/meloda/fast}/io/FileStreams.kt | 2 +- .../com/meloda/fast/item/SimpleMenuItem.kt | 10 - .../meloda/fast/listener/ItemClickListener.kt | 5 - .../fast/listener/ItemLongClickListener.kt | 5 - .../java/com/meloda/fast/net}/HttpRequest.kt | 9 +- .../fast/receiver/DownloadUpdateReceiver.kt | 2 +- .../meloda/fast/service/LongPollService.kt | 8 +- .../java/com/meloda/fast/util/AndroidUtils.kt | 29 +- .../java/com/meloda/fast/util}/ArrayUtils.kt | 2 +- .../java/com/meloda/fast/util/ImageUtils.kt | 61 +- .../com/meloda/fast/util/KeyboardUtils.kt | 6 +- .../main/java/com/meloda/fast/util/Utils.kt | 4 +- .../main/java/com/meloda/fast/util/VKUtils.kt | 33 +- .../java/com/meloda/fast/util/ViewUtils.kt | 9 +- .../meloda/fast/viewmodel/ChatsViewModel.kt | 70 ++ .../com/meloda/fast/widget/NoItemsView.kt | 19 +- .../com/meloda/fast/widget/RecyclerView.kt | 16 - .../java/com/meloda/fast/widget/Toolbar.kt | 9 +- app/src/main/res/layout/activity_update.xml | 14 +- app/src/main/res/layout/item_conversation.xml | 10 +- app/src/main/res/layout/toolbar.xml | 5 +- arrayutils/.gitignore | 1 - arrayutils/build.gradle | 42 -- arrayutils/proguard-rules.pro | 21 - arrayutils/src/main/AndroidManifest.xml | 5 - build.gradle | 25 - build.gradle.kts | 24 + buildSrc/build.gradle.kts | 9 + .../kotlin/main/BuildPlugins$android$2.class | Bin 0 -> 1068 bytes .../kotlin/main/BuildPlugins$kotlin$2.class | Bin 0 -> 1077 bytes .../classes/kotlin/main/BuildPlugins.class | Bin 0 -> 1598 bytes .../classes/kotlin/main/ConfigData.class | Bin 0 -> 1085 bytes .../classes/kotlin/main/Deps$acra$2.class | Bin 0 -> 1021 bytes .../kotlin/main/Deps$appCompat$2.class | Bin 0 -> 1054 bytes .../classes/kotlin/main/Deps$cardView$2.class | Bin 0 -> 1042 bytes .../classes/kotlin/main/Deps$core$2.class | Bin 0 -> 1035 bytes .../kotlin/main/Deps$coroutineAndroid$2.class | Bin 0 -> 1080 bytes .../kotlin/main/Deps$coroutineCore$2.class | Bin 0 -> 1071 bytes .../kotlin/main/Deps$desugaring$2.class | Bin 0 -> 1054 bytes .../classes/kotlin/main/Deps$fragment$2.class | Bin 0 -> 1046 bytes .../classes/kotlin/main/Deps$gson$2.class | Bin 0 -> 1033 bytes .../classes/kotlin/main/Deps$jsoup$2.class | Bin 0 -> 1026 bytes .../classes/kotlin/main/Deps$kotlin$2.class | Bin 0 -> 1051 bytes .../classes/kotlin/main/Deps$material$2.class | Bin 0 -> 1057 bytes .../kotlin/main/Deps$preferences$2.class | Bin 0 -> 1056 bytes .../kotlin/main/Deps$recyclerView$2.class | Bin 0 -> 1058 bytes .../kotlin/main/Deps$roomCompiler$2.class | Bin 0 -> 1051 bytes .../kotlin/main/Deps$roomRuntime$2.class | Bin 0 -> 1048 bytes .../main/Deps$swipeRefreshLayout$2.class | Bin 0 -> 1090 bytes buildSrc/build/classes/kotlin/main/Deps.class | Bin 0 -> 5692 bytes .../main/META-INF/buildSrc.kotlin_module | Bin 0 -> 16 bytes .../build/classes/kotlin/main/Versions.class | Bin 0 -> 2084 bytes buildSrc/build/kotlin/buildSrcjar-classes.txt | 1 + .../kotlin/compileKotlin/build-history.bin | Bin 0 -> 2790 bytes .../caches-jvm/inputs/source-to-output.tab | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.values.at | Bin 0 -> 20151 bytes .../caches-jvm/inputs/source-to-output.tab_i | Bin 0 -> 32768 bytes .../inputs/source-to-output.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-fq-name-to-source.tab | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/class-fq-name-to-source.tab.len | Bin 0 -> 8 bytes .../class-fq-name-to-source.tab.values.at | Bin 0 -> 2148 bytes .../jvm/kotlin/class-fq-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/class-fq-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/constants.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/constants.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/constants.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/constants.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/constants.tab.values.at | Bin 0 -> 6065 bytes .../caches-jvm/jvm/kotlin/constants.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/constants.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/internal-name-to-source.tab | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/internal-name-to-source.tab.len | Bin 0 -> 8 bytes .../internal-name-to-source.tab.values.at | Bin 0 -> 15183 bytes .../jvm/kotlin/internal-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/internal-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab | Bin 0 -> 4096 bytes .../caches-jvm/jvm/kotlin/proto.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/proto.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.at | Bin 0 -> 19781 bytes .../caches-jvm/jvm/kotlin/proto.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/proto.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab | Bin 0 -> 4096 bytes .../kotlin/source-to-classes.tab.keystream | Bin 0 -> 4096 bytes .../source-to-classes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab.len | Bin 0 -> 8 bytes .../kotlin/source-to-classes.tab.values.at | Bin 0 -> 3783 bytes .../jvm/kotlin/source-to-classes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/source-to-classes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/counters.tab | 2 + .../caches-jvm/lookups/file-to-id.tab | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/file-to-id.tab.len | Bin 0 -> 8 bytes .../lookups/file-to-id.tab.values.at | Bin 0 -> 157 bytes .../caches-jvm/lookups/file-to-id.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/file-to-id.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab.len | Bin 0 -> 8 bytes .../lookups/id-to-file.tab.values.at | Bin 0 -> 1437 bytes .../caches-jvm/lookups/id-to-file.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/id-to-file.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab | Bin 0 -> 4096 bytes .../caches-jvm/lookups/lookups.tab.keystream | Bin 0 -> 4096 bytes .../lookups/lookups.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.values.at | Bin 0 -> 17919 bytes .../caches-jvm/lookups/lookups.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/lookups.tab_i.len | Bin 0 -> 8 bytes .../build/kotlin/compileKotlin/last-build.bin | Bin 0 -> 81 bytes buildSrc/build/libs/buildSrc.jar | Bin 0 -> 20318 bytes .../plugin-under-test-metadata.properties | 1 + .../plugin-development/validation-report.txt | 0 .../source-roots/buildSrc/source-roots.txt | 8 + buildSrc/build/tmp/jar/MANIFEST.MF | 2 + buildSrc/src/main/kotlin/ConfigData.kt | 10 + buildSrc/src/main/kotlin/Dependencies.kt | 31 + buildSrc/src/main/kotlin/Versions.kt | 34 + concurrent/.gitignore | 1 - concurrent/build.gradle | 37 - concurrent/consumer-rules.pro | 0 concurrent/proguard-rules.pro | 21 - concurrent/src/main/AndroidManifest.xml | 5 - extensions/.gitignore | 1 - extensions/build.gradle | 44 -- extensions/consumer-rules.pro | 0 extensions/proguard-rules.pro | 21 - extensions/src/main/AndroidManifest.xml | 5 - mvp/.gitignore | 1 - mvp/build.gradle | 36 - mvp/consumer-rules.pro | 0 mvp/proguard-rules.pro | 21 - mvp/src/main/AndroidManifest.xml | 5 - mvp/src/main/java/com/meloda/mvp/MvpBase.kt | 21 - .../main/java/com/meloda/mvp/MvpConstants.kt | 11 - .../main/java/com/meloda/mvp/MvpException.kt | 3 - mvp/src/main/java/com/meloda/mvp/MvpFields.kt | 30 - .../java/com/meloda/mvp/MvpOnLoadListener.kt | 9 - .../com/meloda/mvp/MvpOnResponseListener.kt | 9 - .../main/java/com/meloda/mvp/MvpPresenter.kt | 104 --- .../main/java/com/meloda/mvp/MvpRepository.kt | 28 - mvp/src/main/java/com/meloda/mvp/MvpView.kt | 33 - netservices/.gitignore | 1 - netservices/build.gradle | 44 -- netservices/consumer-rules.pro | 0 netservices/proguard-rules.pro | 21 - netservices/src/main/AndroidManifest.xml | 5 - settings.gradle | 10 - settings.gradle.kts | 2 + vksdk/.gitignore | 1 - vksdk/build.gradle | 43 -- vksdk/consumer-rules.pro | 0 vksdk/proguard-rules.pro | 21 - vksdk/src/main/AndroidManifest.xml | 5 - 273 files changed, 1076 insertions(+), 6921 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 app/src/main/java/com/meloda/fast/activity/DropUserDataActivity.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/LoginActivityDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/MessagesActivityDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/SettingsActivityDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/UpdateActivityDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/ui/presenter/MessagesPresenterDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/ui/repository/MessagesRepositoryDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/activity/ui/view/MessagesViewDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/ChatsAdapter.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/ConversationsAdapterDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/MessagesAdapterDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/SimpleItemAdapter.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/UsersAdapterDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallback.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallbackDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/adapter/diffutil/UsersCallbackDeprecated.kt rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/ErrorCodes.kt (98%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/OnResponseListener.kt (78%) create mode 100644 app/src/main/java/com/meloda/fast/api/Resource.kt rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/VKApi.kt (74%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/VKApiKeys.kt (93%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/VKAuth.kt (96%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/VKConstants.kt (97%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/VKException.kt (68%) create mode 100644 app/src/main/java/com/meloda/fast/api/datasource/MessagesDataSource.kt create mode 100644 app/src/main/java/com/meloda/fast/api/datasource/base/BaseDataSource.kt rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/method/MessageMethodSetter.kt (88%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/method/MethodSetter.kt (86%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/method/UserMethodSetter.kt (96%) create mode 100644 app/src/main/java/com/meloda/fast/api/model/ApiResponse.kt rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKAttachments.kt (98%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKAudio.kt (95%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKAudioMessage.kt (95%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKCall.kt (96%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKComment.kt (89%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKConversation.kt (99%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKDocument.kt (98%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKGeolocation.kt (88%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKGift.kt (93%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKGraffiti.kt (94%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKGroup.kt (97%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKLink.kt (97%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKLongPollHistory.kt (91%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKLongPollServer.kt (91%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKMessage.kt (98%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKMessageAction.kt (97%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKModel.kt (85%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKPhoto.kt (96%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKPhotoSize.kt (91%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKPoll.kt (97%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKSticker.kt (96%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKUser.kt (98%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKVideo.kt (97%) rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/model/VKWall.kt (89%) create mode 100644 app/src/main/java/com/meloda/fast/api/model/request/RequestMessagesGetConversations.kt create mode 100644 app/src/main/java/com/meloda/fast/api/model/response/ResponseMessagesGetConversations.kt create mode 100644 app/src/main/java/com/meloda/fast/api/service/MessagesService.kt rename {vksdk/src/main/java/com/meloda/vksdk => app/src/main/java/com/meloda/fast/api}/util/VKUtil.kt (75%) delete mode 100644 app/src/main/java/com/meloda/fast/base/BaseAdapter.kt create mode 100644 app/src/main/java/com/meloda/fast/base/adapter/BaseAdapter.kt rename app/src/main/java/com/meloda/fast/base/{BaseHolder.kt => adapter/Holders.kt} (100%) create mode 100644 app/src/main/java/com/meloda/fast/base/adapter/Listeners.kt rename {concurrent/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/concurrent/EventInfo.kt (66%) rename {concurrent/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/concurrent/LowThread.kt (85%) rename {concurrent/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/concurrent/TaskManager.kt (94%) delete mode 100644 app/src/main/java/com/meloda/fast/dialog/AccountDialog.kt delete mode 100644 app/src/main/java/com/meloda/fast/dialog/ProfileDialog.kt rename {extensions/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/extensions/ContextExtensions.kt (96%) rename {extensions/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/extensions/DrawableExtensions.kt (86%) rename {extensions/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/extensions/FloatExtensions.kt (77%) create mode 100644 app/src/main/java/com/meloda/fast/extensions/LiveDataExtensions.kt rename {extensions/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/extensions/StringExtensions.kt (80%) rename {extensions/src/main/java/com/meloda => app/src/main/java/com/meloda/fast}/extensions/TextViewExtensions.kt (87%) delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ChatsFragment.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/FragmentConversationsDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/FragmentFriendsDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/SettingsFragment.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ValidationFragment.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/presenter/ChatsPresenter.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/presenter/ConversationsPresenterDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/presenter/FriendsPresenterDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/presenter/LoginPresenter.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/repository/ChatsRepository.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/repository/ConversationsRepositoryDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/repository/FriendsRepositoryDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/repository/LoginRepository.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/view/ChatsView.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/view/ConversationsViewDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/view/FriendsViewDeprecated.kt delete mode 100644 app/src/main/java/com/meloda/fast/fragment/ui/view/LoginView.kt rename {netservices/src/main/java/com/meloda/netservices => app/src/main/java/com/meloda/fast}/io/BytesOutputStream.kt (85%) rename {netservices/src/main/java/com/meloda/netservices => app/src/main/java/com/meloda/fast}/io/Charsets.kt (85%) rename {netservices/src/main/java/com/meloda/netservices => app/src/main/java/com/meloda/fast}/io/EasyStreams.kt (99%) rename {netservices/src/main/java/com/meloda/netservices => app/src/main/java/com/meloda/fast}/io/FileStreams.kt (98%) delete mode 100644 app/src/main/java/com/meloda/fast/item/SimpleMenuItem.kt delete mode 100644 app/src/main/java/com/meloda/fast/listener/ItemClickListener.kt delete mode 100644 app/src/main/java/com/meloda/fast/listener/ItemLongClickListener.kt rename {netservices/src/main/java/com/meloda/netservices => app/src/main/java/com/meloda/fast/net}/HttpRequest.kt (92%) rename {arrayutils/src/main/java/com/meloda/arrayutils => app/src/main/java/com/meloda/fast/util}/ArrayUtils.kt (98%) create mode 100644 app/src/main/java/com/meloda/fast/viewmodel/ChatsViewModel.kt delete mode 100644 app/src/main/java/com/meloda/fast/widget/RecyclerView.kt delete mode 100644 arrayutils/.gitignore delete mode 100644 arrayutils/build.gradle delete mode 100644 arrayutils/proguard-rules.pro delete mode 100644 arrayutils/src/main/AndroidManifest.xml delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/build/classes/kotlin/main/BuildPlugins$android$2.class create mode 100644 buildSrc/build/classes/kotlin/main/BuildPlugins$kotlin$2.class create mode 100644 buildSrc/build/classes/kotlin/main/BuildPlugins.class create mode 100644 buildSrc/build/classes/kotlin/main/ConfigData.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$acra$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$appCompat$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$cardView$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$core$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$coroutineAndroid$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$coroutineCore$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$desugaring$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$fragment$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$gson$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$jsoup$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$kotlin$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$material$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$preferences$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$recyclerView$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$roomCompiler$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$roomRuntime$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps$swipeRefreshLayout$2.class create mode 100644 buildSrc/build/classes/kotlin/main/Deps.class create mode 100644 buildSrc/build/classes/kotlin/main/META-INF/buildSrc.kotlin_module create mode 100644 buildSrc/build/classes/kotlin/main/Versions.class create mode 100644 buildSrc/build/kotlin/buildSrcjar-classes.txt create mode 100644 buildSrc/build/kotlin/compileKotlin/build-history.bin create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i create mode 100644 buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i.len create mode 100644 buildSrc/build/kotlin/compileKotlin/last-build.bin create mode 100644 buildSrc/build/libs/buildSrc.jar create mode 100644 buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties rename arrayutils/consumer-rules.pro => buildSrc/build/reports/plugin-development/validation-report.txt (100%) create mode 100644 buildSrc/build/source-roots/buildSrc/source-roots.txt create mode 100644 buildSrc/build/tmp/jar/MANIFEST.MF create mode 100644 buildSrc/src/main/kotlin/ConfigData.kt create mode 100644 buildSrc/src/main/kotlin/Dependencies.kt create mode 100644 buildSrc/src/main/kotlin/Versions.kt delete mode 100644 concurrent/.gitignore delete mode 100644 concurrent/build.gradle delete mode 100644 concurrent/consumer-rules.pro delete mode 100644 concurrent/proguard-rules.pro delete mode 100644 concurrent/src/main/AndroidManifest.xml delete mode 100644 extensions/.gitignore delete mode 100644 extensions/build.gradle delete mode 100644 extensions/consumer-rules.pro delete mode 100644 extensions/proguard-rules.pro delete mode 100644 extensions/src/main/AndroidManifest.xml delete mode 100644 mvp/.gitignore delete mode 100644 mvp/build.gradle delete mode 100644 mvp/consumer-rules.pro delete mode 100644 mvp/proguard-rules.pro delete mode 100644 mvp/src/main/AndroidManifest.xml delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpBase.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpConstants.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpException.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpFields.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpOnLoadListener.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpOnResponseListener.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpPresenter.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpRepository.kt delete mode 100644 mvp/src/main/java/com/meloda/mvp/MvpView.kt delete mode 100644 netservices/.gitignore delete mode 100644 netservices/build.gradle delete mode 100644 netservices/consumer-rules.pro delete mode 100644 netservices/proguard-rules.pro delete mode 100644 netservices/src/main/AndroidManifest.xml delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts delete mode 100644 vksdk/.gitignore delete mode 100644 vksdk/build.gradle delete mode 100644 vksdk/consumer-rules.pro delete mode 100644 vksdk/proguard-rules.pro delete mode 100644 vksdk/src/main/AndroidManifest.xml diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 80cbf240..00000000 --- a/app/build.gradle +++ /dev/null @@ -1,81 +0,0 @@ -plugins { - id 'com.android.application' - id 'kotlin-android' - id 'kotlin-kapt' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - applicationId "com.meloda.fast" - minSdkVersion 23 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - coreLibraryDesugaringEnabled true - - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() - } -} - -dependencies { - implementation project(":mvp") - implementation project(":vksdk") - implementation project(":arrayutils") - implementation project(":netservices") - implementation project(":concurrent") - implementation project(":extensions") - - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - - implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}" - - implementation 'androidx.core:core-ktx:1.5.0-beta02' - - implementation 'androidx.appcompat:appcompat:1.3.0-beta01' - implementation 'androidx.preference:preference-ktx:1.1.1' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' - implementation 'androidx.recyclerview:recyclerview:1.2.0-beta02' - implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.fragment:fragment-ktx:1.3.0' - implementation 'com.google.android.material:material:1.3.0' - - implementation 'androidx.room:room-runtime:2.3.0-beta02' - kapt 'androidx.room:room-compiler:2.3.0-beta02' - - implementation 'com.facebook.fresco:fresco:2.3.0' - - implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' - - implementation 'com.squareup.picasso:picasso:2.71828' - - implementation 'com.github.rahatarmanahmed:circularprogressview:2.5.0' - - implementation 'com.google.code.gson:gson:2.8.6' - - implementation 'org.jsoup:jsoup:1.13.1' - - implementation 'ch.acra:acra:4.11.1' - - def appCenterSdkVersion = '4.1.0' - implementation "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}" - implementation "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}" - implementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}" -} \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 00000000..5cfa2940 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,95 @@ +plugins { + id("com.android.application") + id("kotlin-android") + id("kotlin-kapt") +} + +android { + compileSdkVersion(ConfigData.compileSdkVersion) + buildToolsVersion(ConfigData.buildToolsVersion) + + defaultConfig { + applicationId = "com.meloda.fast" + minSdkVersion(ConfigData.minSdkVersion) + targetSdkVersion(ConfigData.targetSdkVersion) + versionCode = ConfigData.versionCode + versionName = ConfigData.versionName + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + isCoreLibraryDesugaringEnabled = true + + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + tasks.withType { + kotlinOptions { + jvmTarget = "1.8" + } + } + + buildFeatures { + dataBinding = true + viewBinding = true + } +} + +java { + val kotlinSrcDir = "src/main/kotlin" + println(sourceSets.names) +// val mainJavaSourceSet: SourceDirectorySet = sourceSets.getByName("main").java +// mainJavaSourceSet.srcDir(kotlinSrcDir) +// println(mainJavaSourceSet.srcDirs) +} + +//java.sourceSets.create("src/main/kotlin") + +//sourceSets { +// main.java.srcDirs += "src/main/kotlin" +//} + +dependencies { + implementation(Deps.kotlin) + + coreLibraryDesugaring(Deps.desugaring) + + implementation(Deps.appCompat) + implementation(Deps.material) + implementation(Deps.core) + implementation(Deps.preferences) + implementation(Deps.swipeRefreshLayout) + implementation(Deps.recyclerView) + implementation(Deps.cardView) + implementation(Deps.fragment) + + implementation(Deps.coroutineCore) + implementation(Deps.coroutineAndroid) + + implementation(Deps.roomRuntime) + kapt(Deps.roomCompiler) + + implementation(Deps.gson) + implementation(Deps.jsoup) + implementation(Deps.acra) + implementation("com.github.yogacp:android-viewbinding:1.0.2") + + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:${Versions.lifecycle}") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:${Versions.lifecycle}") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:${Versions.lifecycle}") + implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:${Versions.lifecycle}") + implementation("androidx.lifecycle:lifecycle-common-java8:${Versions.lifecycle}") + + implementation("com.squareup.retrofit2:retrofit:${Versions.retrofit}") + implementation("com.squareup.retrofit2:converter-gson:${Versions.retrofit}") +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb434..ff59496d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a5250609..b8451b8d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,20 +26,6 @@ android:name=".service.LongPollService" android:enabled="true" /> - - - - - - - - - - diff --git a/app/src/main/java/com/meloda/fast/VKLongPollParser.kt b/app/src/main/java/com/meloda/fast/VKLongPollParser.kt index c6017076..738efeac 100644 --- a/app/src/main/java/com/meloda/fast/VKLongPollParser.kt +++ b/app/src/main/java/com/meloda/fast/VKLongPollParser.kt @@ -2,11 +2,11 @@ package com.meloda.fast import android.util.Log import androidx.annotation.WorkerThread -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.vksdk.VKApiKeys -import com.meloda.vksdk.model.VKMessage -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.concurrent.EventInfo +import com.meloda.fast.concurrent.TaskManager +import com.meloda.fast.api.VKApiKeys +import com.meloda.fast.api.model.VKMessage +import com.meloda.fast.api.util.VKUtil import org.json.JSONArray @Suppress("UNCHECKED_CAST") diff --git a/app/src/main/java/com/meloda/fast/activity/DropUserDataActivity.kt b/app/src/main/java/com/meloda/fast/activity/DropUserDataActivity.kt deleted file mode 100644 index d398bf0f..00000000 --- a/app/src/main/java/com/meloda/fast/activity/DropUserDataActivity.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.meloda.fast.activity - -import android.content.Intent -import android.os.Bundle -import com.meloda.fast.UserConfig -import com.meloda.fast.base.BaseActivity - -class DropUserDataActivity : BaseActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - UserConfig.clear() - -// TaskManager.execute { AppGlobal.database.clearAllTables() } - - startActivity(Intent(this, MainActivity::class.java)) - finishAffinity() - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/LoginActivityDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/LoginActivityDeprecated.kt deleted file mode 100644 index 9fda684b..00000000 --- a/app/src/main/java/com/meloda/fast/activity/LoginActivityDeprecated.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.meloda.fast.activity - -import android.annotation.SuppressLint -import android.content.Intent -import android.graphics.Bitmap -import android.os.Bundle -import android.util.Log -import android.view.MenuItem -import android.webkit.* -import android.widget.ProgressBar -import androidx.core.view.isVisible -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.extensions.ContextExtensions.color -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.extensions.DrawableExtensions.tint -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.base.BaseActivity -import com.meloda.fast.widget.Toolbar -import com.meloda.vksdk.VKAuth - -class LoginActivityDeprecated : BaseActivity() { - - private lateinit var toolbar: Toolbar - private lateinit var progressBar: ProgressBar - private lateinit var webView: WebView - private lateinit var refreshLayout: SwipeRefreshLayout - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_login) - - initViews() - - prepareToolbar() - prepareRefreshLayout() - - prepareSettings() - - val url = VKAuth.getUrl(UserConfig.API_ID, VKAuth.settings) - - webView.loadUrl(url) - } - - private fun initViews() { - toolbar = findViewById(R.id.toolbar) - progressBar = findViewById(R.id.progressBar) - webView = findViewById(R.id.webView) - refreshLayout = findViewById(R.id.refreshLayout) - } - - @SuppressLint("SetJavaScriptEnabled") - private fun prepareSettings() { - webView.settings.javaScriptEnabled = true - webView.clearCache(true) - webView.webViewClient = VKWebClient() - - val cookieManager = CookieManager.getInstance() - cookieManager.setAcceptCookie(true) - } - - private fun prepareToolbar() { - setSupportActionBar(toolbar) - - toolbar.navigationIcon = drawable(R.drawable.ic_close).tint(color(R.color.accent)) - toolbar.setNavigationClickListener { onBackPressed() } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) onBackPressed() - return super.onOptionsItemSelected(item) - } - - private fun prepareRefreshLayout() { - refreshLayout.apply { - setColorSchemeColors(color(R.color.accent)) - setOnRefreshListener { - webView.reload() - isRefreshing = false - } - } - } - - private inner class VKWebClient : WebViewClient() { - override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { - view.loadUrl(url) - return true - } - - override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { - super.onPageStarted(view, url, favicon) - - progressBar.isVisible = true - view.isVisible = false - - parseUrl(url) - } - - override fun onPageFinished(view: WebView, url: String) { - super.onPageFinished(view, url) - - progressBar.isVisible = false - view.isVisible = true - } - - override fun onReceivedError( - view: WebView, - request: WebResourceRequest?, - error: WebResourceError? - ) { - super.onReceivedError(view, request, error) - Log.e("VKM WebView", error.toString()) - } - } - - private fun parseUrl(url: String) { - try { - if (url.startsWith(VKAuth.redirectUrl) && !url.contains("error=")) { - val auth = VKAuth.parseRedirectUrl(url) - val token = auth[0] - val id = auth[1].toInt() - - UserConfig.token = token - UserConfig.userId = id - UserConfig.save() - - finishAffinity() - startActivity(Intent(this, MainActivity::class.java)) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/MainActivity.kt b/app/src/main/java/com/meloda/fast/activity/MainActivity.kt index 4392b0f4..27a92332 100644 --- a/app/src/main/java/com/meloda/fast/activity/MainActivity.kt +++ b/app/src/main/java/com/meloda/fast/activity/MainActivity.kt @@ -1,254 +1,23 @@ package com.meloda.fast.activity -import android.content.Intent import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import androidx.core.view.GravityCompat -import androidx.core.view.isVisible -import androidx.drawerlayout.widget.DrawerLayout -import com.google.android.material.bottomnavigation.BottomNavigationView -import com.google.android.material.navigation.NavigationView -import com.meloda.extensions.ContextExtensions.color -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.extensions.DrawableExtensions.tint +import android.viewbinding.library.activity.viewBinding import com.meloda.fast.R -import com.meloda.fast.UserConfig import com.meloda.fast.base.BaseActivity -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.common.FragmentSwitcher -import com.meloda.fast.common.TimeManager -import com.meloda.fast.dialog.AccountDialog -import com.meloda.fast.fragment.* -import com.meloda.fast.service.LongPollService -import com.meloda.fast.util.AndroidUtils -import com.meloda.fast.util.ViewUtils -import com.meloda.fast.widget.Toolbar -import com.meloda.vksdk.VKApi -import com.meloda.vksdk.model.VKUser -import java.util.* +import com.meloda.fast.databinding.ActivityMainBinding +import com.meloda.fast.fragment.LoginFragment -class MainActivity : BaseActivity(), - NavigationView.OnNavigationItemSelectedListener, - BottomNavigationView.OnNavigationItemSelectedListener { +class MainActivity : BaseActivity(R.layout.activity_main) { - private lateinit var fragmentConversationsDeprecated: FragmentConversationsDeprecated - private lateinit var fragmentFriendsDeprecated: FragmentFriendsDeprecated - private lateinit var settingsFragment: SettingsFragment - - private var selectedId = 0 - - private lateinit var drawerLayout: DrawerLayout - lateinit var bottomBar: BottomNavigationView - private lateinit var navigationView: NavigationView + private val binding: ActivityMainBinding by viewBinding() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - initViews() - -// checkLogin() - - if (UserConfig.isLoggedIn()) { - VKApi.init(Locale.getDefault().language, UserConfig.token, AppGlobal.handler) - - supportFragmentManager.beginTransaction() - .replace(R.id.fragmentContainer, ChatsFragment()) - .commit() - } else { - bottomBar.isVisible = false - - supportFragmentManager.beginTransaction() - .replace(R.id.fragmentContainer, LoginFragment()) - .commit() - } - - -// TimeManager.init(this) - -// prepareFragments() - -// prepareNavigationView() -// prepareBottomBar() -// checkLogin() + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentContainer, LoginFragment()) + .commit() } - private fun initViews() { - drawerLayout = findViewById(R.id.drawerLayout) - bottomBar = findViewById(R.id.bottomBar) - navigationView = findViewById(R.id.navigationView) - } - - override fun onDestroy() { - TimeManager.destroy() - super.onDestroy() - } - - private fun prepareFragments() { - fragmentConversationsDeprecated = FragmentConversationsDeprecated() - fragmentFriendsDeprecated = FragmentFriendsDeprecated(UserConfig.userId) - settingsFragment = SettingsFragment() - - val containerId = R.id.fragmentContainer - - FragmentSwitcher.addFragments( - supportFragmentManager, - containerId, - listOf(fragmentConversationsDeprecated) - ) - } - - fun initToolbar(toolbar: Toolbar) { - toolbar.navigationIcon = - drawable(R.drawable.ic_search).tint(color(R.color.text_secondary_60_alpha)) - - toolbar.setTitleMode(Toolbar.TitleMode.HINT) - toolbar.setTitle(R.string.action_search) - toolbar.setAvatarClickListener { openAccountDialog() } - } - - private fun openAccountDialog() { - AccountDialog().show(supportFragmentManager, AccountDialog.TAG) - } - - private fun prepareNavigationView() { - navigationView.layoutParams?.width = AppGlobal.screenWidth - AppGlobal.screenWidth / 6 - - navigationView.setNavigationItemSelectedListener(this) - - drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) - } - - private fun prepareBottomBar() { -// val menu = bottomBar.menu -// -// val navigationFriends = menu.add(R.string.navigation_friends) -// navigationFriends.icon = drawable(R.drawable.ic_people_outline) -// -// val navigationConversations = menu.add(R.string.navigation_conversations) -// navigationConversations.icon = drawable(R.drawable.ic_message_outline) -// -// val navigationImportant = menu.add(R.string.navigation_important) -// navigationImportant.icon = drawable(R.drawable.ic_star_border) - - bottomBar.setOnNavigationItemSelectedListener(this) - } - - private fun createMenuItem(menu: Menu, tag: String): MenuItem { - return when (tag) { - "friends" -> - menu.add("Friends").apply { icon = drawable(R.drawable.ic_people_outline) } - "conversations" -> - menu.add("Conversations").apply { icon = drawable(R.drawable.ic_message_outline) } - "important" -> - menu.add("Important").apply { icon = drawable(R.drawable.ic_star_border) } - - else -> menu.add("") - } - } - - private fun checkLogin() { - if (UserConfig.isLoggedIn()) { - startLongPoll() - loadProfileInfo() - } else { - - } - } - - private fun openMainScreen() { - selectedId = R.id.navigationConversations - bottomBar.selectedItemId = selectedId - openConversationsScreen() - } - - private fun startLongPoll() { - startService(Intent(this, LongPollService::class.java)) - } - - private fun openConversationsScreen() { - FragmentSwitcher.showFragment( - supportFragmentManager, - fragmentConversationsDeprecated.javaClass.simpleName, - true - ) - } - - private fun openFriendsScreen() { - FragmentSwitcher.showFragment( - supportFragmentManager, - fragmentFriendsDeprecated.javaClass.simpleName, - true - ) - } - - private fun openSettingsScreen() { - startActivity(Intent(this, SettingsActivityDeprecated::class.java)) - } - - private fun loadProfileInfo() { - if (AndroidUtils.hasConnection()) { -// TaskManager.loadUser( -// VKApiKeys.UPDATE_USER, UserConfig.userId, -// object : OnResponseListener { -// override fun onResponse(response: VKUser) { -// prepareNavigationHeader(response) -// openMainScreen() -// } -// -// override fun onError(t: Throwable) { -// openMainScreen() -// } -// }) - } - } - - private fun prepareNavigationHeader(user: VKUser) { - ViewUtils.prepareNavigationHeader(navigationView.getHeaderView(0), user) - } - - override fun onNavigationItemSelected(item: MenuItem): Boolean { - switchFragment(item.itemId) - return true - } - - private fun switchFragment(itemId: Int) { - var valid = true - - when (itemId) { - R.id.navigationConversations -> { - openConversationsScreen() - } - R.id.navigationFriends -> { - openFriendsScreen() - } - R.id.navigationSettings -> { - openSettingsScreen() - } - else -> { - valid = false - } - } - - if (!valid) return - - if (selectedId != itemId) { - selectedId = itemId - navigationView.setCheckedItem(selectedId) - } - - if (drawerLayout.isDrawerOpen(GravityCompat.START)) { - drawerLayout.closeDrawer(GravityCompat.START) - } - } - - override fun onBackPressed() { - if (drawerLayout.isDrawerOpen(navigationView)) { - drawerLayout.closeDrawer(navigationView) - } else { - super.onBackPressed() - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/MessagesActivityDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/MessagesActivityDeprecated.kt deleted file mode 100644 index 8da1b952..00000000 --- a/app/src/main/java/com/meloda/fast/activity/MessagesActivityDeprecated.kt +++ /dev/null @@ -1,402 +0,0 @@ -package com.meloda.fast.activity - -import android.content.res.ColorStateList -import android.graphics.Color -import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.widget.* -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.widget.Toolbar -import androidx.core.view.isVisible -import androidx.core.widget.addTextChangedListener -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.amulyakhare.textdrawable.TextDrawable -import com.meloda.extensions.ContextExtensions.color -import com.meloda.extensions.DrawableExtensions.tint -import com.meloda.fast.R -import com.meloda.fast.activity.ui.presenter.MessagesPresenterDeprecated -import com.meloda.fast.activity.ui.view.MessagesViewDeprecated -import com.meloda.fast.base.BaseActivity -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.dialog.ProfileDialog -import com.meloda.fast.fragment.SettingsFragment -import com.meloda.fast.util.KeyboardUtils -import com.meloda.fast.util.TextUtils -import com.meloda.fast.util.ViewUtils -import com.meloda.fast.widget.CircleImageView -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKGroup -import com.meloda.vksdk.model.VKModel -import com.meloda.vksdk.model.VKUser - - -class MessagesActivityDeprecated : BaseActivity(), MessagesViewDeprecated { - - companion object { - const val TAG = "MessagesActivity" - - const val MESSAGES_COUNT = 30 - - const val TAG_EXTRA_TITLE = "title" - const val TAG_EXTRA_AVATAR = "avatar" - const val TAG_EXTRA_ID = "id" - const val TAG_EXTRA_USER = "user" - const val TAG_EXTRA_GROUP = "group" - } - - private var isEdit = false - - private var fabState = FabState.VOICE - - private enum class FabState { - VOICE, SEND, EDIT, DELETE, BLOCKED - } - - private var title = "" - private var avatar = "" - - private var lastMessageText = "" - private var attachments = arrayListOf() - - private var peerId = 0 - - private var dialogUser: VKUser? = null - private var dialogGroup: VKGroup? = null - - private lateinit var presenterDeprecated: MessagesPresenterDeprecated - - lateinit var recyclerView: RecyclerView - private lateinit var refreshLayout: SwipeRefreshLayout - private lateinit var toolbar: Toolbar - private lateinit var chatAvatar: CircleImageView - private lateinit var chatTitle: TextView - private lateinit var chatInfo: TextView - private lateinit var chatPanel: LinearLayout - private lateinit var chatMessage: EditText - private lateinit var chatSend: ImageButton - private lateinit var progressBar: ProgressBar - - private lateinit var noItemsView: LinearLayout - private lateinit var noInternetView: LinearLayout - private lateinit var errorView: LinearLayout - - override fun onDestroy() { - super.onDestroy() - presenterDeprecated.destroy() - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_messages) - initViews() - - initExtraData() - - prepareToolbar() - prepareRefreshLayout() - prepareRecyclerView() - prepareEditText() - - presenterDeprecated = MessagesPresenterDeprecated(this) - presenterDeprecated.setup(peerId, recyclerView) - } - - private fun initViews() { - toolbar = findViewById(R.id.toolbar) - recyclerView = findViewById(R.id.recyclerView) - refreshLayout = findViewById(R.id.refreshLayout) - chatAvatar = findViewById(R.id.chatAvatar) - chatTitle = findViewById(R.id.chatTitle) - chatInfo = findViewById(R.id.chatInfo) - chatPanel = findViewById(R.id.chatPanel) - chatMessage = findViewById(R.id.chatMessage) - chatSend = findViewById(R.id.chatSend) - progressBar = findViewById(R.id.progressBar) - - noItemsView = findViewById(R.id.noItemsView) - noInternetView = findViewById(R.id.noInternetView) - errorView = findViewById(R.id.errorView) - } - - private fun initExtraData() { - peerId = intent.getIntExtra(TAG_EXTRA_ID, -1) - title = intent.getStringExtra(TAG_EXTRA_TITLE) ?: "" - avatar = intent.getStringExtra(TAG_EXTRA_AVATAR) ?: "" - - dialogUser = intent.getSerializableExtra(TAG_EXTRA_USER) as VKUser? - dialogGroup = intent.getSerializableExtra(TAG_EXTRA_GROUP) as VKGroup? - } - - private fun prepareToolbar() { - setSupportActionBar(toolbar) - - val placeholder = TextDrawable - .builder() - .buildRound(TextUtils.getFirstLetterFromString(title), color(R.color.accent)) - - chatAvatar.setImageDrawable(placeholder) - -// chatAvatar.loadImage(avatar, placeholder) - - toolbar.setOnClickListener { presenterDeprecated.openProfile() } - - chatAvatar.setOnClickListener { presenterDeprecated.openProfile() } - - chatTitle.text = title - - supportActionBar?.setDisplayShowTitleEnabled(false) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - - toolbar.navigationIcon.tint(color(R.color.accent)) - } - - private fun prepareRefreshLayout() { - refreshLayout.isEnabled = false - } - - private fun prepareRecyclerView() { - recyclerView.layoutManager = - LinearLayoutManager(this, RecyclerView.VERTICAL, false).also { - it.stackFromEnd = true - } - - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - - if (dy < 0 && AppGlobal.inputMethodManager.isAcceptingText && AppGlobal.preferences.getBoolean( - SettingsFragment.KEY_HIDE_KEYBOARD_ON_SCROLL_UP, - true - ) - ) { - KeyboardUtils.hideKeyboardFrom(chatMessage) - } - } - }) - } - - private fun prepareEditText() { - chatMessage.addTextChangedListener { - fabState = if (it.toString().trim().isEmpty()) { - if (isEdit) { - FabState.DELETE - } else { - FabState.VOICE - } - } else { - if (isEdit) { - FabState.EDIT - } else { - FabState.SEND - } - } - - refreshFabStyle() - } - } - - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.activity_messages, menu) - return super.onCreateOptionsMenu(menu) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> onBackPressed() - - R.id.messagesRefresh -> { - presenterDeprecated.updateData() - } - } - - return super.onOptionsItemSelected(item) - } - - private fun refreshFabStyle() { - chatSend.isClickable = true - - when (fabState) { - FabState.VOICE -> { - chatSend.apply { - setImageResource(R.drawable.ic_mic) - - setOnClickListener { - showVoiceRecordingTip() - } - setOnLongClickListener { - true - } - } - } - FabState.SEND -> { - chatSend.apply { - setImageResource(R.drawable.ic_send) - - setOnClickListener { - presenterDeprecated.sendMessage(chatMessage.text.toString(), attachments) - } - - setOnLongClickListener { - presenterDeprecated.sendMessage(chatMessage.text.toString(), attachments, false) - true - } - } - } - FabState.EDIT -> { - chatSend.apply { - setImageResource(R.drawable.ic_done) - - setOnClickListener { - //editMessage() - } - - setOnLongClickListener { - performClick() - true - } - } - - } - FabState.DELETE -> { - chatSend.apply { - setImageResource(R.drawable.ic_trash_outline) - - chatSend.setOnClickListener { - //deleteMessage - } - - chatSend.setOnLongClickListener { - performClick() - true - } - } - } - FabState.BLOCKED -> { - chatSend.apply { - isClickable = false - setImageResource(R.drawable.ic_lock) - } - } - } - } - - override fun showChatPanel() { - chatPanel.isVisible = true - } - - override fun hideChatPanel() { - chatPanel.isVisible = false - } - - override fun setWritingAllowed(allowed: Boolean) { - if (allowed) { - fabState = FabState.VOICE - - chatSend.imageTintList = ColorStateList.valueOf(color(R.color.accent)) - - chatMessage.isEnabled = true - - chatPanel.setBackgroundResource(R.drawable.chat_panel_background) - } else { - fabState = FabState.BLOCKED - - chatSend.imageTintList = ColorStateList.valueOf(Color.WHITE) - - chatMessage.isEnabled = false - chatMessage.setHintTextColor(Color.WHITE) - chatMessage.setHint(R.string.no_access) - - chatPanel.setBackgroundResource(R.drawable.chat_panel_background_blocked) - } - } - - override fun setChatInfo(info: String) { - chatInfo.text = info - chatInfo.isVisible = info.isNotEmpty() - } - - override fun openProfile(conversation: VKConversation) { - conversation.let { - val profileDialog = ProfileDialog(it, title) - profileDialog.show(supportFragmentManager, ProfileDialog.TAG) - } - } - - override fun showErrorLoadConversationAlert() { - val builder = AlertDialog.Builder(this) - builder.setTitle(R.string.error_occurred) - builder.setMessage(R.string.error_loading_message) - builder.setPositiveButton(R.string.retry) { _, _ -> - presenterDeprecated.loadConversation(peerId) - } - builder.setNegativeButton(R.string.no) { _, _ -> onBackPressed() } - builder.setCancelable(false) - builder.show() - } - - override fun showVoiceRecordingTip() { - Toast.makeText(this, R.string.voice_record_tip, Toast.LENGTH_LONG).show() - } - - override fun setMessageText(text: String) { - chatMessage.setText(text) - } - - override fun showErrorSnackbar(t: Throwable) { - ViewUtils.showErrorSnackbar(getRootView(), t) - } - - override fun prepareNoItemsView() { - } - - override fun showNoItemsView() { - noItemsView.isVisible = true - } - - override fun hideNoItemsView() { - noItemsView.isVisible = false - } - - override fun prepareNoInternetView() { - } - - override fun showNoInternetView() { - noInternetView.isVisible = true - } - - override fun hideNoInternetView() { - noInternetView.isVisible = false - } - - override fun prepareErrorView() { - } - - override fun showErrorView() { - errorView.isVisible = true - } - - override fun hideErrorView() { - errorView.isVisible = false - } - - override fun showProgressBar() { - progressBar.isVisible = true - } - - override fun hideProgressBar() { - progressBar.isVisible = false - } - - override fun showRefreshLayout() { - refreshLayout.isRefreshing = true - } - - override fun hideRefreshLayout() { - refreshLayout.isRefreshing = false - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/SettingsActivityDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/SettingsActivityDeprecated.kt deleted file mode 100644 index 2c964d52..00000000 --- a/app/src/main/java/com/meloda/fast/activity/SettingsActivityDeprecated.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.meloda.fast.activity - -import android.os.Bundle -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.fast.R -import com.meloda.fast.base.BaseActivity -import com.meloda.fast.common.FragmentSwitcher -import com.meloda.fast.fragment.SettingsFragment -import com.meloda.fast.util.ColorUtils -import com.meloda.fast.widget.Toolbar - -class SettingsActivityDeprecated : BaseActivity() { - - private lateinit var toolbar: Toolbar - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) - initViews() - - setSupportActionBar(toolbar) - - toolbar.setNavigationClickListener { onBackPressed() } - - toolbar.navigationIcon = drawable(R.drawable.ic_arrow_back) - toolbar.tintNavigationIcon(ColorUtils.getColorAccent(this)) - - supportFragmentManager.beginTransaction() - .replace(R.id.fragmentContainer, SettingsFragment()) - .commit() - } - - private fun initViews() { - toolbar = findViewById(R.id.toolbar) - } - - override fun onBackPressed() { - val currentFragment = FragmentSwitcher.getCurrentFragment(supportFragmentManager) ?: return - - if (currentFragment.javaClass == SettingsFragment::class.java && (currentFragment as SettingsFragment).onBackPressed()) { - super.onBackPressed() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/UpdateActivityDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/UpdateActivityDeprecated.kt deleted file mode 100644 index eab5b026..00000000 --- a/app/src/main/java/com/meloda/fast/activity/UpdateActivityDeprecated.kt +++ /dev/null @@ -1,350 +0,0 @@ -package com.meloda.fast.activity - -import android.app.Activity -import android.app.DownloadManager -import android.content.Intent -import android.content.IntentFilter -import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.os.Environment -import android.util.Log -import android.view.View -import android.widget.LinearLayout -import android.widget.TextView -import androidx.appcompat.app.AlertDialog -import androidx.core.content.FileProvider -import androidx.core.text.HtmlCompat -import androidx.core.view.isVisible -import com.github.rahatarmanahmed.cpv.CircularProgressView -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton -import com.meloda.concurrent.TaskManager -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.extensions.FloatExtensions.int -import com.meloda.fast.BuildConfig -import com.meloda.fast.R -import com.meloda.fast.base.BaseActivity -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.common.UpdateManager -import com.meloda.fast.model.NewUpdateInfo -import com.meloda.fast.receiver.DownloadUpdateReceiver -import com.meloda.fast.util.AndroidUtils -import com.meloda.fast.util.TimeUtils -import com.meloda.vksdk.OnResponseListener -import java.io.File -import java.text.SimpleDateFormat -import java.util.* - - -class UpdateActivityDeprecated : BaseActivity() { - - companion object { - private const val FILE_BASE_PATH = "file://" - private const val MIME_TYPE = "application/vnd.android.package-archive" - private const val PROVIDER_PATH = ".provider" - } - - private var isChecking = false - private var isNewUpdate = false - private var isDownloading = false - - private var downloadId = 0L - - private var lastCheckTime = 0L - - private var newUpdate = NewUpdateInfo() - - private lateinit var updateCheckUpdates: ExtendedFloatingActionButton - private lateinit var updateState: TextView - private lateinit var updateVersion: TextView - private lateinit var updateInfo: TextView - private lateinit var updateInfoLayout: LinearLayout - private lateinit var updateProgress: LinearLayout - private lateinit var updateProgressBar: CircularProgressView - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_update) - initViews() - - updateProgressBar.maxProgress = 100F - - lastCheckTime = AppGlobal.preferences.getLong("updateCheckTime", 0) - - refreshState() - - checkUpdates() - - updateCheckUpdates.setOnClickListener { - lastCheckTime = System.currentTimeMillis() - AppGlobal.preferences.edit().putLong("updateCheckTime", lastCheckTime).apply() - - checkUpdates() - } - } - - private fun initViews() { - updateCheckUpdates = findViewById(R.id.updateCheckUpdates) - updateInfo = findViewById(R.id.updateInfo) - updateVersion = findViewById(R.id.updateVersion) - updateState = findViewById(R.id.updateState) - updateInfoLayout = findViewById(R.id.updateInfoLayout) - updateProgress = findViewById(R.id.updateProgress) - updateProgressBar = updateProgress.getChildAt(0) as CircularProgressView - } - - private fun installUpdate(context: Activity, file: File) { - val install = Intent(Intent.ACTION_VIEW) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - install.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) - install.data = FileProvider.getUriForFile( - this, - BuildConfig.APPLICATION_ID + PROVIDER_PATH, - file - ) - } else { - install.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP - install.setDataAndType(Uri.fromFile(file), MIME_TYPE) - } - - context.startActivity(install) -// context.finishAffinity() - } - - private fun downloadUpdate() { - checkIsInstallingAllowed() - - val timer = Timer() - - updateCheckUpdates.shrink() - updateCheckUpdates.isClickable = false - - isDownloading = true - refreshState() - - TaskManager.execute { - val apkName = newUpdate.version - - val destination = - getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + "/$apkName.apk" - - val uri = Uri.parse("$FILE_BASE_PATH$destination") - - val file = File(destination) - if (file.exists()) file.delete() - - val request = DownloadManager.Request(Uri.parse(newUpdate.downloadLink)) - - request.setTitle("${getString(R.string.app_name)} ${apkName}.apk") - request.setMimeType(MIME_TYPE) - request.setDestinationUri(uri) - request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE) - request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE) - - val receiver = DownloadUpdateReceiver() - receiver.listener = object : OnResponseListener { - override fun onResponse(response: Any?) { - timer.cancel() - - installUpdate(this@UpdateActivityDeprecated, file) - - unregisterReceiver(receiver) - - runOnUiThread { - updateProgressBar.isIndeterminate = true - - updateCheckUpdates.extend() - updateCheckUpdates.isClickable = true - - isDownloading = false - refreshState() - } - } - - override fun onError(t: Throwable) { - } - } - - registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) - - downloadId = AppGlobal.downloadManager.enqueue(request) - - timer.schedule(object : TimerTask() { - override fun run() { - val query = DownloadManager.Query() - query.setFilterById(downloadId) - - val cursor = AppGlobal.downloadManager.query(query) - if (cursor.moveToFirst()) { - val sizeIndex = - cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES) - val downloadedIndex = - cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR) - val size = cursor.getInt(sizeIndex) - val downloaded = cursor.getInt(downloadedIndex) - - val progress = if (size != -1) (downloaded * 100.0F / size) else 0.0F - - Log.d("Downloading update", "progress $progress%") - - if (progress.int() > 0) { - runOnUiThread { - if (updateProgressBar.isIndeterminate) { - updateProgressBar.isIndeterminate = false - updateProgressBar.stopAnimation() - } - - updateProgressBar.progress = progress - } - } - } - } - - }, 0, 1000) - } - } - - private fun checkUpdates() { - if (isChecking) return - - isChecking = true - refreshState() - - UpdateManager.checkUpdates(object : UpdateManager.OnUpdateListener { - override fun onNewUpdate(updateInfo: NewUpdateInfo) { - isChecking = false - isNewUpdate = true - - this@UpdateActivityDeprecated.newUpdate = updateInfo - - refreshState() - } - - override fun onNoUpdates() { - isNewUpdate = false - isChecking = false - - this@UpdateActivityDeprecated.newUpdate = NewUpdateInfo() - - refreshState() - } - }) - } - - private fun checkIsInstallingAllowed() { - if (!AndroidUtils.isCanInstallUnknownApps(this)) { - val builder = AlertDialog.Builder(this) - builder.setTitle(R.string.warning) - builder.setMessage(R.string.update_unknown_sources_disabled_message) - builder.setPositiveButton(R.string.yes) { _, _ -> - AndroidUtils.openInstallUnknownAppsScreen(this) - } - builder.setNegativeButton(R.string.no, null) - builder.show() - } - } - - private fun refreshState() { - when { - isChecking -> { - updateState.text = getString(R.string.update_state_checking) - - setAlpha(updateInfoLayout, true) - setAlpha(updateProgress, false) - setAlpha(updateCheckUpdates, true) - } - isDownloading -> { - updateState.text = getString(R.string.update_state_downloading) - - setAlpha(updateInfoLayout, true) - setAlpha(updateProgress, false) - setAlpha(updateCheckUpdates, true) - } - else -> { - if (isNewUpdate) { - updateCheckUpdates.text = getString(R.string.update_download) - updateCheckUpdates.icon = drawable(R.drawable.ic_file_download) - } else { - updateCheckUpdates.text = getString(R.string.update_check_updates) - updateCheckUpdates.icon = drawable(R.drawable.ic_refresh) - } - - updateCheckUpdates.setOnClickListener { - if (isNewUpdate) { - downloadUpdate() - } else { - checkUpdates() - } - } - - updateState.text = - getString(if (isNewUpdate) R.string.update_state_update_available else R.string.update_state_no_updates) - - updateVersion.text = - if (isNewUpdate) - getString( - R.string.update_new_version, - newUpdate.version, - newUpdate.code - ) - else getString( - R.string.update_current_version, - AppGlobal.versionName, - AppGlobal.versionCode - ) - - updateInfo.text = - when { - isNewUpdate -> if (newUpdate.changelog.isEmpty()) "" else getString( - R.string.update_changelog, - HtmlCompat.fromHtml( - newUpdate.changelog, - HtmlCompat.FROM_HTML_MODE_LEGACY - ) - ) - lastCheckTime.toString().isEmpty() || lastCheckTime == 0L -> "" - else -> getString(R.string.update_last_check_time, getCheckTime()) - } - - setAlpha(updateInfoLayout, false) - setAlpha(updateProgress, true) - setAlpha(updateCheckUpdates, false) - } - } - } - - private fun getCheckTime(): String { - val time = lastCheckTime - - val lastTime = TimeUtils.removeTime(Date(time)) - val currentTime = TimeUtils.removeTime(Date(System.currentTimeMillis())) - - val format = if (currentTime > lastTime) { - "dd.MM.yyyy HH:mm" - } else { - "HH:mm" - } - - return SimpleDateFormat(format, Locale.getDefault()).format(time) - } - - private fun setAlpha(view: View, toZero: Boolean) { - if (toZero) { - view.animate() - .alpha(0F) - .setDuration(250) - .withEndAction { view.isVisible = false } - .start() - } else { - view.animate() - .alpha(1F) - .setDuration(250) - .withStartAction { view.isVisible = true } - .start() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/ui/presenter/MessagesPresenterDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/ui/presenter/MessagesPresenterDeprecated.kt deleted file mode 100644 index 1315330e..00000000 --- a/app/src/main/java/com/meloda/fast/activity/ui/presenter/MessagesPresenterDeprecated.kt +++ /dev/null @@ -1,254 +0,0 @@ -package com.meloda.fast.activity.ui.presenter - -import androidx.recyclerview.widget.RecyclerView -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.activity.ui.repository.MessagesRepositoryDeprecated -import com.meloda.fast.activity.ui.view.MessagesViewDeprecated -import com.meloda.fast.adapter.MessagesAdapterDeprecated -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.listener.ItemClickListener -import com.meloda.fast.listener.ItemLongClickListener -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpPresenter -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKMessage -import com.meloda.vksdk.model.VKModel -import kotlin.random.Random - -class MessagesPresenterDeprecated(viewState: MessagesViewDeprecated) : - MvpPresenter( - viewState, - MessagesRepositoryDeprecated::class.java.name - ), - ItemClickListener, - ItemLongClickListener, - TaskManager.OnEventListener { - - companion object { - const val DEFAULT_MESSAGES_COUNT = 30 - } - - private lateinit var adapter: MessagesAdapterDeprecated - private lateinit var conversation: VKConversation - - private var peerId: Int = -1 - - private var lastMessageText: String = "" - - private lateinit var recyclerView: RecyclerView - - override fun destroy() { - adapter.destroy() - } - - fun setup(peerId: Int, recyclerView: RecyclerView) { - this.peerId = peerId - this.recyclerView = recyclerView - this.context = recyclerView.context - - viewState.showProgressBar() - getCachedConversation(peerId) - } - - fun updateData() { - adapter.clear() - loadMessages(peerId) - } - - fun openProfile() { - viewState.openProfile(conversation) - } - - private fun createAdapter() { - adapter = MessagesAdapterDeprecated(context!!, arrayListOf(), conversation).also { - it.itemClickListener = this - it.itemLongClickListener = this - } - - recyclerView.adapter = adapter - } - - private fun getCachedConversation(peerId: Int) { - repository.getCachedConversation(peerId, object : MvpOnResponseListener { - override fun onResponse(response: VKConversation) { - conversation = response - - createAdapter() - refreshConversation(response) - - getCachedMessages(peerId, 0, DEFAULT_MESSAGES_COUNT, - object : MvpOnResponseListener { - override fun onResponse(response: Any?) { - loadConversation(peerId) - loadMessages(peerId) - } - - override fun onError(t: Throwable) { - loadConversation(peerId) - loadMessages(peerId) - } - }) - } - - override fun onError(t: Throwable) { - loadConversation(peerId) - loadMessages(peerId) - } - }) - } - - fun loadConversation(peerId: Int) { - if (adapter.isNotEmpty()) { - viewState.hideProgressBar() - } - - repository.loadConversation(peerId, object : MvpOnResponseListener { - - override fun onResponse(response: VKConversation) { - conversation = response - - createAdapter() - refreshConversation(response) - } - - override fun onError(t: Throwable) { - viewState.hideProgressBar() - viewState.showErrorLoadConversationAlert() - } - - }) - } - - private fun refreshConversation(conversation: VKConversation) { - checkIsWritingAllowed(conversation) - - repository.getChatInfo( - conversation, - object : MvpOnResponseListener { - override fun onResponse(response: String) { - viewState.setChatInfo(response) - } - - override fun onError(t: Throwable) { - viewState.setChatInfo(AppGlobal.resources.getString(R.string.error_obtain_chat_info)) - } - }) - } - - private fun checkIsWritingAllowed(conversation: VKConversation) { - if (conversation.isGroupChannel) { - viewState.hideChatPanel() - return - } - - viewState.showChatPanel() - viewState.setWritingAllowed(conversation.isAllowed) - } - - private fun getCachedMessages( - peerId: Int, - offset: Int = 0, - count: Int = DEFAULT_MESSAGES_COUNT, - listener: MvpOnResponseListener? = null - ) { - repository.getCachedMessages(peerId, offset, count, - object : MvpOnResponseListener> { - override fun onResponse(response: ArrayList) { - viewState.hideProgressBar() - fillAdapter(response, offset) - - listener?.onResponse(null) - } - - override fun onError(t: Throwable) { - if (adapter.isEmpty()) { - viewState.showProgressBar() - } - - listener?.onError(t) - } - }) - } - - private fun loadMessages(peerId: Int, offset: Int = 0, count: Int = DEFAULT_MESSAGES_COUNT) { - repository.loadMessages(peerId, offset, count, - object : MvpOnResponseListener> { - override fun onResponse(response: ArrayList) { - fillAdapter(response, offset) - } - - override fun onError(t: Throwable) { - - } - - }) - } - - private fun fillAdapter( - messages: ArrayList, - offset: Int - ) { - if (adapter.isEmpty()) adapter.isNotCachedValues = true - if (offset == 0) { - adapter.updateValues(messages) - } else { - adapter.addAll(messages) - } - - adapter.notifyDataSetChanged() - - if (offset == 0) recyclerView.scrollToPosition(adapter.itemCount - 1) - } - - override fun onItemClick(position: Int) { - - } - - override fun onItemLongClick(position: Int) { - - } - - override fun onNewEvent(info: EventInfo<*>) { - - } - - fun sendMessage( - text: String = "", - attachments: ArrayList = arrayListOf(), - scrollToBottom: Boolean = true - ) { - lastMessageText = text - - val message = VKMessage().also { - it.date = (System.currentTimeMillis() / 1000).toInt() - it.text = text - it.isOut = true - it.peerId = peerId - it.fromId = UserConfig.userId - it.randomId = Random.nextInt() - } - - viewState.setMessageText("") - - adapter.addMessage(message, true, scrollToBottom) - - repository.sendMessage(peerId, text, message.randomId, object : MvpOnResponseListener { - override fun onResponse(response: Int) { - message.id = response - -// TaskManager.execute { MemoryCache.put(message) } -// TaskManager.loadMessage(VKApiKeys.UPDATE_MESSAGE, response) - } - - override fun onError(t: Throwable) { - viewState.showErrorSnackbar(t) - - viewState.setMessageText(lastMessageText) - } - }) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/ui/repository/MessagesRepositoryDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/ui/repository/MessagesRepositoryDeprecated.kt deleted file mode 100644 index 40fe8696..00000000 --- a/app/src/main/java/com/meloda/fast/activity/ui/repository/MessagesRepositoryDeprecated.kt +++ /dev/null @@ -1,170 +0,0 @@ -package com.meloda.fast.activity.ui.repository - -import com.meloda.concurrent.TaskManager -import com.meloda.fast.R -import com.meloda.fast.common.AppGlobal -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpRepository -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.VKApi -import com.meloda.vksdk.VKConstants -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKMessage -import com.meloda.vksdk.util.VKUtil -import java.util.* - -class MessagesRepositoryDeprecated : MvpRepository() { - - fun loadMessages( - peerId: Int, - offset: Int, - count: Int, - listener: MvpOnResponseListener> - ) { - TaskManager.execute { - VKApi.messages() - .getHistory() - .peerId(peerId) - .reversed(false) - .extended(true) - .fields(VKConstants.USER_FIELDS + "," + VKConstants.GROUP_FIELDS) - .offset(offset) - .count(count) - .executeArray( - VKMessage::class.java, - object : OnResponseListener> { - override fun onResponse(response: ArrayList) { - TaskManager.execute { - cacheLoadedMessages(response) - -// MemoryCache.putUsers(VKMessage.profiles) -// MemoryCache.putGroups(VKMessage.groups) -// MemoryCache.putConversations(VKMessage.conversations) - - VKUtil.sortMessagesByDate(response, false) - - sendResponse(listener, response) - } - } - - override fun onError(t: Throwable) { - sendError(listener, t) - } - }) - } - } - - fun getCachedMessages( - peerId: Int, offset: Int, count: Int, - listener: MvpOnResponseListener> - ) { - TaskManager.execute { -// val messages = MemoryCache.getMessagesByPeerId(peerId).asArrayList() -// -// if (messages.isEmpty()) { -// sendError(listener, NullPointerException("Messages is empty")) -// return@execute -// } -// -// VKUtil.sortMessagesByDate(messages, false) -// -// val preparedMessages = ArrayUtils.cut(messages, offset, count) -// -// sendResponseArray(listener, preparedMessages) - } - } - - fun getCachedConversation(peerId: Int, listener: MvpOnResponseListener) { - TaskManager.execute { -// val conversation = MemoryCache.getConversationById(peerId) -// -// if (conversation == null) { -// sendError( -// listener, -// NullPointerException("Conversation is not cached at the moment") -// ) -// } else { -// sendResponse(listener, conversation) -// } - } - } - - fun loadConversation(peerId: Int, listener: MvpOnResponseListener) { -// TaskManager.loadConversation( -// VKApiKeys.UPDATE_CONVERSATION, -// peerId, -// object : OnResponseListener { -// override fun onResponse(response: VKConversation) { -// sendResponse(listener, response) -// } -// -// override fun onError(t: Throwable) { -// sendError(listener, t) -// } -// }) - } - - fun getChatInfo(conversation: VKConversation, listener: MvpOnResponseListener) { - when (conversation.type) { - VKConversation.Type.CHAT -> { - sendResponse( - listener, - AppGlobal.resources.getString( - if (conversation.isGroupChannel) - R.string.group_channel_members - else R.string.chat_members, - conversation.membersCount - ) - ) - } - VKConversation.Type.USER -> { -// val user = VKUtil.searchUser(conversation.conversationId, -// object : OnResponseListener { -// override fun onResponse(response: VKUser) { -// sendResponse(listener, VKUtil.getUserOnline(response)) -// } -// -// override fun onError(t: Throwable) { -// sendError(listener, t) -// } -// }) -// -// user?.let { -// sendResponse(listener, VKUtil.getUserOnline(it)) -// } - } - else -> { - sendResponse(listener, "") - } - } - } - - fun sendMessage( - peerId: Int, - message: String, - randomId: Int, - listener: MvpOnResponseListener - ) { - TaskManager.execute { - VKApi.messages() - .send() - .peerId(peerId) - .message(message) - .randomId(randomId) - .executeArray(Int::class.java, object : OnResponseListener> { - override fun onResponse(response: ArrayList) { - val messageId = response[0] - sendResponse(listener, messageId) - } - - override fun onError(t: Throwable) { - sendError(listener, t) - } - }) - } - } - - private fun cacheLoadedMessages(messages: ArrayList) { -// MemoryCache.putMessages(messages) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/activity/ui/view/MessagesViewDeprecated.kt b/app/src/main/java/com/meloda/fast/activity/ui/view/MessagesViewDeprecated.kt deleted file mode 100644 index ae5a28e8..00000000 --- a/app/src/main/java/com/meloda/fast/activity/ui/view/MessagesViewDeprecated.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.meloda.fast.activity.ui.view - -import com.meloda.mvp.MvpView -import com.meloda.vksdk.model.VKConversation - -interface MessagesViewDeprecated : MvpView { - - fun showChatPanel() - - fun hideChatPanel() - - fun setWritingAllowed(allowed: Boolean) - - fun setChatInfo(info: String) - - fun openProfile(conversation: VKConversation) - - fun showErrorLoadConversationAlert() - - fun showVoiceRecordingTip() - - fun setMessageText(text: String) - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/ChatsAdapter.kt b/app/src/main/java/com/meloda/fast/adapter/ChatsAdapter.kt deleted file mode 100644 index 4e16ebf3..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/ChatsAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.meloda.fast.adapter - -import android.content.Context -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.fast.R -import com.meloda.fast.VKLongPollParser -import com.meloda.fast.adapter.diffutil.ConversationsCallback -import com.meloda.fast.base.BaseAdapter -import com.meloda.fast.base.BaseHolder -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKMessage - -class ChatsAdapter(context: Context, values: ArrayList) : - BaseAdapter( - context, values - ), - TaskManager.OnEventListener, - VKLongPollParser.OnMessagesListener { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(view(R.layout.item_conversation, parent)) - } - - override fun notifyChanges(oldList: List, newList: List) { - val callback = ConversationsCallback(oldList, newList) - val diff = DiffUtil.calculateDiff(callback) - - diff.dispatchUpdatesTo(this) - } - - override fun onNewEvent(info: EventInfo<*>) { - - } - - inner class ViewHolder(v: View) : BaseHolder(v) { - - override fun bind(position: Int, payloads: MutableList?) { - val conversation = getItem(position) - val lastMessage = conversation.lastMessage - - TaskManager.execute { - - } - } - - } - - override fun onNewMessage(message: VKMessage) { - TODO("Not yet implemented") - } - - override fun onEditMessage(message: VKMessage) { - TODO("Not yet implemented") - } - - override fun onRestoredMessage(message: VKMessage) { - TODO("Not yet implemented") - } - - override fun onDeleteMessage(peerId: Int, messageId: Int) { - TODO("Not yet implemented") - } - - override fun onReadMessage(peerId: Int, messageId: Int) { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/ConversationsAdapterDeprecated.kt b/app/src/main/java/com/meloda/fast/adapter/ConversationsAdapterDeprecated.kt deleted file mode 100644 index ab7d6808..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/ConversationsAdapterDeprecated.kt +++ /dev/null @@ -1,696 +0,0 @@ -package com.meloda.fast.adapter - -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.net.Uri -import android.text.SpannableString -import android.text.TextUtils -import android.text.style.ForegroundColorSpan -import android.util.Log -import android.view.View -import android.view.ViewGroup -import android.widget.FrameLayout -import android.widget.ImageView -import android.widget.TextView -import androidx.core.view.isVisible -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.extensions.ContextExtensions.color -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.adapter.diffutil.ConversationsCallbackDeprecated -import com.meloda.fast.base.BaseAdapter -import com.meloda.fast.base.BaseHolder -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.database.CacheStorage -import com.meloda.fast.util.VKUtils -import com.meloda.fast.widget.CircleImageView -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.VKApiKeys -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKGroup -import com.meloda.vksdk.model.VKMessage -import com.meloda.vksdk.model.VKUser -import com.meloda.vksdk.util.VKUtil - - -@Suppress("UNCHECKED_CAST") -class ConversationsAdapterDeprecated( - val recyclerView: RecyclerView, - values: ArrayList -) : BaseAdapter( - recyclerView.context, - values -), TaskManager.OnEventListener { - - companion object { - private const val TAG = "ConversationsAdapter" - } - - var isLoading: Boolean = false - private var currentPosition: Int = -1 - - init { - TaskManager.addOnEventListener(this) - } - - override fun destroy() { - TaskManager.removeOnEventListener(this) - } - - override fun onNewEvent(info: EventInfo<*>) { - when (info.key) { - VKApiKeys.NEW_MESSAGE.name -> addMessage(info.data as VKMessage) - VKApiKeys.EDIT_MESSAGE.name -> editMessage(info.data as VKMessage) - VKApiKeys.RESTORE_MESSAGE.name -> restoreMessage(info.data as VKMessage) - VKApiKeys.READ_MESSAGE.name -> readMessage( - (info.data as Array)[0], - (info.data as Array)[1] - ) - VKApiKeys.DELETE_MESSAGE.name -> deleteMessage( - (info.data as Array)[0], - (info.data as Array)[1] - ) - - VKApiKeys.UPDATE_CONVERSATION.name -> updateConversation(info.data as Int) - VKApiKeys.UPDATE_MESSAGE.name -> updateMessage(info.data as Int) - VKApiKeys.UPDATE_USER.name -> updateUsers(info.data as ArrayList) - VKApiKeys.UPDATE_GROUP.name -> updateGroups(info.data as ArrayList) - - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ConversationHolder { - return ConversationHolder(view(R.layout.item_conversation, parent)) - } - - override fun onBindViewHolder( - holder: ConversationHolder, - position: Int, - payloads: MutableList - ) { - currentPosition = position - initListeners(holder.itemView, position) - holder.bind(position, payloads) - } - - fun isLastItem() = currentPosition >= itemCount - 1 - - inner class ConversationHolder(v: View) : BaseHolder(v) { - - private var attachments: ImageView = v.findViewById(R.id.conversationTextAttachment) - private var text: TextView = v.findViewById(R.id.conversationText) - private var title: TextView = v.findViewById(R.id.conversationTitle) - private var avatar: ImageView = v.findViewById(R.id.conversationAvatar) - private var online: ImageView = v.findViewById(R.id.conversationUserOnline) - private var out: CircleImageView = v.findViewById(R.id.conversationOut) - private var counter: TextView = v.findViewById(R.id.conversationCounter) - private var date: TextView = v.findViewById(R.id.conversationDate) - private var type: ImageView = v.findViewById(R.id.conversationType) - private var userAvatar: ImageView = v.findViewById(R.id.conversationUserAvatar) - private var root: FrameLayout = v.findViewById(R.id.conversationRoot) - - private val colorHighlight = context.color(R.color.accent) - - override fun bind(position: Int) { - bind(position, mutableListOf()) - } - - override fun bind(position: Int, payloads: MutableList?) { - Log.d(TAG, "bind position: $position") - - val conversation = getItem(position) - val lastMessage = conversation.lastMessage - - TaskManager.execute { - val peerUser: VKUser? = - if (conversation.isUser()) CacheStorage.usersStorage.getUser(conversation.id) else null - - val peerGroup: VKGroup? = - if (conversation.isGroup()) CacheStorage.groupsStorage.getGroup(conversation.id) else null - - val fromUser: VKUser? = - if (lastMessage.isFromUser()) CacheStorage.usersStorage.getUser(lastMessage.fromId) else null - - val fromGroup: VKGroup? = - if (lastMessage.isFromGroup()) CacheStorage.groupsStorage.getGroup(lastMessage.fromId) else null - - conversation.peerUser = peerUser - conversation.peerGroup = peerGroup - - lastMessage.fromUser = fromUser - lastMessage.fromGroup = fromGroup - - post { - val dialogTitle = setTitle(conversation, peerUser, peerGroup) - - if (payloads != null && payloads.isNotEmpty()) { - for (payload in payloads) { - when (payload) { - ConversationsCallbackDeprecated.CONVERSATION -> { - setUserOnline(conversation, peerUser) - prepareUserAvatar( - conversation, - lastMessage, - fromUser, - fromGroup - ) - prepareAvatar(dialogTitle, conversation, peerUser, peerGroup) - setDialogType(conversation) - setIsRead(lastMessage, conversation) - setCounterBackground(conversation) - } - ConversationsCallbackDeprecated.MESSAGE -> { - prepareUserAvatar( - conversation, - lastMessage, - fromUser, - fromGroup - ) - prepareAttachments(lastMessage) - setIsRead(lastMessage, conversation) - setDate(lastMessage) - } - ConversationsCallbackDeprecated.GROUP -> { - prepareAvatar(dialogTitle, conversation, peerUser, peerGroup) - } - ConversationsCallbackDeprecated.USER -> { - setUserOnline(conversation, peerUser) - prepareAvatar(dialogTitle, conversation, peerUser, peerGroup) - } - ConversationsCallbackDeprecated.EDIT_MESSAGE -> { - prepareUserAvatar( - conversation, - lastMessage, - fromUser, - fromGroup - ) - prepareAttachments(lastMessage) - setIsRead(lastMessage, conversation) - setDate(lastMessage) - } - ConversationsCallbackDeprecated.DATE -> { - setDate(lastMessage) - } - ConversationsCallbackDeprecated.ONLINE -> { - setUserOnline(conversation, peerUser) - } - ConversationsCallbackDeprecated.ATTACHMENTS -> { - prepareAttachments(lastMessage) - } - ConversationsCallbackDeprecated.AVATAR -> { - prepareAvatar(dialogTitle, conversation, peerUser, peerGroup) - } - ConversationsCallbackDeprecated.USER_AVATAR -> { - prepareUserAvatar( - conversation, - lastMessage, - fromUser, - fromGroup - ) - } - ConversationsCallbackDeprecated.READ -> { - setIsRead(lastMessage, conversation) - } - ConversationsCallbackDeprecated.NOTIFICATIONS -> { - setCounterBackground(conversation) - } - } - } - - return@post - } - - setUserOnline(conversation, peerUser) - - prepareUserAvatar(conversation, lastMessage, fromUser, fromGroup) - - prepareAvatar(dialogTitle, conversation, peerUser, peerGroup) - - setDialogType(conversation) - - prepareAttachments(lastMessage) - - setIsRead(lastMessage, conversation) - - setDate(lastMessage) - - setCounterBackground(conversation) - - root.isVisible = true - } - } - } - - private fun setTitle( - conversation: VKConversation, - peerUser: VKUser?, - peerGroup: VKGroup? - ): String { - val dialogTitle = VKUtil.getTitle(conversation, peerUser, peerGroup) - title.text = dialogTitle - - return dialogTitle - } - - private fun setUserOnline(conversation: VKConversation, peerUser: VKUser?) { - val onlineIcon = VKUtils.getUserOnlineIcon(context, conversation, peerUser) - - online.setImageDrawable(onlineIcon) - online.isVisible = onlineIcon != null - } - - private fun prepareUserAvatar( - conversation: VKConversation, - lastMessage: VKMessage, - fromUser: VKUser?, - fromGroup: VKGroup? - ) { - if ((conversation.isChat() || lastMessage.isOut) && !conversation.isGroupChannel) { - userAvatar.isVisible = true - - val avatar = VKUtil.getUserAvatar(lastMessage, fromUser, fromGroup) - - if (avatar.isEmpty()) { - userAvatar.setImageDrawable(ColorDrawable(Color.TRANSPARENT)) - } else { - userAvatar.setImageURI(Uri.parse(avatar)) - } - } else { - userAvatar.isVisible = false - userAvatar.setImageDrawable(null) - } - } - - private fun prepareAvatar( - dialogTitle: String, - conversation: VKConversation, - peerUser: VKUser?, - peerGroup: VKGroup? - ) { - val dialogAvatarPlaceholder = VKUtils.getAvatarPlaceholder(context, dialogTitle) - - avatar.setImageDrawable(dialogAvatarPlaceholder) - - val avatarLink = VKUtil.getAvatar(conversation, peerUser, peerGroup) - - if (avatarLink.isNotEmpty()) { - avatar.setImageURI(Uri.parse(avatarLink)) - } - } - - private fun setDialogType(conversation: VKConversation) { -// val dDialogType = VKUtil.getDialogType(context, conversation) -// -// type.setImageDrawable(dDialogType) -// type.isVisible = dDialogType != null -// type.isVisible = false - } - - private fun prepareAttachments(lastMessage: VKMessage) { -// text.apply { -// compoundDrawablePadding = 0 -// setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, null, null) -// } - attachments.isVisible = false - - if (lastMessage.action == null) { - when { - lastMessage.attachments.isNotEmpty() -> { - val attachmentString = - VKUtils.getAttachmentText(context, lastMessage.attachments) - - val attachmentText = - if (lastMessage.text.isEmpty()) attachmentString else lastMessage.text - - val startIndex = - if (lastMessage.text.isEmpty()) 0 else lastMessage.text.length - - val span = SpannableString(attachmentText).apply { - setSpan( - ForegroundColorSpan(colorHighlight), - startIndex, - attachmentText.length, - 0 - ) - } - - val attachmentDrawable = - VKUtils.getAttachmentDrawable(context, lastMessage.attachments) - text.text = span - - attachments.isVisible = true - attachments.setImageDrawable(attachmentDrawable) - -// text.apply { -// text = span -// setCompoundDrawablesRelativeWithIntrinsicBounds( -// attachmentDrawable, -// null, -// null, -// null -// ) -// compoundDrawablePadding = 8 -// } - } - lastMessage.fwdMessages.isNotEmpty() -> { - val fwdText = - VKUtils.getFwdText(context, lastMessage.getForwardedMessages()) - val span = SpannableString(fwdText).apply { - setSpan(ForegroundColorSpan(colorHighlight), 0, fwdText.length, 0) - } - - text.text = span - } - else -> { - text.text = if (text.maxLines == 1) lastMessage.text.replace( - "\n", - " " - ) else lastMessage.text - } - } - } else { - VKUtils.getActionText(context, lastMessage, - object : OnResponseListener { - override fun onResponse(response: String) { - val span = SpannableString(response).apply { - setSpan( - ForegroundColorSpan(colorHighlight), - 0, - response.length, - 0 - ) - } - - text.text = span - } - - override fun onError(t: Throwable) { - TODO("Not yet implemented") - } - - }) - - } - - if (lastMessage.attachments.isEmpty() && lastMessage.fwdMessages.isEmpty() && lastMessage.action == null && TextUtils.isEmpty( - lastMessage.text - ) - ) { - val unknown = "..." - val span = SpannableString(unknown).apply { - setSpan(ForegroundColorSpan(colorHighlight), 0, unknown.length, 0) - } - - text.text = span - } - } - - private fun setIsRead(lastMessage: VKMessage, conversation: VKConversation) { - val isRead = - ((lastMessage.isOut && conversation.outReadMessageId == conversation.lastMessageId || - !lastMessage.isOut && conversation.inReadMessageId == conversation.lastMessageId) && conversation.lastMessageId == lastMessage.id) && conversation.unreadCount == 0 - - if (isRead) { - counter.visibility = View.GONE - out.visibility = View.GONE - } else { - if (lastMessage.isOut) { - out.visibility = View.VISIBLE - counter.visibility = View.GONE - counter.text = "" - } else { - out.visibility = View.GONE - counter.visibility = View.VISIBLE - counter.text = conversation.unreadCount.toString() - } - } - } - - private fun setDate(lastMessage: VKMessage) { - val dateText = VKUtils.getTime(context, lastMessage) - date.text = dateText - } - - private fun setCounterBackground(conversation: VKConversation) { - counter.background.setTint(if (conversation.isNotificationsDisabled()) Color.GRAY else colorHighlight) - } - } - - @Deprecated("Message is bad") - private fun addMessage(message: VKMessage) { - val index = searchConversationIndex(message.peerId) - - val oldList = ArrayList(values) - - if (index >= 0) { - val currentConversation = this[index] - - val conversation = prepareConversation(currentConversation, message) - - removeAt(index) - add(0, conversation) - notifyChanges(oldList) - } else { -// TaskManager.loadConversation( -// VKApiKeys.UPDATE_CONVERSATION, -// message.peerId, -// null -// ) - - TaskManager.execute { -// val cachedConversation = MemoryCache.getConversationById(message.peerId) -// if (cachedConversation != null) { -// add(0, prepareConversation(cachedConversation, message)) -// post { notifyChanges(oldList) } -// return@execute -// } - - val tempConversations = VKConversation().apply { - id = message.peerId - - localId = - if (VKUtil.isChatId(id)) id - 2000000000 else id - type = - if (id < 0) VKConversation.Type.GROUP else if (id > 2000000000) VKConversation.Type.CHAT else VKConversation.Type.USER - - lastMessage = message - lastMessageId = message.id - } - - add(0, tempConversations) - - post { notifyChanges(oldList) } - } - } - - val firstVisiblePosition = - (recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() - - if (firstVisiblePosition <= 1) recyclerView.scrollToPosition(0) - } - - private fun editMessage(message: VKMessage) { - val index = searchConversationIndex(message.peerId) - if (index == -1) return - - val conversation = getItem(index) - - if (conversation.lastMessageId != message.id) return - - conversation.lastMessage = message - - notifyItemChanged(index, ConversationsCallbackDeprecated.EDIT_MESSAGE) - } - - private fun readMessage(peerId: Int, messageId: Int) { - val index = searchConversationIndex(peerId) - if (index == -1) return - - val conversation = getItem(index) - val message = conversation.lastMessage - - if (message.isInbox()) { - conversation.inReadMessageId = messageId - } else { - conversation.outReadMessageId = messageId - } - - conversation.unreadCount = if (conversation.lastMessageId == messageId) { - 0 - } else { - conversation.lastMessageId - messageId - } - - notifyItemChanged(index, ConversationsCallbackDeprecated.READ) - } - - @Deprecated("Need to rewrite") - private fun deleteMessage(peerId: Int, messageId: Int) { - return - val index = searchConversationIndex(peerId) - if (index == -1) return - - val oldList = ArrayList(values) - - val oldDialog = values[index] - - val dialog = oldDialog.clone() - -// TaskManager.execute { -// val cachedMessages = MemoryCache.getMessagesByPeerId(dialog.conversationId) -// val messages = VKUtil.sortMessagesByDate(ArrayList(cachedMessages), true) -// -// if (messages.isEmpty()) { -// MemoryCache.deleteConversation(dialog.conversationId) -// -// AppGlobal.post { -// removeAt(index) -// notifyChanges(oldList) -// } -// } else { -// val lastMessage = messages[0] -// -// dialog.lastMessageId = lastMessage.messageId -// dialog.lastMessage = lastMessage -// -// set(index, dialog) -// -// VKUtil.sortConversationsByDate(values, true) -// -// AppGlobal.post { -// notifyChanges(oldList) -// } -// } -// } - } - - @Deprecated("Message is bad") - private fun restoreMessage(message: VKMessage) { - val index = searchConversationIndex(message.peerId) - if (index == -1) return - - val oldList = ArrayList().apply { addAll(values) } - val oldDialog = values[index] - - val dialog = oldDialog.clone() - -// TaskManager.execute { -// val messages = -// MemoryCache.getMessagesByPeerId(dialog.conversationId).apply { addMessage(message) } -// -// VKUtil.sortMessagesByDate(ArrayList(messages), true) -// -// val lastMessage = messages[0] -// -// dialog.lastMessageId = lastMessage.messageId -// dialog.lastMessage = lastMessage -// -// set(index, dialog) -// -// VKUtil.sortConversationsByDate(values, true) -// -// AppGlobal.handler.post { -// notifyChanges(oldList) -// -// fragmentConversations.presenter.checkListIsEmpty(values) -// } -// } - } - - private fun prepareConversation( - conversation: VKConversation, - newMessage: VKMessage - ): VKConversation { - conversation.lastMessage = newMessage - conversation.lastMessageId = newMessage.id - - if (newMessage.isOut) { - conversation.unreadCount = 0 - newMessage.isRead = false - } else { - conversation.unreadCount++ - } - - if (newMessage.peerId == newMessage.fromId && newMessage.fromId == UserConfig.userId) { //для лс - conversation.outReadMessageId = newMessage.id - } - - return conversation - } - - private fun searchConversationIndex(peerId: Int): Int { - for (i in values.indices) { - if (getItem(i).id == peerId) return i - } - return -1 - } - - private fun searchMessageIndex(messageId: Int): Int { - for (i in values.indices) { - if (getItem(i).lastMessageId == messageId) return i - } - return -1 - } - - private fun updateConversation(peerId: Int) { - val index = searchConversationIndex(peerId) - if (index == -1) return - -// TaskManager.execute { -// val conversation = MemoryCache.getConversationById(peerId) ?: return@execute -// -// set(index, conversation) -// -// AppGlobal.post { -// notifyItemChanged( -// index, -// ConversationsCallbackDeprecated.CONVERSATION -// ) -// } -// } - } - - private fun updateGroups(groupIds: ArrayList) { - for (groupId in groupIds) { - val index = searchConversationIndex(groupId) - if (index == -1) return - - notifyItemChanged(index) - } - } - - private fun updateUsers(userIds: ArrayList) { - for (userId in userIds) { - val index = searchConversationIndex(userId) - if (index == -1) return - - notifyItemChanged(index) - } - } - - private fun updateMessage(messageId: Int) { - val index = searchMessageIndex(messageId) - if (index == -1) return - - - TaskManager.execute { - val conversation = getItem(index).clone() - -// conversation.apply { -// lastMessageId = messageId -// lastMessage = MemoryCache.getMessageById(messageId) ?: return@execute -// } - - AppGlobal.handler.post { - notifyItemChanged( - index, - ConversationsCallbackDeprecated.MESSAGE - ) - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/MessagesAdapterDeprecated.kt b/app/src/main/java/com/meloda/fast/adapter/MessagesAdapterDeprecated.kt deleted file mode 100644 index f26d73cc..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/MessagesAdapterDeprecated.kt +++ /dev/null @@ -1,584 +0,0 @@ -package com.meloda.fast.adapter - -import android.content.Context -import android.util.Log -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.core.view.isVisible -import androidx.recyclerview.widget.LinearLayoutManager -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.extensions.FloatExtensions.int -import com.meloda.fast.BuildConfig -import com.meloda.fast.R -import com.meloda.fast.activity.MessagesActivityDeprecated -import com.meloda.fast.base.BaseAdapter -import com.meloda.fast.base.BaseHolder -import com.meloda.fast.util.AndroidUtils -import com.meloda.fast.widget.BoundedLinearLayout -import com.meloda.fast.widget.CircleImageView -import com.meloda.vksdk.VKApiKeys -import com.meloda.vksdk.model.* -import com.meloda.vksdk.util.VKUtil -import java.text.SimpleDateFormat -import java.util.* -import kotlin.math.abs - - -@Suppress("UNCHECKED_CAST") -class MessagesAdapterDeprecated( - context: Context, - values: ArrayList, - var conversation: VKConversation - -) : BaseAdapter(context, values), - TaskManager.OnEventListener { - - companion object { - private const val TYPE_FOOTER = 10101 - - private const val TYPE_NORMAL_IN = 7910 - private const val TYPE_NORMAL_OUT = 7911 - - private const val TYPE_ATTACHMENT_IN = 7920 - private const val TYPE_ATTACHMENT_OUT = 7921 - - private const val TYPE_ACTION = 7930 - - private const val TYPE_NORMAL_CHANNEL = 7940 - - const val TAG = "MessagesAdapter" - } - - private var recyclerView = (context as MessagesActivityDeprecated).recyclerView - private var layoutManager = recyclerView.layoutManager as LinearLayoutManager - - var isNotCachedValues = false - - init { - TaskManager.addOnEventListener(this) - } - - override fun destroy() { - TaskManager.removeOnEventListener(this) - } - - override fun onNewEvent(info: EventInfo<*>) { - when (info.key) { - VKApiKeys.NEW_MESSAGE.name -> addMessage(info.data as VKMessage) - - VKApiKeys.READ_MESSAGE.name -> readMessage( - (info.data as Array)[0], - (info.data as Array)[1] - ) - - VKApiKeys.RESTORE_MESSAGE.name -> restoreMessage(info.data as VKMessage) - VKApiKeys.EDIT_MESSAGE.name -> editMessage(info.data as VKMessage) - VKApiKeys.DELETE_MESSAGE.name -> deleteMessage( - (info.data as Array)[0], - (info.data as Array)[1] - ) - - VKApiKeys.UPDATE_MESSAGE.name -> updateMessage(info.data as Int) - VKApiKeys.UPDATE_USER.name -> updateUser(info.data as ArrayList) - VKApiKeys.UPDATE_GROUP.name -> updateGroup(info.data as ArrayList) - - else -> return - } - } - - override fun getItemCount(): Int { - return values.size + 1 - } - - override fun getItemViewType(position: Int): Int { - if (position == values.size) return TYPE_FOOTER - - val message = getItem(position) - - return when { - message.action != null -> TYPE_ACTION - conversation.isGroupChannel -> TYPE_NORMAL_CHANNEL - message.isOut && message.attachments.isEmpty() && message.fwdMessages.isEmpty() -> TYPE_NORMAL_OUT - !message.isOut && message.attachments.isEmpty() && message.fwdMessages.isEmpty() -> TYPE_NORMAL_IN - message.isOut && (message.attachments.isNotEmpty() || message.fwdMessages.isNotEmpty()) -> TYPE_ATTACHMENT_OUT - !message.isOut && (message.attachments.isNotEmpty() || message.fwdMessages.isNotEmpty()) -> TYPE_ATTACHMENT_IN - else -> 0 - } - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, type: Int): Holder { - return when (type) { - TYPE_FOOTER -> FooterHolder(generateEmptyView()) - - TYPE_NORMAL_IN -> ItemNormalIn(view(R.layout.item_message_normal_in, viewGroup)) - TYPE_NORMAL_OUT -> ItemNormalOut(view(R.layout.item_message_normal_out, viewGroup)) - - TYPE_ATTACHMENT_IN -> ItemAttachmentIn( - view( - R.layout.item_message_attachment_in, - viewGroup - ) - ) - TYPE_ATTACHMENT_OUT -> ItemAttachmentOut( - view( - R.layout.item_message_attachment_out, - viewGroup - ) - ) - - TYPE_ACTION -> ItemAction(view(R.layout.item_message_action, viewGroup)) - - TYPE_NORMAL_CHANNEL -> ItemChannel(view(R.layout.item_message_channel, viewGroup)) - - else -> PlaceHolder(view(R.layout.item_message, viewGroup)) - } - } - - override fun onBindViewHolder(holder: Holder, position: Int) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "bind position: $position") - } - - if (holder is FooterHolder) return - - super.onBindViewHolder(holder, position) - if (!isNotCachedValues) return - - val message = this[position] - - if (message.isRead.not()) { -// TaskManager.readMessage( -// VKApiKeys.READ_MESSAGE, -// conversation.conversationId, -// message.messageId -// ) - } - } - - private fun generateEmptyView(): View { - return View(context).also { - it.isFocusable = false - it.isClickable = false - it.isEnabled = false - it.layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - if (conversation.isGroupChannel) 0 else AndroidUtils.px(74f).int() - ) - } - } - - inner class FooterHolder(v: View) : Holder(v) { - override fun bind(position: Int) {} - } - - inner class ItemChannel(v: View) : ItemNormalIn(v) { - private val title: TextView = v.findViewById(R.id.channelTitle) - - override fun bind(position: Int) { - val message = getItem(position) - - ViewController().prepareDate(message, date) - - val avatarString = conversation.photo100 - -// val placeHolder = VKUtil.getAvatarPlaceholder(context, conversation.title) - -// avatar.setImageDrawable(placeHolder) -// ImageUtils.loadImage(avatarString, avatar, placeHolder) - - title.text = conversation.title - - text.text = message.text - - root.visibility = View.VISIBLE - } - } - - inner class ItemAction(v: View) : Holder(v) { - private val text: TextView = v.findViewById(R.id.messageAction) - - override fun bind(position: Int) { - val message = getItem(position) - - TaskManager.execute { - val user = searchUser(message) - val group = searchGroup(message) - - val name = - (if (group == null && !VKUtil.isGroupId(message.fromId)) user?.firstName else group?.name) - ?: "null" - -// VKUtil.getActionText(context, message, object : OnResponseListener { -// -// override fun onResponse(response: String) { -// val actionText = "$name $response" -// -// val spannable = SpannableString(actionText) -// spannable.setSpan(StyleSpan(Typeface.BOLD), 0, name.length, 0) -// -// text.text = spannable -// } -// -// override fun onError(t: Throwable) { -// } -// }) - - post { text.isVisible = true } - } - } - } - - open inner class ItemNormalIn(v: View) : NormalViewHolder(v) { - - override fun bind(position: Int) { - val message = getItem(position) - - TaskManager.execute { - val user = searchUser(message) - val group = searchGroup(message) - - post { - ViewController().apply { - prepareText(message, bubble, text) - prepareDate(message, date) - prepareAvatar(message, avatar) - loadAvatarImage(message, user, group, avatar) - } - - root.isVisible = true - } - } - } - } - - inner class ItemAttachmentIn(v: View) : ItemNormalIn(v) { - val attachments: LinearLayout = v.findViewById(R.id.messageAttachments) - - override fun bind(position: Int) { - super.bind(position) - - val message = getItem(position) - - AttachmentInflater.showAttachments(message, this) - } - } - - open inner class ItemNormalOut(v: View) : NormalViewHolder(v) { - - override fun bind(position: Int) { - val message = getItem(position) - - TaskManager.execute { - val user = searchUser(message) - val group = searchGroup(message) - - post { - ViewController().apply { - prepareText(message, bubble, text) - prepareDate(message, date) - prepareAvatar(message, avatar) - loadAvatarImage(message, user, group, avatar) - } - - root.isVisible = true - } - } - } - } - - inner class ItemAttachmentOut(v: View) : ItemNormalOut(v) { - - val attachments: LinearLayout = v.findViewById(R.id.messageAttachments) - - override fun bind(position: Int) { - super.bind(position) - - val message = getItem(position) - - AttachmentInflater.showAttachments(message, this) - } - - } - - abstract inner class NormalViewHolder(v: View) : Holder(v) { - protected val date: TextView = v.findViewById(R.id.messageDate) - protected val text: TextView = v.findViewById(R.id.messageText) - protected val root: LinearLayout = v.findViewById(R.id.messageRoot) - protected val bubble: BoundedLinearLayout = v.findViewById(R.id.messageBubble) - protected val avatar: CircleImageView = v.findViewById(R.id.messageAvatar) - } - - object AttachmentInflater { - fun showAttachments(message: VKMessage, holder: NormalViewHolder) { - val attachments = - (if (holder is ItemAttachmentOut) holder.attachments else if (holder is ItemAttachmentIn) holder.attachments else null) - ?: return - - if (message.fwdMessages.isNotEmpty() || message.attachments.isNotEmpty()) { - attachments.visibility = View.VISIBLE - attachments.removeAllViews() - } else { - attachments.visibility = View.GONE - } - - if (message.attachments.isNotEmpty()) { - prepareAttachments(message, attachments) - } - - if (message.fwdMessages.isNotEmpty()) { - prepareForwardedMessages(message, attachments) - } - } - - private fun prepareAttachments(message: VKMessage, attachments: LinearLayout) { - for (attachment in message.attachments) { - when (attachment) { - is VKPhoto -> photo(message, attachments) - is VKVideo -> video(message, attachments) - is VKLink -> link(message, attachments) - is VKAudio -> audio(message, attachments) - is VKDocument -> doc(message, attachments) - } - } - } - - private fun prepareForwardedMessages(message: VKMessage, attachments: LinearLayout) { - - } - - fun link(message: VKMessage, attachments: LinearLayout) { - - } - - fun video(message: VKMessage, attachments: LinearLayout) { - - } - - fun photo(message: VKMessage, attachments: LinearLayout) { - } - - fun audio(message: VKMessage, attachments: LinearLayout) { - - } - - fun doc(message: VKMessage, attachments: LinearLayout) { - - } - } - - inner class ViewController { - - fun prepareText(message: VKMessage, bubble: BoundedLinearLayout, text: TextView) { - val screenWidth = context.resources.displayMetrics.widthPixels - val boundedWidth = screenWidth - screenWidth / 5 - bubble.maxWidth = boundedWidth - - - - text.setTextColor( - AndroidUtils.getThemeAttrColor( - context, - if (message.isOutbox()) R.attr.messageOutTextColor else R.attr.messageInTextColor - ) - ) - text.text = message.text - } - - fun prepareDate(message: VKMessage, date: TextView) { - var dateText = - SimpleDateFormat("HH:mm", Locale.getDefault()).format(message.date * 1000L) - - if (message.editTime > 0) { - dateText += ", ${ - context.getString(R.string.edited) - .toLowerCase(Locale.getDefault()) - }" - } - - date.text = dateText - } - - fun prepareAvatar(message: VKMessage, avatar: ImageView) { - avatar.isVisible = !message.isOut - } - - fun loadAvatarImage(message: VKMessage, user: VKUser?, group: VKGroup?, avatar: ImageView) { -// val dialogTitle = VKUtil.getMessageTitle(message, user, group) -// val avatarPlaceholder = VKUtil.getAvatarPlaceholder(context, dialogTitle) -// -// avatar.setImageDrawable(avatarPlaceholder) -// -// val avatarString = VKUtil.getUserAvatar(message, user, group) -// -// ImageUtils.loadImage(avatarString, avatar, avatarPlaceholder) - } - - } - - open inner class Holder(v: View) : BaseHolder(v) { - override fun bind(position: Int) { - } - } - - inner class PlaceHolder(v: View) : NormalViewHolder(v) - - private fun searchUser(message: VKMessage): VKUser? { - if (!message.isFromUser()) return null - -// return VKUtil.searchUser(message.fromId) - return null - } - - private fun searchGroup(message: VKMessage): VKGroup? { - if (!message.isFromGroup()) return null - -// return VKUtil.searchGroup(message.fromId) - return null - } - - private fun updateGroup(groupIds: ArrayList) { - for (groupId in groupIds) { - var index = -1 - - for (i in values.indices) { - val item = getItem(i) - - if (abs(item.fromId) == groupId) { - index = i - break - } - } - - if (index == -1) return - - notifyItemChanged(index) - } - } - - private fun updateUser(userIds: ArrayList) { - for (userId in userIds) { - var index = -1 - - for (i in values.indices) { - val item = getItem(i) - - if (item.fromId == userId) { - index = i - break - } - } - - if (index == -1) return - notifyItemChanged(index) - } - } - - private fun updateMessage(messageId: Int) { - var index = -1 - - for (i in values.indices) { - val item = getItem(i) - - if (item.id == messageId) { - index = i - break - } - } - - if (index == -1) return - -// TaskManager.execute { -// AppGlobal.database.messages.getById(messageId)?.let { -// values[index] = it -// -// post { notifyItemChanged(index) } -// } -// } - } - - private fun searchMessagePosition(messageId: Int): Int { - for (i in values.indices) { - if (getItem(i).id == messageId) return i - } - - return -1 - } - - private fun containsRandomId(randomId: Int): Boolean { - for (message in values) { - if (message.randomId == randomId) return true - } - - return false - } - - fun addMessage(message: VKMessage, fromApp: Boolean = false, withScroll: Boolean = false) { - val randomId = message.randomId - if (randomId > 0 && containsRandomId(message.randomId) || message.peerId != conversation.id) return - - add(message) - - notifyDataSetChanged() - - val lastVisiblePosition = layoutManager.findLastVisibleItemPosition() - - if ((message.isInbox() && lastVisiblePosition >= itemCount - 2) || !fromApp || withScroll) { - recyclerView.scrollToPosition(itemCount - 1) - } - } - - private fun readMessage(peerId: Int, messageId: Int) { - if (peerId != conversation.id) return - - val index = searchMessagePosition(messageId) - if (index == -1) return - - val message = this[index] - message.isRead = true - - notifyDataSetChanged() - - if (message.isInbox()) { - conversation.inReadMessageId = messageId - } else { - conversation.outReadMessageId = messageId - } - - conversation.unreadCount-- - -// TaskManager.execute { -// MemoryCache.put(message) -// MemoryCache.put(conversation) -// } - } - - fun editMessage(message: VKMessage) { - val index = searchMessagePosition(message.id) - if (index == -1) return - - set(index, message) - notifyDataSetChanged() - } - - fun deleteMessage(messageId: Int, peerId: Int) { - if (peerId != conversation.id) return - - val index = searchMessagePosition(messageId) - if (index == -1) return - - removeAt(index) - notifyDataSetChanged() - } - - //TODO: кривое сообщение - fun restoreMessage(message: VKMessage) { - if (message.peerId != conversation.id) return - - updateValues(VKUtil.sortMessagesByDate(values.apply { add(message) }, false)) - notifyDataSetChanged() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/SimpleItemAdapter.kt b/app/src/main/java/com/meloda/fast/adapter/SimpleItemAdapter.kt deleted file mode 100644 index fabbb434..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/SimpleItemAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.meloda.fast.adapter - -import android.content.Context -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import com.meloda.fast.R -import com.meloda.fast.base.BaseAdapter -import com.meloda.fast.base.BaseHolder -import com.meloda.fast.item.SimpleMenuItem -import java.util.* - -class SimpleItemAdapter(context: Context, values: ArrayList) : - BaseAdapter(context, values) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(view(R.layout.item_simple_menu, parent)) - } - - inner class ViewHolder(v: View) : BaseHolder(v) { - - private val title: TextView = v.findViewById(R.id.profileItemTitle) - private val icon: ImageView = v.findViewById(R.id.profileItemIcon) - - override fun bind(position: Int) { - val item = getItem(position) - - title.text = item.title - - icon.setImageDrawable(item.icon) - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/UsersAdapterDeprecated.kt b/app/src/main/java/com/meloda/fast/adapter/UsersAdapterDeprecated.kt deleted file mode 100644 index 20e3f03a..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/UsersAdapterDeprecated.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.meloda.fast.adapter - -import android.content.Context -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.core.view.isVisible -import androidx.recyclerview.widget.DiffUtil -import com.meloda.fast.R -import com.meloda.fast.adapter.diffutil.UsersCallbackDeprecated -import com.meloda.fast.base.BaseAdapter -import com.meloda.fast.base.BaseHolder -import com.meloda.fast.util.ImageUtils -import com.meloda.fast.widget.CircleImageView -import com.meloda.vksdk.model.VKUser -import com.meloda.vksdk.util.VKUtil - -class UsersAdapterDeprecated(context: Context, values: ArrayList) : - BaseAdapter(context, values) { - - var isLoading: Boolean = false - var currentPosition: Int = 0 - - fun isLastItem() = currentPosition >= itemCount - 1 - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(view(R.layout.item_user, parent)) - } - - open inner class ViewHolder(v: View) : BaseHolder(v) { - private val avatar: CircleImageView = v.findViewById(R.id.userAvatar) - private val name: TextView = v.findViewById(R.id.userName) - private val online: ImageView = v.findViewById(R.id.userOnline) - private val onlineText: TextView = v.findViewById(R.id.userOnlineText) - - override fun bind(position: Int) { - currentPosition = position - - val user = getItem(position) - - name.text = user.toString() - -// val avatarPlaceholder = VKUtil.getAvatarPlaceholder(context, user.toString()) -// avatar.setImageDrawable(avatarPlaceholder) - -// ImageUtils.loadImage(user.photo200, avatar, avatarPlaceholder) - - online.isVisible = false - -// VKUtil.getUserOnlineIcon(context, user)?.let { -// online.setImageDrawable(it) -// online.isVisible = true -// } - -// onlineText.text = VKUtil.getUserOnline(user) - - //TODO: отладить открытие чата - } - } - - override fun notifyChanges(oldList: List, newList: List) { - val callback = UsersCallbackDeprecated(oldList, newList) - val diff = DiffUtil.calculateDiff(callback, false) - - diff.dispatchUpdatesTo(this) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallback.kt b/app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallback.kt deleted file mode 100644 index 6302806b..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallback.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.meloda.fast.adapter.diffutil - -import androidx.recyclerview.widget.DiffUtil -import com.meloda.vksdk.model.VKConversation - -class ConversationsCallback( - private val oldList: List, - private val newList: List -) : DiffUtil.Callback() { - - override fun getOldListSize() = oldList.size - - override fun getNewListSize() = newList.size - - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - //TODO: rewrite - return false - } - - override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - //TODO: rewrite - return false - } - - override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { - //TODO: rewrite - return null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallbackDeprecated.kt b/app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallbackDeprecated.kt deleted file mode 100644 index cb03d6cc..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/diffutil/ConversationsCallbackDeprecated.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.meloda.fast.adapter.diffutil - -import androidx.recyclerview.widget.DiffUtil -import com.meloda.vksdk.model.VKConversation - -class ConversationsCallbackDeprecated( - private val oldList: List, - private val newList: List -) : DiffUtil.Callback() { - - companion object { - const val DATE = "date" - const val ONLINE = "online" - const val AVATAR = "avatar" - const val USER_AVATAR = "user_avatar" - const val ATTACHMENTS = "attachments" - const val READ = "read" - const val NOTIFICATIONS = "notifications" - const val EDIT_MESSAGE = "edit_message" - const val MESSAGE = "message" - const val USER = "user" - const val GROUP = "group" - const val CONVERSATION = "conversation" - } - - override fun getOldListSize() = oldList.size - - override fun getNewListSize() = newList.size - - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val old = oldList[oldItemPosition] - val new = newList[newItemPosition] - - if (true) return false - return old.id == new.id - } - - override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val old = oldList[oldItemPosition] - val new = newList[newItemPosition] - - val oldMessage = old.lastMessage - val newMessage = new.lastMessage - - if (true) return false else - - return old.title == new.title && - old.lastMessageId == new.lastMessageId && - old.photo50 == new.photo50 && - old.unreadCount == new.unreadCount && - - old.isNoSound == new.isNoSound && - old.isDisabledForever == new.isDisabledForever && - old.disabledUntil == new.disabledUntil && - - old.inReadMessageId == new.inReadMessageId && - old.outReadMessageId == new.outReadMessageId && - - old.peerUser == new.peerUser && - old.peerGroup == new.peerGroup && - - oldMessage == newMessage - -// oldMessage.messageId == newMessage.messageId && -// oldMessage.isOut == newMessage.isOut && -// oldMessage.fromId == newMessage.fromId && -// oldMessage.date == newMessage.date && -// oldMessage.action == newMessage.action && -// oldMessage.text == newMessage.text && -// oldMessage.attachments == newMessage.attachments && -// oldMessage.fwdMessages == newMessage.fwdMessages && -// oldMessage.messageId == newMessage.messageId && -// -// oldMessage.fromUser == newMessage.fromUser && -// oldMessage.fromGroup == newMessage.fromGroup - } - - override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { - val oldConversation = oldList[oldItemPosition] - val newConversation = newList[newItemPosition] - - val oldMessage = oldConversation.lastMessage - val newMessage = newConversation.lastMessage - - val oldDate = oldMessage.date - val newDate = newMessage.date - -// if (oldDate != newDate) return DATE - -// if (oldMessage != newMessage) return MESSAGE - - return super.getChangePayload(oldItemPosition, newItemPosition) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/adapter/diffutil/UsersCallbackDeprecated.kt b/app/src/main/java/com/meloda/fast/adapter/diffutil/UsersCallbackDeprecated.kt deleted file mode 100644 index 11878b0b..00000000 --- a/app/src/main/java/com/meloda/fast/adapter/diffutil/UsersCallbackDeprecated.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.meloda.fast.adapter.diffutil - -import androidx.recyclerview.widget.DiffUtil -import com.meloda.vksdk.model.VKUser - -class UsersCallbackDeprecated(private val oldList: List, private val newList: List) : - DiffUtil.Callback() { - - companion object { - const val ONLINE = "online" - const val ONLINE_MOBILE = "online_mobile" - } - - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val old = oldList[oldItemPosition] - val new = newList[newItemPosition] - - return old.userId == new.userId - } - - override fun getOldListSize() = oldList.size - - override fun getNewListSize() = newList.size - - override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val old = oldList[oldItemPosition] - val new = newList[newItemPosition] - - return old.firstName == new.firstName && - old.lastName == new.lastName && - old.isOnline == new.isOnline && - old.isOnlineMobile == new.isOnlineMobile && - old.lastSeen == new.lastSeen && - old.lastSeenPlatform == new.lastSeenPlatform && - old.deactivated == new.deactivated - } - - override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { - val old = oldList[oldItemPosition] - val new = newList[newItemPosition] - - if (old.isOnlineMobile != new.isOnlineMobile) { - if (old.isOnline != new.isOnline) return ONLINE - - return ONLINE_MOBILE - } - - return super.getChangePayload(oldItemPosition, newItemPosition) - } - -} \ No newline at end of file diff --git a/vksdk/src/main/java/com/meloda/vksdk/ErrorCodes.kt b/app/src/main/java/com/meloda/fast/api/ErrorCodes.kt similarity index 98% rename from vksdk/src/main/java/com/meloda/vksdk/ErrorCodes.kt rename to app/src/main/java/com/meloda/fast/api/ErrorCodes.kt index f537f83e..748594f0 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/ErrorCodes.kt +++ b/app/src/main/java/com/meloda/fast/api/ErrorCodes.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk +package com.meloda.fast.api object ErrorCodes { const val UNKNOWN_ERROR = 1 diff --git a/vksdk/src/main/java/com/meloda/vksdk/OnResponseListener.kt b/app/src/main/java/com/meloda/fast/api/OnResponseListener.kt similarity index 78% rename from vksdk/src/main/java/com/meloda/vksdk/OnResponseListener.kt rename to app/src/main/java/com/meloda/fast/api/OnResponseListener.kt index 0ab0ba6e..57e036bb 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/OnResponseListener.kt +++ b/app/src/main/java/com/meloda/fast/api/OnResponseListener.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk +package com.meloda.fast.api interface OnResponseListener { diff --git a/app/src/main/java/com/meloda/fast/api/Resource.kt b/app/src/main/java/com/meloda/fast/api/Resource.kt new file mode 100644 index 00000000..7d00e0e2 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/Resource.kt @@ -0,0 +1,25 @@ +package com.meloda.fast.api + +data class Resource constructor( + val status: Status, + val responseData: T?, + val message: String? +) { + + enum class Status { + SUCCESS, + ERROR, + LOADING + } + + companion object { + fun success(responseData: T?): Resource = + Resource(Status.SUCCESS, responseData, null) + + fun error(message: String?, responseBody: T? = null): Resource = + Resource(Status.ERROR, responseBody, message) + + fun loading(responseData: T? = null): Resource = + Resource(Status.LOADING, responseData, null) + } +} diff --git a/vksdk/src/main/java/com/meloda/vksdk/VKApi.kt b/app/src/main/java/com/meloda/fast/api/VKApi.kt similarity index 74% rename from vksdk/src/main/java/com/meloda/vksdk/VKApi.kt rename to app/src/main/java/com/meloda/fast/api/VKApi.kt index 77cfd7b6..a91b9112 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/VKApi.kt +++ b/app/src/main/java/com/meloda/fast/api/VKApi.kt @@ -1,18 +1,21 @@ -package com.meloda.vksdk +package com.meloda.fast.api import android.os.Handler import android.util.Log import androidx.annotation.WorkerThread -import com.meloda.concurrent.TaskManager -import com.meloda.netservices.HttpRequest -import com.meloda.vksdk.method.MessageMethodSetter -import com.meloda.vksdk.method.MethodSetter -import com.meloda.vksdk.method.UserMethodSetter -import com.meloda.vksdk.model.* +import com.meloda.fast.BuildConfig +import com.meloda.fast.api.method.MessageMethodSetter +import com.meloda.fast.api.method.MethodSetter +import com.meloda.fast.api.method.UserMethodSetter +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.asFlow import org.json.JSONArray import org.json.JSONObject import java.util.* import kotlin.collections.ArrayList +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine @Suppress("UNCHECKED_CAST") object VKApi { @@ -41,7 +44,8 @@ object VKApi { Log.w(TAG, "url: $url") } - val buffer = HttpRequest[url].asString() + val buffer = com.meloda.fast.net.HttpRequest[url].asString() + if (BuildConfig.DEBUG) { Log.i(TAG, "response: $buffer") } @@ -63,9 +67,9 @@ object VKApi { when (cls) { null -> return null - VKLongPollServer::class.java -> { + com.meloda.fast.api.model.VKLongPollServer::class.java -> { json.optJSONObject("response")?.let { - return arrayListOf(VKLongPollServer(it)) as ArrayList? + return arrayListOf(com.meloda.fast.api.model.VKLongPollServer(it)) as ArrayList? } } @@ -91,50 +95,56 @@ object VKApi { val models = ArrayList(array.length()) when (cls) { - VKUser::class.java -> { + com.meloda.fast.api.model.VKUser::class.java -> { json.optJSONObject("response")?.let { r -> - VKUser.friendsCount = r.optInt("count") + com.meloda.fast.api.model.VKUser.friendsCount = r.optInt("count") } for (i in 0 until array.length()) { - models.add(VKUser(array.optJSONObject(i)) as T) + models.add(com.meloda.fast.api.model.VKUser(array.optJSONObject(i)) as T) } } - VKMessage::class.java -> { + com.meloda.fast.api.model.VKMessage::class.java -> { response as JSONObject if (url.contains("messages.getHistory")) { - VKMessage.lastHistoryCount = response.optInt("count") + com.meloda.fast.api.model.VKMessage.lastHistoryCount = response.optInt("count") response.optJSONArray("profiles")?.let { - val profiles = arrayListOf() + val profiles = arrayListOf() for (j in 0 until it.length()) { - profiles.add(VKUser(it.optJSONObject(j))) + profiles.add(com.meloda.fast.api.model.VKUser(it.optJSONObject(j))) } - VKMessage.profiles = profiles + com.meloda.fast.api.model.VKMessage.profiles = profiles } response.optJSONArray("groups")?.let { - val groups = arrayListOf() + val groups = arrayListOf() for (j in 0 until it.length()) { - groups.add(VKGroup(it.optJSONObject(j))) + groups.add(com.meloda.fast.api.model.VKGroup(it.optJSONObject(j))) } - VKMessage.groups = groups + com.meloda.fast.api.model.VKMessage.groups = groups } response.optJSONArray("conversations")?.let { - val conversations = arrayListOf() + val conversations = arrayListOf() for (j in 0 until it.length()) { - conversations.add(VKConversation(it.optJSONObject(j))) + conversations.add( + com.meloda.fast.api.model.VKConversation( + it.optJSONObject( + j + ) + ) + ) } - VKMessage.conversations = conversations + com.meloda.fast.api.model.VKMessage.conversations = conversations } } @@ -144,35 +154,35 @@ object VKApi { source = source.optJSONObject("message") } - val message = VKMessage(source) + val message = com.meloda.fast.api.model.VKMessage(source) models.add(message as T) } } - VKGroup::class.java -> { + com.meloda.fast.api.model.VKGroup::class.java -> { for (i in 0 until array.length()) { - models.add(VKGroup(array.optJSONObject(i)) as T) + models.add(com.meloda.fast.api.model.VKGroup(array.optJSONObject(i)) as T) } } - VKModel::class.java -> { + com.meloda.fast.api.model.VKModel::class.java -> { if (url.contains("messages.getHistoryAttachments")) { - return VKAttachments.parse(array) as ArrayList + return com.meloda.fast.api.model.VKAttachments.parse(array) as ArrayList } } - VKConversation::class.java -> { + com.meloda.fast.api.model.VKConversation::class.java -> { if (url.contains("getConversationsById")) { for (i in 0 until array.length()) { val source = array.optJSONObject(i) - models.add(VKConversation(source) as T) + models.add(com.meloda.fast.api.model.VKConversation(source) as T) } return models } json.optJSONObject("response")?.let { r -> - VKConversation.conversationsCount = r.optInt("count") + com.meloda.fast.api.model.VKConversation.conversationsCount = r.optInt("count") } for (i in 0 until array.length()) { @@ -182,28 +192,28 @@ object VKApi { val oConversation = source.optJSONObject("conversation") ?: return null val oLastMessage = source.optJSONObject("last_message") ?: return null - val conversation = VKConversation(oConversation).also { - it.lastMessage = VKMessage(oLastMessage) + val conversation = com.meloda.fast.api.model.VKConversation(oConversation).also { + it.lastMessage = com.meloda.fast.api.model.VKMessage(oLastMessage) } response.optJSONArray("profiles")?.let { - val profiles = arrayListOf() + val profiles = arrayListOf() for (j in 0 until it.length()) { - profiles.add(VKUser(it.optJSONObject(j))) + profiles.add(com.meloda.fast.api.model.VKUser(it.optJSONObject(j))) } - VKConversation.profiles = profiles + com.meloda.fast.api.model.VKConversation.profiles = profiles } response.optJSONArray("groups")?.let { - val groups = arrayListOf() + val groups = arrayListOf() for (j in 0 until it.length()) { - groups.add(VKGroup(it.optJSONObject(j))) + groups.add(com.meloda.fast.api.model.VKGroup(it.optJSONObject(j))) } - VKConversation.groups = groups + com.meloda.fast.api.model.VKConversation.groups = groups } models.add(conversation as T) @@ -215,21 +225,35 @@ object VKApi { } fun execute(url: String, cls: Class, listener: OnResponseListener?) { - TaskManager.execute { + com.meloda.fast.concurrent.TaskManager.execute { try { - val models = execute(url, cls) + val models = execute(url, cls) ?: return@execute - listener?.let { SuccessCallback(listener, models as E) } +// listener?.onResponse(models) } catch (e: Exception) { e.printStackTrace() + listener?.onError(e) +// it.resumeWithException(e) + } + } - listener?.let { ErrorCallback(listener, e) } + } + + suspend fun suspendExecute(url: String, cls: Class): Flow { + return suspendCoroutine { + try { + val models = execute(url, cls)?.asFlow() ?: return@suspendCoroutine + + it.resume(models) + } catch (e: Exception) { + e.printStackTrace() + it.resumeWithException(e) } } } fun executeArray(url: String, cls: Class, listener: OnResponseListener>) { - TaskManager.execute { + com.meloda.fast.concurrent.TaskManager.execute { try { val models = execute(url, cls) diff --git a/vksdk/src/main/java/com/meloda/vksdk/VKApiKeys.kt b/app/src/main/java/com/meloda/fast/api/VKApiKeys.kt similarity index 93% rename from vksdk/src/main/java/com/meloda/vksdk/VKApiKeys.kt rename to app/src/main/java/com/meloda/fast/api/VKApiKeys.kt index ea4ef817..91ac7211 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/VKApiKeys.kt +++ b/app/src/main/java/com/meloda/fast/api/VKApiKeys.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk +package com.meloda.fast.api enum class VKApiKeys(val value: String) { READ_MESSAGE("_read_message"), diff --git a/vksdk/src/main/java/com/meloda/vksdk/VKAuth.kt b/app/src/main/java/com/meloda/fast/api/VKAuth.kt similarity index 96% rename from vksdk/src/main/java/com/meloda/vksdk/VKAuth.kt rename to app/src/main/java/com/meloda/fast/api/VKAuth.kt index dbdcef4d..1a78c006 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/VKAuth.kt +++ b/app/src/main/java/com/meloda/fast/api/VKAuth.kt @@ -1,7 +1,8 @@ -package com.meloda.vksdk +package com.meloda.fast.api import android.util.Log -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.BuildConfig +import com.meloda.fast.api.util.VKUtil import java.net.URLEncoder object VKAuth { diff --git a/vksdk/src/main/java/com/meloda/vksdk/VKConstants.kt b/app/src/main/java/com/meloda/fast/api/VKConstants.kt similarity index 97% rename from vksdk/src/main/java/com/meloda/vksdk/VKConstants.kt rename to app/src/main/java/com/meloda/fast/api/VKConstants.kt index 841072c2..31a388a2 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/VKConstants.kt +++ b/app/src/main/java/com/meloda/fast/api/VKConstants.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk +package com.meloda.fast.api object VKConstants { diff --git a/vksdk/src/main/java/com/meloda/vksdk/VKException.kt b/app/src/main/java/com/meloda/fast/api/VKException.kt similarity index 68% rename from vksdk/src/main/java/com/meloda/vksdk/VKException.kt rename to app/src/main/java/com/meloda/fast/api/VKException.kt index ed567195..9c2a94a2 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/VKException.kt +++ b/app/src/main/java/com/meloda/fast/api/VKException.kt @@ -1,8 +1,8 @@ -package com.meloda.vksdk +package com.meloda.fast.api import java.io.IOException -class VKException(var url: String, override var message: String, var code: Int) : +class VKException(var url: String = "", override var message: String = "", var code: Int) : IOException(message) { var captchaSid: String? = null var captchaImg: String? = null diff --git a/app/src/main/java/com/meloda/fast/api/datasource/MessagesDataSource.kt b/app/src/main/java/com/meloda/fast/api/datasource/MessagesDataSource.kt new file mode 100644 index 00000000..b67c4553 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/datasource/MessagesDataSource.kt @@ -0,0 +1,4 @@ +package com.meloda.fast.api.datasource + +class MessagesDataSource constructor() { +} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/api/datasource/base/BaseDataSource.kt b/app/src/main/java/com/meloda/fast/api/datasource/base/BaseDataSource.kt new file mode 100644 index 00000000..5147bda6 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/datasource/base/BaseDataSource.kt @@ -0,0 +1,97 @@ +package com.meloda.fast.api.datasource.base + +import android.util.Log +import com.google.gson.JsonObject +import com.google.gson.JsonParser +import com.google.gson.JsonSyntaxException +import com.meloda.fast.api.Resource +import com.meloda.fast.api.model.ApiResponse +import com.meloda.fast.api.ErrorCodes +import com.meloda.fast.api.VKException +import okhttp3.ResponseBody +import retrofit2.HttpException + +class BaseDataSource { + + private val TAG = BaseDataSource::class.simpleName + + //TODO: move to resources + private val DEFAULT_ERROR = "Internal server error" + + protected suspend fun getResult(apiCall: suspend () -> ApiResponse): Resource { + try { + val response = apiCall() + return if (response.isSuccessful) { + Resource.success(response.response) + } else { + Log.d(TAG, "Server response unsuccessful") + if (response.error != null) { + Log.w(TAG, "Unsuccessful response with code 2XX") + Resource.error(response.error.message, response.response) + } else { + Log.e(TAG, "Unsuccessful result without error!") + Resource.error(DEFAULT_ERROR) + } + } + } catch (e: HttpException) { + Log.e(TAG, "Error while executing request ${e.message}") + val errorBody = e.response()?.errorBody() ?: return Resource.error(DEFAULT_ERROR) + val errorResponse = parseErrorBody(errorBody) ?: return Resource.error(DEFAULT_ERROR) + + return Resource.error(errorResponse.message) + } catch (e: Exception) { + Log.e(TAG, "Error while executing request ${e.message}") + + return Resource.error(DEFAULT_ERROR) + } + } + + private fun parseErrorBody(responseBody: ResponseBody?): Exception? { + if (responseBody == null) return null + + val jsonResponse: JsonObject? + try { + jsonResponse = JsonParser.parseString(responseBody.string()) as? JsonObject + if (jsonResponse == null) { + Log.d(TAG, "Response body is empty while parsing error body.") + return null + } + } catch (e: JsonSyntaxException) { + Log.e(TAG, "Error while parsing json ${e.message}") + return null + } catch (e: java.lang.Exception) { + Log.e(TAG, "Unknown error ${e.message}") + return null + } + + if (jsonResponse.has("error")) { + val error = jsonResponse["error"].asJsonObject + + val message = error["error_msg"].asString + val code = error["error_code"].asInt + + val e = VKException("", message, code) + + //TODO: add checking invalid session + if (code == 5 && message.contains("invalid session")) { +// context?.startActivity(Intent(context, DropUserDataActivity::class.java).apply { +// addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) +// }) + } + + if (code == ErrorCodes.CAPTCHA_NEEDED) { + e.captchaImg = error["captcha_img"].asString + e.captchaSid = error["captcha_sid"].asString + } + + if (code == ErrorCodes.VALIDATION_REQUIRED) { + e.redirectUri = error["redirect_uri"].asString + } + + return e + } + + return null + } + +} \ No newline at end of file diff --git a/vksdk/src/main/java/com/meloda/vksdk/method/MessageMethodSetter.kt b/app/src/main/java/com/meloda/fast/api/method/MessageMethodSetter.kt similarity index 88% rename from vksdk/src/main/java/com/meloda/vksdk/method/MessageMethodSetter.kt rename to app/src/main/java/com/meloda/fast/api/method/MessageMethodSetter.kt index 66559b07..d8c5e2d5 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/method/MessageMethodSetter.kt +++ b/app/src/main/java/com/meloda/fast/api/method/MessageMethodSetter.kt @@ -1,6 +1,6 @@ -package com.meloda.vksdk.method +package com.meloda.fast.api.method -import com.meloda.arrayutils.ArrayUtils +import com.meloda.fast.util.ArrayUtils class MessageMethodSetter(name: String) : MethodSetter(name) { @@ -60,7 +60,7 @@ class MessageMethodSetter(name: String) : MethodSetter(name) { } fun peerIds(vararg values: Int): MessageMethodSetter { - put("peer_ids", ArrayUtils.asString(values)) + put("peer_ids", com.meloda.fast.util.ArrayUtils.asString(values)) return this } @@ -100,22 +100,22 @@ class MessageMethodSetter(name: String) : MethodSetter(name) { } fun attachment(attachments: Collection): MessageMethodSetter { - put("attachment", ArrayUtils.asString(attachments)) + put("attachment", com.meloda.fast.util.ArrayUtils.asString(attachments)) return this } fun attachment(vararg attachments: String): MessageMethodSetter { - put("attachment", ArrayUtils.asString(*attachments)) + put("attachment", com.meloda.fast.util.ArrayUtils.asString(*attachments)) return this } fun forwardMessages(ids: Collection): MessageMethodSetter { - put("forward_messages", ArrayUtils.asString(ids)) + put("forward_messages", com.meloda.fast.util.ArrayUtils.asString(ids)) return this } fun forwardMessages(vararg ids: Int): MessageMethodSetter { - put("forward_messages", ArrayUtils.asString(ids)) + put("forward_messages", com.meloda.fast.util.ArrayUtils.asString(ids)) return this } @@ -160,12 +160,12 @@ class MessageMethodSetter(name: String) : MethodSetter(name) { } fun chatIds(vararg ids: Int): MessageMethodSetter { - put("max_msg_id", ArrayUtils.asString(ids)) + put("max_msg_id", com.meloda.fast.util.ArrayUtils.asString(ids)) return this } fun chatIds(ids: Collection): MessageMethodSetter { - put("max_msg_id", ArrayUtils.asString(ids)) + put("max_msg_id", com.meloda.fast.util.ArrayUtils.asString(ids)) return this } diff --git a/vksdk/src/main/java/com/meloda/vksdk/method/MethodSetter.kt b/app/src/main/java/com/meloda/fast/api/method/MethodSetter.kt similarity index 86% rename from vksdk/src/main/java/com/meloda/vksdk/method/MethodSetter.kt rename to app/src/main/java/com/meloda/fast/api/method/MethodSetter.kt index 084885fd..dbebf7eb 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/method/MethodSetter.kt +++ b/app/src/main/java/com/meloda/fast/api/method/MethodSetter.kt @@ -1,11 +1,11 @@ -package com.meloda.vksdk.method +package com.meloda.fast.api.method import android.util.ArrayMap import android.util.Log -import com.meloda.arrayutils.ArrayUtils -import com.meloda.vksdk.BuildConfig -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.VKApi +import com.meloda.fast.BuildConfig +import com.meloda.fast.api.OnResponseListener +import com.meloda.fast.api.VKApi +import kotlinx.coroutines.flow.Flow import java.net.URLEncoder @Suppress("UNCHECKED_CAST") @@ -79,6 +79,10 @@ open class MethodSetter(private val name: String) { return params } + suspend fun executeSuspend(cls: Class): Flow { + return VKApi.suspendExecute(getSignedUrl(), cls) + } + fun execute(cls: Class): ArrayList? { return VKApi.execute(getSignedUrl(), cls) } @@ -96,11 +100,11 @@ open class MethodSetter(private val name: String) { } fun userIds(vararg ids: Int): MethodSetter { - return put("user_ids", ArrayUtils.asString(ids)) + return put("user_ids", com.meloda.fast.util.ArrayUtils.asString(ids)) } fun userIds(ids: ArrayList): MethodSetter { - return put("user_ids", ArrayUtils.asString(ids)) + return put("user_ids", com.meloda.fast.util.ArrayUtils.asString(ids)) } fun ownerId(value: Int): MethodSetter { @@ -112,11 +116,11 @@ open class MethodSetter(private val name: String) { } fun groupIds(vararg ids: Int): MethodSetter { - return put("group_ids", ArrayUtils.asString(ids)) + return put("group_ids", com.meloda.fast.util.ArrayUtils.asString(ids)) } fun groupIds(ids: ArrayList): MethodSetter { - return put("group_ids", ArrayUtils.asString(ids)) + return put("group_ids", com.meloda.fast.util.ArrayUtils.asString(ids)) } fun fields(values: String): MethodSetter { diff --git a/vksdk/src/main/java/com/meloda/vksdk/method/UserMethodSetter.kt b/app/src/main/java/com/meloda/fast/api/method/UserMethodSetter.kt similarity index 96% rename from vksdk/src/main/java/com/meloda/vksdk/method/UserMethodSetter.kt rename to app/src/main/java/com/meloda/fast/api/method/UserMethodSetter.kt index 872be9cc..5a8daa90 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/method/UserMethodSetter.kt +++ b/app/src/main/java/com/meloda/fast/api/method/UserMethodSetter.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.method +package com.meloda.fast.api.method class UserMethodSetter(name: String) : MethodSetter(name) { diff --git a/app/src/main/java/com/meloda/fast/api/model/ApiResponse.kt b/app/src/main/java/com/meloda/fast/api/model/ApiResponse.kt new file mode 100644 index 00000000..43ef6478 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/model/ApiResponse.kt @@ -0,0 +1,12 @@ +package com.meloda.fast.api.model + +data class ApiResponse constructor( + val isSuccessful: Boolean, + val error: Error?, + val response: T? +) + +data class Error constructor( + val code: Long, + val message: String +) \ No newline at end of file diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKAttachments.kt b/app/src/main/java/com/meloda/fast/api/model/VKAttachments.kt similarity index 98% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKAttachments.kt rename to app/src/main/java/com/meloda/fast/api/model/VKAttachments.kt index c08d7177..4926a368 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKAttachments.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKAttachments.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONArray import java.util.* diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKAudio.kt b/app/src/main/java/com/meloda/fast/api/model/VKAudio.kt similarity index 95% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKAudio.kt rename to app/src/main/java/com/meloda/fast/api/model/VKAudio.kt index c2320992..c2627477 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKAudio.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKAudio.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKAudioMessage.kt b/app/src/main/java/com/meloda/fast/api/model/VKAudioMessage.kt similarity index 95% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKAudioMessage.kt rename to app/src/main/java/com/meloda/fast/api/model/VKAudioMessage.kt index f7214e36..8e5321b3 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKAudioMessage.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKAudioMessage.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKCall.kt b/app/src/main/java/com/meloda/fast/api/model/VKCall.kt similarity index 96% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKCall.kt rename to app/src/main/java/com/meloda/fast/api/model/VKCall.kt index cc0ca05d..599e6769 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKCall.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKCall.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKComment.kt b/app/src/main/java/com/meloda/fast/api/model/VKComment.kt similarity index 89% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKComment.kt rename to app/src/main/java/com/meloda/fast/api/model/VKComment.kt index c8e65590..eede04e3 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKComment.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKComment.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKConversation.kt b/app/src/main/java/com/meloda/fast/api/model/VKConversation.kt similarity index 99% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKConversation.kt rename to app/src/main/java/com/meloda/fast/api/model/VKConversation.kt index c97381d2..9f9cb9fb 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKConversation.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKConversation.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKDocument.kt b/app/src/main/java/com/meloda/fast/api/model/VKDocument.kt similarity index 98% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKDocument.kt rename to app/src/main/java/com/meloda/fast/api/model/VKDocument.kt index acd36156..7f059891 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKDocument.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKDocument.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject import java.io.Serializable diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKGeolocation.kt b/app/src/main/java/com/meloda/fast/api/model/VKGeolocation.kt similarity index 88% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKGeolocation.kt rename to app/src/main/java/com/meloda/fast/api/model/VKGeolocation.kt index 288b362c..a4c8070d 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKGeolocation.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKGeolocation.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKGift.kt b/app/src/main/java/com/meloda/fast/api/model/VKGift.kt similarity index 93% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKGift.kt rename to app/src/main/java/com/meloda/fast/api/model/VKGift.kt index 7392ad77..d18bf4d2 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKGift.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKGift.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKGraffiti.kt b/app/src/main/java/com/meloda/fast/api/model/VKGraffiti.kt similarity index 94% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKGraffiti.kt rename to app/src/main/java/com/meloda/fast/api/model/VKGraffiti.kt index 473e5f72..99dfaf69 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKGraffiti.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKGraffiti.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKGroup.kt b/app/src/main/java/com/meloda/fast/api/model/VKGroup.kt similarity index 97% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKGroup.kt rename to app/src/main/java/com/meloda/fast/api/model/VKGroup.kt index d64d9ae1..f35c8bab 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKGroup.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKGroup.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONArray import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKLink.kt b/app/src/main/java/com/meloda/fast/api/model/VKLink.kt similarity index 97% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKLink.kt rename to app/src/main/java/com/meloda/fast/api/model/VKLink.kt index d4a2c62e..e457be49 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKLink.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKLink.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject import java.io.Serializable diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKLongPollHistory.kt b/app/src/main/java/com/meloda/fast/api/model/VKLongPollHistory.kt similarity index 91% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKLongPollHistory.kt rename to app/src/main/java/com/meloda/fast/api/model/VKLongPollHistory.kt index 9bc45a8a..81a5be50 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKLongPollHistory.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKLongPollHistory.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import java.util.* diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKLongPollServer.kt b/app/src/main/java/com/meloda/fast/api/model/VKLongPollServer.kt similarity index 91% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKLongPollServer.kt rename to app/src/main/java/com/meloda/fast/api/model/VKLongPollServer.kt index f55abfb9..64e39695 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKLongPollServer.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKLongPollServer.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKMessage.kt b/app/src/main/java/com/meloda/fast/api/model/VKMessage.kt similarity index 98% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKMessage.kt rename to app/src/main/java/com/meloda/fast/api/model/VKMessage.kt index b3b11d70..e02555d1 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKMessage.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKMessage.kt @@ -1,7 +1,7 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import android.util.ArrayMap -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.api.util.VKUtil import org.json.JSONObject open class VKMessage() : VKModel() { diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKMessageAction.kt b/app/src/main/java/com/meloda/fast/api/model/VKMessageAction.kt similarity index 97% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKMessageAction.kt rename to app/src/main/java/com/meloda/fast/api/model/VKMessageAction.kt index d2e071a0..241f671d 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKMessageAction.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKMessageAction.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKModel.kt b/app/src/main/java/com/meloda/fast/api/model/VKModel.kt similarity index 85% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKModel.kt rename to app/src/main/java/com/meloda/fast/api/model/VKModel.kt index 2483cfef..594cfc2d 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKModel.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKModel.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import java.io.Serializable diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKPhoto.kt b/app/src/main/java/com/meloda/fast/api/model/VKPhoto.kt similarity index 96% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKPhoto.kt rename to app/src/main/java/com/meloda/fast/api/model/VKPhoto.kt index 531c72a1..363ab9be 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKPhoto.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKPhoto.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject import java.util.* diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKPhotoSize.kt b/app/src/main/java/com/meloda/fast/api/model/VKPhotoSize.kt similarity index 91% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKPhotoSize.kt rename to app/src/main/java/com/meloda/fast/api/model/VKPhotoSize.kt index efdc4ae1..f7f1d8d6 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKPhotoSize.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKPhotoSize.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKPoll.kt b/app/src/main/java/com/meloda/fast/api/model/VKPoll.kt similarity index 97% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKPoll.kt rename to app/src/main/java/com/meloda/fast/api/model/VKPoll.kt index a6b1895d..1881e108 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKPoll.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKPoll.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKSticker.kt b/app/src/main/java/com/meloda/fast/api/model/VKSticker.kt similarity index 96% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKSticker.kt rename to app/src/main/java/com/meloda/fast/api/model/VKSticker.kt index 401f2b69..0064f51d 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKSticker.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKSticker.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject import java.util.* diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKUser.kt b/app/src/main/java/com/meloda/fast/api/model/VKUser.kt similarity index 98% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKUser.kt rename to app/src/main/java/com/meloda/fast/api/model/VKUser.kt index 4e8cff17..9500856e 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKUser.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKUser.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONArray import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKVideo.kt b/app/src/main/java/com/meloda/fast/api/model/VKVideo.kt similarity index 97% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKVideo.kt rename to app/src/main/java/com/meloda/fast/api/model/VKVideo.kt index 687aa006..3421bb2f 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKVideo.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKVideo.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/vksdk/src/main/java/com/meloda/vksdk/model/VKWall.kt b/app/src/main/java/com/meloda/fast/api/model/VKWall.kt similarity index 89% rename from vksdk/src/main/java/com/meloda/vksdk/model/VKWall.kt rename to app/src/main/java/com/meloda/fast/api/model/VKWall.kt index 0aa817c1..fc1724f9 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/model/VKWall.kt +++ b/app/src/main/java/com/meloda/fast/api/model/VKWall.kt @@ -1,4 +1,4 @@ -package com.meloda.vksdk.model +package com.meloda.fast.api.model import org.json.JSONObject diff --git a/app/src/main/java/com/meloda/fast/api/model/request/RequestMessagesGetConversations.kt b/app/src/main/java/com/meloda/fast/api/model/request/RequestMessagesGetConversations.kt new file mode 100644 index 00000000..17f4d2ca --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/model/request/RequestMessagesGetConversations.kt @@ -0,0 +1,21 @@ +package com.meloda.fast.api.model.request + +import com.google.gson.annotations.SerializedName + +class RequestMessagesGetConversations( + @SerializedName("offset") + private val offset: Int = 0, + + @SerializedName("count") + private val count: Int = 0, + + //values = all, unread + @SerializedName("filter") + private val filter: String = "", + + @SerializedName("extended") + private val extended: Boolean = false, + + @SerializedName("fields") + private var fields: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/api/model/response/ResponseMessagesGetConversations.kt b/app/src/main/java/com/meloda/fast/api/model/response/ResponseMessagesGetConversations.kt new file mode 100644 index 00000000..f10dc799 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/model/response/ResponseMessagesGetConversations.kt @@ -0,0 +1,6 @@ +package com.meloda.fast.api.model.response + +class ResponseMessagesGetConversations( + val count: Int +) { +} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/api/service/MessagesService.kt b/app/src/main/java/com/meloda/fast/api/service/MessagesService.kt new file mode 100644 index 00000000..28b12721 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/api/service/MessagesService.kt @@ -0,0 +1,13 @@ +package com.meloda.fast.api.service + +import com.meloda.fast.api.model.ApiResponse +import com.meloda.fast.api.model.request.RequestMessagesGetConversations +import retrofit2.http.GET +import retrofit2.http.QueryMap + +interface MessagesService { + + @GET("messages.getConversations") + suspend fun getConversations(@QueryMap params: RequestMessagesGetConversations): ApiResponse> + +} \ No newline at end of file diff --git a/vksdk/src/main/java/com/meloda/vksdk/util/VKUtil.kt b/app/src/main/java/com/meloda/fast/api/util/VKUtil.kt similarity index 75% rename from vksdk/src/main/java/com/meloda/vksdk/util/VKUtil.kt rename to app/src/main/java/com/meloda/fast/api/util/VKUtil.kt index d4a009f1..dcefd1c2 100644 --- a/vksdk/src/main/java/com/meloda/vksdk/util/VKUtil.kt +++ b/app/src/main/java/com/meloda/fast/api/util/VKUtil.kt @@ -1,7 +1,6 @@ -package com.meloda.vksdk.util +package com.meloda.fast.api.util import androidx.annotation.WorkerThread -import com.meloda.vksdk.model.* import org.json.JSONArray import org.json.JSONObject import java.text.SimpleDateFormat @@ -28,9 +27,9 @@ object VKUtil { } fun sortMessagesByDate( - values: ArrayList, + values: ArrayList, firstOnTop: Boolean - ): ArrayList { + ): ArrayList { values.sortWith { m1, m2 -> val d1 = m1.date val d2 = m2.date @@ -46,9 +45,9 @@ object VKUtil { } fun sortConversationsByDate( - values: ArrayList, + values: ArrayList, firstOnTop: Boolean - ): ArrayList { + ): ArrayList { values.sortWith { c1, c2 -> val d1 = c1.lastMessage.date val d2 = c2.lastMessage.date @@ -122,7 +121,7 @@ object VKUtil { } - fun getTitle(conversation: VKConversation, peerUser: VKUser?, peerGroup: VKGroup?): String { + fun getTitle(conversation: com.meloda.fast.api.model.VKConversation, peerUser: com.meloda.fast.api.model.VKUser?, peerGroup: com.meloda.fast.api.model.VKGroup?): String { return when { conversation.isUser() -> { peerUser?.let { return it.toString() } ?: "" @@ -140,7 +139,7 @@ object VKUtil { } } - fun getMessageTitle(message: VKMessage, fromUser: VKUser?, fromGroup: VKGroup?): String { + fun getMessageTitle(message: com.meloda.fast.api.model.VKMessage, fromUser: com.meloda.fast.api.model.VKUser?, fromGroup: com.meloda.fast.api.model.VKGroup?): String { return when { message.isFromUser() -> { fromUser?.let { return it.toString() } ?: "" @@ -154,7 +153,7 @@ object VKUtil { } } - fun getAvatar(conversation: VKConversation, peerUser: VKUser?, peerGroup: VKGroup?): String { + fun getAvatar(conversation: com.meloda.fast.api.model.VKConversation, peerUser: com.meloda.fast.api.model.VKUser?, peerGroup: com.meloda.fast.api.model.VKGroup?): String { return when { conversation.isUser() -> { peerUser?.let { return it.photo200 } ?: "" @@ -172,7 +171,7 @@ object VKUtil { } } - fun getUserAvatar(message: VKMessage, fromUser: VKUser?, fromGroup: VKGroup?): String { + fun getUserAvatar(message: com.meloda.fast.api.model.VKMessage, fromUser: com.meloda.fast.api.model.VKUser?, fromGroup: com.meloda.fast.api.model.VKGroup?): String { return when { message.isFromUser() -> { fromUser?.let { return it.photo100 } ?: "" @@ -186,7 +185,7 @@ object VKUtil { } } - fun getUserPhoto(user: VKUser): String { + fun getUserPhoto(user: com.meloda.fast.api.model.VKUser): String { if (user.photo200.isEmpty()) { if (user.photo100.isEmpty()) { if (user.photo50.isEmpty()) { @@ -202,7 +201,7 @@ object VKUtil { return "" } - fun getGroupPhoto(group: VKGroup): String { + fun getGroupPhoto(group: com.meloda.fast.api.model.VKGroup): String { if (group.photo200.isEmpty()) { if (group.photo100.isEmpty()) { if (group.photo50.isEmpty()) { @@ -219,26 +218,26 @@ object VKUtil { } - fun parseConversations(array: JSONArray): ArrayList { - val conversations = arrayListOf() + fun parseConversations(array: JSONArray): ArrayList { + val conversations = arrayListOf() for (i in 0 until array.length()) { - conversations.add(VKConversation(array.optJSONObject(i))) + conversations.add(com.meloda.fast.api.model.VKConversation(array.optJSONObject(i))) } return conversations } - fun parseMessages(array: JSONArray): ArrayList { - val messages = arrayListOf() + fun parseMessages(array: JSONArray): ArrayList { + val messages = arrayListOf() for (i in 0 until array.length()) { - messages.add(VKMessage(array.optJSONObject(i))) + messages.add(com.meloda.fast.api.model.VKMessage(array.optJSONObject(i))) } return messages } fun isMessageHasFlag(mask: Int, flagName: String): Boolean { - val o: Any? = VKMessage.flags[flagName] + val o: Any? = com.meloda.fast.api.model.VKMessage.flags[flagName] return if (o != null) { //has flag val flag = o as Int flag and mask > 0 @@ -249,8 +248,8 @@ object VKUtil { //fromUser and fromGroup are null @Deprecated("need to rewrite") @WorkerThread - fun parseLongPollMessage(array: JSONArray): VKMessage { - val message = VKMessage() + fun parseLongPollMessage(array: JSONArray): com.meloda.fast.api.model.VKMessage { + val message = com.meloda.fast.api.model.VKMessage() val id = array.optInt(1) val flags = array.optInt(2) @@ -277,33 +276,33 @@ object VKUtil { } if (it.has("source_act")) { - message.action = VKMessageAction().also { action -> - action.type = VKMessageAction.Type.fromString(it.optString("source_act")) + message.action = com.meloda.fast.api.model.VKMessageAction().also { action -> + action.type = com.meloda.fast.api.model.VKMessageAction.Type.fromString(it.optString("source_act")) when (action.type) { - VKMessageAction.Type.CHAT_CREATE -> { + com.meloda.fast.api.model.VKMessageAction.Type.CHAT_CREATE -> { action.text = it.optString("source_text") } - VKMessageAction.Type.TITLE_UPDATE -> { + com.meloda.fast.api.model.VKMessageAction.Type.TITLE_UPDATE -> { action.oldText = it.optString("source_old_text") action.text = it.optString("source_text") } - VKMessageAction.Type.PIN_MESSAGE -> { + com.meloda.fast.api.model.VKMessageAction.Type.PIN_MESSAGE -> { action.memberId = it.optInt("source_mid") action.conversationMessageId = it.optInt("source_chat_local_id") it.optJSONObject("source_message")?.let { message -> - action.message = VKMessage(message) + action.message = com.meloda.fast.api.model.VKMessage(message) } } - VKMessageAction.Type.UNPIN_MESSAGE -> { + com.meloda.fast.api.model.VKMessageAction.Type.UNPIN_MESSAGE -> { action.memberId = it.optInt("source_mid") action.conversationMessageId = it.optInt("source_chat_local_id") } - VKMessageAction.Type.INVITE_USER, - VKMessageAction.Type.KICK_USER, - VKMessageAction.Type.SCREENSHOT, - VKMessageAction.Type.INVITE_USER_BY_CALL -> { + com.meloda.fast.api.model.VKMessageAction.Type.INVITE_USER, + com.meloda.fast.api.model.VKMessageAction.Type.KICK_USER, + com.meloda.fast.api.model.VKMessageAction.Type.SCREENSHOT, + com.meloda.fast.api.model.VKMessageAction.Type.INVITE_USER_BY_CALL -> { action.memberId = it.optInt("source_mid") } } diff --git a/app/src/main/java/com/meloda/fast/base/BaseActivity.kt b/app/src/main/java/com/meloda/fast/base/BaseActivity.kt index 4e800f3d..1c910dad 100644 --- a/app/src/main/java/com/meloda/fast/base/BaseActivity.kt +++ b/app/src/main/java/com/meloda/fast/base/BaseActivity.kt @@ -1,33 +1,48 @@ package com.meloda.fast.base -import android.os.Build import android.os.Bundle import android.view.View +import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity -import com.meloda.extensions.ContextExtensions.color -import com.meloda.fast.R -import com.meloda.fast.util.AndroidUtils -import com.meloda.fast.util.ColorUtils +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry +import com.google.android.material.snackbar.Snackbar -abstract class BaseActivity : AppCompatActivity() { +abstract class BaseActivity : AppCompatActivity, LifecycleOwner { + + constructor() : super() + + constructor(@LayoutRes resId: Int) : super(resId) + + protected lateinit var lifecycleRegistry: LifecycleRegistry override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) { - val navigationBarColor = - if (AndroidUtils.isDarkTheme()) { - color(R.color.dark_primaryDark) - } else { - ColorUtils.darkenColor(color(R.color.primaryDark)) - } - - window.navigationBarColor = navigationBarColor - } + lifecycleRegistry = LifecycleRegistry(this) + lifecycleRegistry.currentState = Lifecycle.State.CREATED } - fun getRootView(): View { - return findViewById(android.R.id.content) + override fun onStart() { + super.onStart() + lifecycleRegistry.currentState = Lifecycle.State.STARTED } + override fun onResume() { + super.onResume() + lifecycleRegistry.currentState = Lifecycle.State.RESUMED + } + + override fun onDestroy() { + super.onDestroy() + lifecycleRegistry.currentState = Lifecycle.State.DESTROYED + } + + val rootView: View? get() = findViewById(android.R.id.content) + + fun requireRootView() = rootView!! + + var errorSnackbar: Snackbar? = null + } \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/base/BaseAdapter.kt b/app/src/main/java/com/meloda/fast/base/BaseAdapter.kt deleted file mode 100644 index e5982b94..00000000 --- a/app/src/main/java/com/meloda/fast/base/BaseAdapter.kt +++ /dev/null @@ -1,177 +0,0 @@ -package com.meloda.fast.base - -import android.content.Context -import android.os.Bundle -import android.os.Parcelable -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.AdapterView -import androidx.recyclerview.widget.RecyclerView -import com.meloda.arrayutils.ArrayUtils.asArrayList -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.listener.ItemClickListener -import com.meloda.fast.listener.ItemLongClickListener -import java.io.Serializable -import java.util.* - - -@Suppress("UNCHECKED_CAST") -abstract class BaseAdapter( - var context: Context, - var values: ArrayList = arrayListOf() -) : RecyclerView.Adapter() { - - companion object { - private const val P_ITEMS = "BaseAdapter.values" - } - - private var cleanValues: ArrayList? = null - - private var inflater: LayoutInflater = LayoutInflater.from(context) - - var itemClickListener: ItemClickListener? = null - var itemLongClickListener: ItemLongClickListener? = null - - open fun destroy() {} - - open fun getItem(position: Int): Item { - return values[position] - } - - fun add(position: Int, item: Item) { - values.add(position, item) - cleanValues?.add(position, item) - } - - fun add(item: Item) { - values.add(item) - cleanValues?.add(item) - } - - fun addAll(items: List) { - values.addAll(items) - cleanValues?.addAll(items) - } - - fun addAll(position: Int, items: List) { - values.addAll(position, items) - cleanValues?.addAll(position, items) - } - - operator fun set(position: Int, item: Item) { - values[position] = item - cleanValues?.set(position, item) - } - - fun indexOf(item: Item): Int { - return values.indexOf(item) - } - - fun removeAt(index: Int) { - values.removeAt(index) - cleanValues?.removeAt(index) - } - - fun remove(item: Item) { - values.remove(item) - cleanValues?.remove(item) - } - - open fun notifyChanges(oldList: List, newList: List = values) {} - - fun isEmpty() = values.isNullOrEmpty() - - fun isNotEmpty() = !isEmpty() - - fun view(resId: Int, viewGroup: ViewGroup): View { - return inflater.inflate(resId, viewGroup, false) - } - - fun updateValues(arrayList: ArrayList) { - values.clear() - values.addAll(arrayList) - } - - fun updateValues(list: List) = updateValues(list.asArrayList()) - - override fun onBindViewHolder(holder: VH, position: Int) { - onBindItemViewHolder(holder, position) - } - - protected fun initListeners(itemView: View, position: Int) { - if (itemView is AdapterView<*>) return - - itemView.setOnClickListener { - if (itemClickListener != null) itemClickListener!!.onItemClick( - position - ) - } - itemView.setOnLongClickListener { - if (itemLongClickListener != null) itemLongClickListener!!.onItemLongClick(position) - itemClickListener == null - } - } - - override fun getItemCount(): Int { - return values.size - } - - private fun onBindItemViewHolder(holder: VH, position: Int) { - initListeners(holder.itemView, position) - holder.bind(position) - } - - fun onSaveInstanceState(): Parcelable { - val bundle = Bundle() - if (values.size > 0 && (values[0] is Parcelable || values[0] is Serializable)) { - bundle.putSerializable(P_ITEMS, values) - } - return bundle - } - - fun post(runnable: Runnable) { - AppGlobal.handler.post(runnable) - } - - fun onRestoreInstanceState(state: Parcelable?) { - if (state is Bundle) { - if (state.containsKey(P_ITEMS)) { - values = state.getSerializable(P_ITEMS) as ArrayList - } - } - } - - fun clear() { - values.clear() - } - - open fun filter(query: String) { - if (cleanValues == null) { - cleanValues = ArrayList(values) - } - - values.clear() - - if (query.isEmpty()) { - values.addAll(cleanValues!!) - } else { - for (item in cleanValues!!) { - if (onQueryItem(item, query)) { - values.add(item) - } - } - } - - notifyDataSetChanged() - } - - open fun onQueryItem(item: Item, query: String): Boolean { - return false - } - - operator fun get(index: Int): Item { - return values[index] - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/base/BaseFragment.kt b/app/src/main/java/com/meloda/fast/base/BaseFragment.kt index dc5159b2..879bbeeb 100644 --- a/app/src/main/java/com/meloda/fast/base/BaseFragment.kt +++ b/app/src/main/java/com/meloda/fast/base/BaseFragment.kt @@ -1,23 +1,12 @@ package com.meloda.fast.base -import androidx.annotation.IdRes -import androidx.appcompat.widget.Toolbar +import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment -import com.meloda.fast.activity.MainActivity -abstract class BaseFragment : Fragment() { +abstract class BaseFragment : Fragment { - protected open fun initToolbar(@IdRes resId: Int) { - val toolbar: Toolbar = requireView().findViewById(resId) + constructor() : super() - activity?.let { - if (it is MainActivity && toolbar is com.meloda.fast.widget.Toolbar) it.initToolbar( - toolbar - ) - } - } + constructor(@LayoutRes resId: Int) : super(resId) - fun runOnUiThread(runnable: Runnable) { - activity?.runOnUiThread(runnable) - } } \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/base/adapter/BaseAdapter.kt b/app/src/main/java/com/meloda/fast/base/adapter/BaseAdapter.kt new file mode 100644 index 00000000..0fe1a806 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/base/adapter/BaseAdapter.kt @@ -0,0 +1,144 @@ +package com.meloda.fast.base.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.lifecycle.MutableLiveData +import androidx.recyclerview.widget.RecyclerView +import com.meloda.fast.base.BaseHolder +import com.meloda.fast.extensions.LiveDataExtensions.add +import com.meloda.fast.extensions.LiveDataExtensions.addAll +import com.meloda.fast.extensions.LiveDataExtensions.clear +import com.meloda.fast.extensions.LiveDataExtensions.get +import com.meloda.fast.extensions.LiveDataExtensions.isEmpty +import com.meloda.fast.extensions.LiveDataExtensions.isNotEmpty +import com.meloda.fast.extensions.LiveDataExtensions.plusAssign +import com.meloda.fast.extensions.LiveDataExtensions.remove +import com.meloda.fast.extensions.LiveDataExtensions.removeAll +import com.meloda.fast.extensions.LiveDataExtensions.removeAt +import com.meloda.fast.extensions.LiveDataExtensions.set +import com.meloda.fast.extensions.LiveDataExtensions.size + +@Suppress("UNCHECKED_CAST", "unused", "MemberVisibilityCanBePrivate", "CanBeParameter") +abstract class BaseAdapter( + var context: Context, + values: ArrayList +) : RecyclerView.Adapter() { + + val cleanValues = MutableLiveData>(arrayListOf()) + val values = MutableLiveData>(arrayListOf()) + + protected var inflater: LayoutInflater = LayoutInflater.from(context) + + init { + this.values.value = values + } + + var itemClickListener: OnItemClickListener? = null + var itemLongClickListener: OnItemLongClickListener? = null + + open fun destroy() { + itemClickListener = null + itemLongClickListener = null + } + + open fun getItem(position: Int): Item { + return values[position] + } + + fun add(position: Int, item: Item) { + values.add(item, position) + cleanValues.add(item, position) + } + + fun add(item: Item) { + values += item + cleanValues.add(item) + } + + fun addAll(items: List) { + values += items + cleanValues.addAll(items) + } + + fun addAll(position: Int, items: List) { + values.addAll(items, position) + cleanValues.addAll(items, position) + } + + fun removeAll(items: List) { + values.removeAll(items) + cleanValues.removeAll(items) + } + + fun removeAt(index: Int) { + values.removeAt(index) + cleanValues.removeAt(index) + } + + fun remove(item: Item) { + values.remove(item) + cleanValues.remove(item) + } + + fun clear() { + values.clear() + cleanValues.clear() + } + + operator fun get(position: Int): Item { + return values[position] + } + + operator fun set(position: Int, item: Item) { + values[position] = item + cleanValues[position] = item + } + + open fun notifyChanges(oldList: List, newList: List) {} + + fun isEmpty() = values.isEmpty() + fun isNotEmpty() = values.isNotEmpty() + + fun view(resId: Int, viewGroup: ViewGroup, attachToRoot: Boolean = false): View { + return inflater.inflate(resId, viewGroup, attachToRoot) + } + + fun updateValues(arrayList: ArrayList) { + values.clear() + values += arrayList + } + + fun updateValues(list: List) = updateValues(ArrayList(list)) + + override fun onBindViewHolder(holder: VH, position: Int) { + onBindItemViewHolder(holder, position) + } + + protected fun initListeners(itemView: View, position: Int) { + if (itemView is AdapterView<*>) return + + itemView.setOnClickListener { + itemClickListener?.onItemClick(position) + } + + itemView.setOnLongClickListener { + itemLongClickListener?.onItemLongClick(position) + return@setOnLongClickListener itemClickListener == null + } + } + + override fun getItemCount(): Int { + return values.size + } + + val size get() = itemCount + + private fun onBindItemViewHolder(holder: VH, position: Int) { + initListeners(holder.itemView, position) + holder.bind(position) + } + +} diff --git a/app/src/main/java/com/meloda/fast/base/BaseHolder.kt b/app/src/main/java/com/meloda/fast/base/adapter/Holders.kt similarity index 100% rename from app/src/main/java/com/meloda/fast/base/BaseHolder.kt rename to app/src/main/java/com/meloda/fast/base/adapter/Holders.kt diff --git a/app/src/main/java/com/meloda/fast/base/adapter/Listeners.kt b/app/src/main/java/com/meloda/fast/base/adapter/Listeners.kt new file mode 100644 index 00000000..5fdbccb7 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/base/adapter/Listeners.kt @@ -0,0 +1,9 @@ +package com.meloda.fast.base.adapter + +interface OnItemClickListener { + fun onItemClick(position: Int) +} + +interface OnItemLongClickListener { + fun onItemLongClick(position: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/common/AppGlobal.kt b/app/src/main/java/com/meloda/fast/common/AppGlobal.kt index 69af67ef..9df02cae 100644 --- a/app/src/main/java/com/meloda/fast/common/AppGlobal.kt +++ b/app/src/main/java/com/meloda/fast/common/AppGlobal.kt @@ -2,32 +2,18 @@ package com.meloda.fast.common import android.annotation.SuppressLint import android.app.Application -import android.app.DownloadManager -import android.content.ClipboardManager -import android.content.Context import android.content.SharedPreferences import android.content.pm.PackageManager import android.content.res.Resources import android.database.sqlite.SQLiteDatabase -import android.net.ConnectivityManager import android.os.Handler -import android.view.WindowManager -import android.view.inputmethod.InputMethodManager -import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.pm.PackageInfoCompat import androidx.preference.PreferenceManager -import com.facebook.drawee.backends.pipeline.Fresco import com.meloda.fast.BuildConfig import com.meloda.fast.R import com.meloda.fast.UserConfig -import com.meloda.fast.database.CacheStorage import com.meloda.fast.database.DatabaseHelper -import com.meloda.fast.fragment.SettingsFragment import com.meloda.fast.util.AndroidUtils -import com.meloda.mvp.MvpBase -import com.microsoft.appcenter.AppCenter -import com.microsoft.appcenter.analytics.Analytics -import com.microsoft.appcenter.crashes.Crashes import org.acra.ACRA import org.acra.ReportingInteractionMode import org.acra.annotation.ReportsCrashes @@ -46,13 +32,6 @@ import java.util.* class AppGlobal : Application() { companion object { - const val APP_CENTER_TOKEN = "c87e410a-d622-4c52-ad7e-7388ab511704" - - lateinit var windowManager: WindowManager - lateinit var connectivityManager: ConnectivityManager - lateinit var inputMethodManager: InputMethodManager - lateinit var clipboardManager: ClipboardManager - lateinit var downloadManager: DownloadManager lateinit var preferences: SharedPreferences lateinit var locale: Locale @@ -82,15 +61,9 @@ class AppGlobal : Application() { instance = this if (!BuildConfig.DEBUG) { - AppCenter.start( - this, APP_CENTER_TOKEN, Analytics::class.java, Crashes::class.java - ) - ACRA.init(this) } - Fresco.initialize(this) - preferences = PreferenceManager.getDefaultSharedPreferences(this) handler = Handler(mainLooper) locale = Locale.getDefault() @@ -106,62 +79,10 @@ class AppGlobal : Application() { Companion.packageName = packageName Companion.packageManager = packageManager - inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager - connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager - screenWidth = AndroidUtils.getDisplayWidth() screenHeight = AndroidUtils.getDisplayHeight() UserConfig.restore() - - MvpBase.init(handler) - - logDatabase() - fillMemoryCache() - - applyNightMode() - } - - private fun logDatabase() { - val users = CacheStorage.usersStorage.getAllValues() - val groups = CacheStorage.groupsStorage.getAllValues() - val chats = CacheStorage.chatsStorage.getAllValues() - val messages = CacheStorage.messagesStorage.getAllValues() - - return - } - - private fun fillMemoryCache() { - - } - - fun applyNightMode(value: String? = null): Int { - val mode = value ?: preferences.getString(SettingsFragment.KEY_THEME, "-1")!! - - val nightMode = getNightMode(mode.toInt()) - - val oldNightMode = AppCompatDelegate.getDefaultNightMode() - - AppCompatDelegate.setDefaultNightMode(nightMode) - - return nightMode - } - - fun getNightMode(nightMode: Int = -1): Int { - val mode = if (nightMode != -1) nightMode else preferences.getString( - SettingsFragment.KEY_THEME, - "-1" - )!!.toInt() - - return when (mode) { - 1 -> AppCompatDelegate.MODE_NIGHT_YES - 2 -> AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY - 3 -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM - else -> AppCompatDelegate.MODE_NIGHT_NO - } } } \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/common/FragmentSwitcher.kt b/app/src/main/java/com/meloda/fast/common/FragmentSwitcher.kt index adfbd0f8..07a63ede 100644 --- a/app/src/main/java/com/meloda/fast/common/FragmentSwitcher.kt +++ b/app/src/main/java/com/meloda/fast/common/FragmentSwitcher.kt @@ -3,8 +3,6 @@ package com.meloda.fast.common import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import com.meloda.fast.R -import com.meloda.fast.fragment.FragmentConversationsDeprecated -import com.meloda.fast.fragment.FragmentFriendsDeprecated object FragmentSwitcher { @@ -62,8 +60,7 @@ object FragmentSwitcher { val transaction = fragmentManager.beginTransaction() if (fragmentToShow == null) { - fragmentToShow = createFragmentByTag(tag) - transaction.add(containerId, fragmentToShow, tag) + throw NullPointerException("Required fragment is null") } else { transaction.show(fragmentToShow) } @@ -105,12 +102,4 @@ object FragmentSwitcher { transaction.commitNow() } - - private fun createFragmentByTag(tag: String): Fragment { - return when (tag) { - "FragmentFriends" -> FragmentFriendsDeprecated() - "FragmentConversations" -> FragmentConversationsDeprecated() - else -> Fragment() - } - } } diff --git a/app/src/main/java/com/meloda/fast/common/UpdateManager.kt b/app/src/main/java/com/meloda/fast/common/UpdateManager.kt index 1d7669bf..759aefc7 100644 --- a/app/src/main/java/com/meloda/fast/common/UpdateManager.kt +++ b/app/src/main/java/com/meloda/fast/common/UpdateManager.kt @@ -2,10 +2,10 @@ package com.meloda.fast.common import android.util.Log import androidx.collection.arrayMapOf -import com.meloda.concurrent.TaskManager +import com.meloda.fast.concurrent.TaskManager import com.meloda.fast.BuildConfig import com.meloda.fast.model.NewUpdateInfo -import com.meloda.netservices.HttpRequest +import com.meloda.fast.net.HttpRequest import org.json.JSONArray import org.json.JSONObject diff --git a/concurrent/src/main/java/com/meloda/concurrent/EventInfo.kt b/app/src/main/java/com/meloda/fast/concurrent/EventInfo.kt similarity index 66% rename from concurrent/src/main/java/com/meloda/concurrent/EventInfo.kt rename to app/src/main/java/com/meloda/fast/concurrent/EventInfo.kt index 2c5416ad..5b975967 100644 --- a/concurrent/src/main/java/com/meloda/concurrent/EventInfo.kt +++ b/app/src/main/java/com/meloda/fast/concurrent/EventInfo.kt @@ -1,3 +1,3 @@ -package com.meloda.concurrent +package com.meloda.fast.concurrent class EventInfo constructor(var key: String, var data: T? = null) \ No newline at end of file diff --git a/concurrent/src/main/java/com/meloda/concurrent/LowThread.kt b/app/src/main/java/com/meloda/fast/concurrent/LowThread.kt similarity index 85% rename from concurrent/src/main/java/com/meloda/concurrent/LowThread.kt rename to app/src/main/java/com/meloda/fast/concurrent/LowThread.kt index be593a2b..13b1c214 100644 --- a/concurrent/src/main/java/com/meloda/concurrent/LowThread.kt +++ b/app/src/main/java/com/meloda/fast/concurrent/LowThread.kt @@ -1,4 +1,4 @@ -package com.meloda.concurrent +package com.meloda.fast.concurrent import android.os.Process diff --git a/concurrent/src/main/java/com/meloda/concurrent/TaskManager.kt b/app/src/main/java/com/meloda/fast/concurrent/TaskManager.kt similarity index 94% rename from concurrent/src/main/java/com/meloda/concurrent/TaskManager.kt rename to app/src/main/java/com/meloda/fast/concurrent/TaskManager.kt index f8a25e6a..6629f087 100644 --- a/concurrent/src/main/java/com/meloda/concurrent/TaskManager.kt +++ b/app/src/main/java/com/meloda/fast/concurrent/TaskManager.kt @@ -1,4 +1,4 @@ -package com.meloda.concurrent +package com.meloda.fast.concurrent object TaskManager { diff --git a/app/src/main/java/com/meloda/fast/database/CacheStorage.kt b/app/src/main/java/com/meloda/fast/database/CacheStorage.kt index 2b1d9afe..3386f697 100644 --- a/app/src/main/java/com/meloda/fast/database/CacheStorage.kt +++ b/app/src/main/java/com/meloda/fast/database/CacheStorage.kt @@ -12,9 +12,9 @@ import com.meloda.fast.database.storage.ChatsStorage import com.meloda.fast.database.storage.GroupsStorage import com.meloda.fast.database.storage.MessagesStorage import com.meloda.fast.database.storage.UsersStorage -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKMessage -import com.meloda.vksdk.model.VKUser +import com.meloda.fast.api.model.VKConversation +import com.meloda.fast.api.model.VKMessage +import com.meloda.fast.api.model.VKUser import java.util.* object CacheStorage { diff --git a/app/src/main/java/com/meloda/fast/database/storage/ChatsStorage.kt b/app/src/main/java/com/meloda/fast/database/storage/ChatsStorage.kt index 4d906eed..3db39d94 100644 --- a/app/src/main/java/com/meloda/fast/database/storage/ChatsStorage.kt +++ b/app/src/main/java/com/meloda/fast/database/storage/ChatsStorage.kt @@ -25,8 +25,8 @@ import com.meloda.fast.database.DatabaseKeys.TYPE import com.meloda.fast.database.DatabaseKeys.UNREAD_COUNT import com.meloda.fast.database.DatabaseUtils.TABLE_CHATS import com.meloda.fast.database.base.Storage -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.api.model.VKConversation +import com.meloda.fast.api.util.VKUtil import org.json.JSONObject @WorkerThread diff --git a/app/src/main/java/com/meloda/fast/database/storage/GroupsStorage.kt b/app/src/main/java/com/meloda/fast/database/storage/GroupsStorage.kt index 93810b28..4ba14d45 100644 --- a/app/src/main/java/com/meloda/fast/database/storage/GroupsStorage.kt +++ b/app/src/main/java/com/meloda/fast/database/storage/GroupsStorage.kt @@ -17,8 +17,8 @@ import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME import com.meloda.fast.database.DatabaseKeys.TYPE import com.meloda.fast.database.DatabaseUtils.TABLE_GROUPS import com.meloda.fast.database.base.Storage -import com.meloda.vksdk.model.VKGroup -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.api.model.VKGroup +import com.meloda.fast.api.util.VKUtil import org.json.JSONObject class GroupsStorage : Storage() { diff --git a/app/src/main/java/com/meloda/fast/database/storage/MessagesStorage.kt b/app/src/main/java/com/meloda/fast/database/storage/MessagesStorage.kt index a9203e61..02f62e36 100644 --- a/app/src/main/java/com/meloda/fast/database/storage/MessagesStorage.kt +++ b/app/src/main/java/com/meloda/fast/database/storage/MessagesStorage.kt @@ -23,9 +23,9 @@ import com.meloda.fast.database.DatabaseKeys.TEXT import com.meloda.fast.database.DatabaseUtils.TABLE_MESSAGES import com.meloda.fast.database.base.Storage import com.meloda.fast.util.Utils -import com.meloda.vksdk.model.VKMessage -import com.meloda.vksdk.model.VKMessageAction -import com.meloda.vksdk.model.VKModel +import com.meloda.fast.api.model.VKMessage +import com.meloda.fast.api.model.VKMessageAction +import com.meloda.fast.api.model.VKModel import java.util.stream.Collectors @WorkerThread diff --git a/app/src/main/java/com/meloda/fast/database/storage/UsersStorage.kt b/app/src/main/java/com/meloda/fast/database/storage/UsersStorage.kt index f2296c7e..280d39f6 100644 --- a/app/src/main/java/com/meloda/fast/database/storage/UsersStorage.kt +++ b/app/src/main/java/com/meloda/fast/database/storage/UsersStorage.kt @@ -25,8 +25,8 @@ import com.meloda.fast.database.DatabaseUtils.TABLE_FRIENDS import com.meloda.fast.database.DatabaseUtils.TABLE_USERS import com.meloda.fast.database.QueryBuilder import com.meloda.fast.database.base.Storage -import com.meloda.vksdk.model.VKUser -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.api.model.VKUser +import com.meloda.fast.api.util.VKUtil import org.json.JSONObject @WorkerThread diff --git a/app/src/main/java/com/meloda/fast/dialog/AccountDialog.kt b/app/src/main/java/com/meloda/fast/dialog/AccountDialog.kt deleted file mode 100644 index 4c299bd6..00000000 --- a/app/src/main/java/com/meloda/fast/dialog/AccountDialog.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.meloda.fast.dialog - -import android.content.Intent -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.RelativeLayout -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.facebook.imagepipeline.cache.MemoryCache -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.extensions.DrawableExtensions.tint -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.activity.SettingsActivityDeprecated -import com.meloda.fast.adapter.SimpleItemAdapter -import com.meloda.fast.base.BaseFullscreenDialog -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.item.SimpleMenuItem -import com.meloda.fast.listener.ItemClickListener -import com.meloda.fast.util.ColorUtils -import com.meloda.fast.util.ViewUtils -import com.meloda.fast.widget.Toolbar - -class AccountDialog : BaseFullscreenDialog(), ItemClickListener { - - companion object { - const val TAG = "account_fullscreen_dialog" - } - - private lateinit var adapter: SimpleItemAdapter - - private lateinit var toolbar: Toolbar - private lateinit var recyclerView: RecyclerView - private lateinit var refreshLayout: SwipeRefreshLayout - private lateinit var headerRoot: RelativeLayout - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.dialog_account, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - initViews() - prepareToolbar() - prepareRecyclerView() - } - - private fun initViews() { - toolbar = requireView().findViewById(R.id.toolbar) - recyclerView = requireView().findViewById(R.id.recyclerView) - refreshLayout = requireView().findViewById(R.id.refreshLayout) - headerRoot = requireView().findViewById(R.id.headerRoot) - } - - private fun prepareToolbar() { - toolbar.navigationIcon = requireContext().drawable(R.drawable.ic_close) - toolbar.tintNavigationIcon(ColorUtils.getColorAccent(requireContext())) - - toolbar.setTitle(R.string.account_dialog_title) - toolbar.setTitleMode(Toolbar.TitleMode.SIMPLE) - toolbar.setNavigationClickListener { dismiss() } - -// MemoryCache.getUserById(UserConfig.userId)?.let { -// AppGlobal.handler.post { ViewUtils.prepareNavigationHeader(headerRoot, it) } -// } - } - - private fun prepareRecyclerView() { - refreshLayout.isEnabled = false - - recyclerView.layoutManager = - LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) - recyclerView.setHasFixedSize(true) - - createItemsAndAdapter() - } - - private fun createItemsAndAdapter() { - val items = arrayListOf() - - SimpleMenuItem( - requireContext().drawable(R.drawable.ic_settings_outline) - .tint(ColorUtils.getColorAccent(requireContext())), - requireContext().getString(R.string.navigation_settings) - ) { openSettingsScreen() }.let { items.add(it) } - - adapter = SimpleItemAdapter(requireContext(), items).also { - it.itemClickListener = this - } - - recyclerView.adapter = adapter - } - - private fun openSettingsScreen() { - startActivity(Intent(requireContext(), SettingsActivityDeprecated::class.java)) - } - - override fun onItemClick(position: Int) { - val item = adapter.getItem(position) - - item.clickListener?.let { - it.onClick(requireView().findViewById(android.R.id.content)) - dismiss() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/dialog/ProfileDialog.kt b/app/src/main/java/com/meloda/fast/dialog/ProfileDialog.kt deleted file mode 100644 index b7c616a9..00000000 --- a/app/src/main/java/com/meloda/fast/dialog/ProfileDialog.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.meloda.fast.dialog - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.TextView -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import com.meloda.fast.R -import com.meloda.fast.adapter.SimpleItemAdapter -import com.meloda.fast.item.SimpleMenuItem -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKUser - -open class ProfileDialog( - private val conversation: VKConversation, - private val chatTitle: String -) : BottomSheetDialogFragment() { - - companion object { - const val TAG = "profile_bottom_sheet_dialog" - } - - private lateinit var title: TextView - private lateinit var subtitle: TextView - private lateinit var recyclerView: RecyclerView - private lateinit var root: LinearLayout - - private var adapter: SimpleItemAdapter? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setStyle(STYLE_NO_TITLE, R.style.AppTheme_ProfileDialog) - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.dialog_profile_bottom, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - title = view.findViewById(R.id.profileTitle) - subtitle = view.findViewById(R.id.profileSubtitle) - recyclerView = view.findViewById(R.id.profileItemMenu) - root = view.findViewById(R.id.profileRoot) - - val layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) - - recyclerView.layoutManager = layoutManager - - title.text = chatTitle - - subtitle.text = getSubtitle() - - val items = ArrayList() - - items.add( - SimpleMenuItem( - ContextCompat.getDrawable( - requireContext(), - R.drawable.ic_search - )!!, "Search" - ) - ) - - createAdapter(items) - } - - private fun createAdapter(items: ArrayList) { - adapter = SimpleItemAdapter(requireContext(), items) - recyclerView.adapter = adapter - } - - private fun getSubtitle(): String { - return when (conversation.type) { - VKConversation.Type.CHAT -> getString( - R.string.chat_members, - conversation.membersCount - ) - VKConversation.Type.GROUP -> { -// val group = MemoryCache.getGroupById(conversation.conversationId) ?: return "" -// -// "@${group.screenName}" - "" - } - VKConversation.Type.USER -> { -// val user = MemoryCache.getUserById(conversation.id) ?: return "" - - //TODO: придумать чо делать - val user: VKUser = null ?: return "" - - var str = - if (user.screenName.contains("id${user.userId}")) "" else "@${user.screenName}" - - val online = - getString(if (user.isOnlineMobile) R.string.user_online_mobile else if (user.isOnline) R.string.user_online else R.string.user_offline) - - str += if (str.isEmpty()) online else " · $online" - - str - } - else -> "" - } - } -} \ No newline at end of file diff --git a/extensions/src/main/java/com/meloda/extensions/ContextExtensions.kt b/app/src/main/java/com/meloda/fast/extensions/ContextExtensions.kt similarity index 96% rename from extensions/src/main/java/com/meloda/extensions/ContextExtensions.kt rename to app/src/main/java/com/meloda/fast/extensions/ContextExtensions.kt index b9062e33..dcce0bf6 100644 --- a/extensions/src/main/java/com/meloda/extensions/ContextExtensions.kt +++ b/app/src/main/java/com/meloda/fast/extensions/ContextExtensions.kt @@ -1,4 +1,4 @@ -package com.meloda.extensions +package com.meloda.fast.extensions import android.content.Context import android.graphics.Typeface diff --git a/extensions/src/main/java/com/meloda/extensions/DrawableExtensions.kt b/app/src/main/java/com/meloda/fast/extensions/DrawableExtensions.kt similarity index 86% rename from extensions/src/main/java/com/meloda/extensions/DrawableExtensions.kt rename to app/src/main/java/com/meloda/fast/extensions/DrawableExtensions.kt index b83b4108..579e0442 100644 --- a/extensions/src/main/java/com/meloda/extensions/DrawableExtensions.kt +++ b/app/src/main/java/com/meloda/fast/extensions/DrawableExtensions.kt @@ -1,4 +1,4 @@ -package com.meloda.extensions +package com.meloda.fast.extensions import android.graphics.drawable.Drawable import androidx.annotation.ColorInt diff --git a/extensions/src/main/java/com/meloda/extensions/FloatExtensions.kt b/app/src/main/java/com/meloda/fast/extensions/FloatExtensions.kt similarity index 77% rename from extensions/src/main/java/com/meloda/extensions/FloatExtensions.kt rename to app/src/main/java/com/meloda/fast/extensions/FloatExtensions.kt index da48f4f2..42fdca5e 100644 --- a/extensions/src/main/java/com/meloda/extensions/FloatExtensions.kt +++ b/app/src/main/java/com/meloda/fast/extensions/FloatExtensions.kt @@ -1,4 +1,4 @@ -package com.meloda.extensions +package com.meloda.fast.extensions import kotlin.math.roundToInt diff --git a/app/src/main/java/com/meloda/fast/extensions/LiveDataExtensions.kt b/app/src/main/java/com/meloda/fast/extensions/LiveDataExtensions.kt new file mode 100644 index 00000000..552855be --- /dev/null +++ b/app/src/main/java/com/meloda/fast/extensions/LiveDataExtensions.kt @@ -0,0 +1,116 @@ +package com.meloda.fast.extensions + +import androidx.annotation.UiThread +import androidx.lifecycle.MutableLiveData + +object LiveDataExtensions { + + operator fun MutableLiveData>.set(position: Int, v: T) { + val value = (this.value ?: arrayListOf()).apply { this[position] = v } + this.value = value + } + + operator fun MutableLiveData>.get(position: Int): T { + return (value as MutableList)[position] + } + + @JvmOverloads + fun MutableLiveData>.add(v: T, position: Int = -1) { + val value = (this.value ?: arrayListOf()).apply { + if (position == -1) this.add(v) else this.add(position, v) + } + + this.value = value + } + + @JvmOverloads + fun MutableLiveData>.addAll(values: List, position: Int = -1) { + val value = (this.value ?: arrayListOf()).apply { + if (position == -1) this.addAll(values) + else this.addAll(position, values) + } + + this.value = value + } + + @Suppress("TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING") + fun MutableLiveData>.removeAll(values: List) { + val value = (this.value ?: arrayListOf()).apply { + this.removeAll(values) + } + + this.value = value + } + + fun MutableLiveData>.removeAt(index: Int) { + val value = (this.value ?: arrayListOf()).apply { + this.removeAt(index) + } + + this.value = value + } + + fun MutableLiveData>.remove(item: T) { + val value = (this.value ?: arrayListOf()).apply { + this.remove(item) + } + + this.value = value + } + + operator fun MutableLiveData>.iterator(): Iterator { + return (value as MutableList).iterator() + } + + fun MutableLiveData>.clear() { + value = arrayListOf() + } + + val MutableLiveData>.indices get() = (value as MutableList).indices + + val MutableLiveData>.size get() = (value as MutableList).size + + fun MutableLiveData>.isEmpty(): Boolean { + return (value as MutableList).isEmpty() + } + + fun MutableLiveData>.isNotEmpty(): Boolean { + return !isEmpty() + } + + fun MutableLiveData>.requireValue() = value!! + + @UiThread + operator fun MutableLiveData>.plusAssign(values: List) { + val value = (this.value ?: arrayListOf()).apply { + this.addAll(values) + } + + this.value = value + } + + operator fun MutableLiveData>.plusAssign(v: T) { + val value = (this.value ?: arrayListOf()).apply { + this.add(v) + } + + this.value = value + } + + operator fun MutableLiveData>.minusAssign(values: List) { + val value = (this.value ?: arrayListOf()).apply { + this.removeAll(values) + } + + this.value = value + } + + operator fun MutableLiveData>.minusAssign(v: T) { + val value = (this.value ?: arrayListOf()).apply { + this.remove(v) + } + + this.value = value + } + +} \ No newline at end of file diff --git a/extensions/src/main/java/com/meloda/extensions/StringExtensions.kt b/app/src/main/java/com/meloda/fast/extensions/StringExtensions.kt similarity index 80% rename from extensions/src/main/java/com/meloda/extensions/StringExtensions.kt rename to app/src/main/java/com/meloda/fast/extensions/StringExtensions.kt index fec51ee3..7d2bde6a 100644 --- a/extensions/src/main/java/com/meloda/extensions/StringExtensions.kt +++ b/app/src/main/java/com/meloda/fast/extensions/StringExtensions.kt @@ -1,4 +1,4 @@ -package com.meloda.extensions +package com.meloda.fast.extensions import java.util.* diff --git a/extensions/src/main/java/com/meloda/extensions/TextViewExtensions.kt b/app/src/main/java/com/meloda/fast/extensions/TextViewExtensions.kt similarity index 87% rename from extensions/src/main/java/com/meloda/extensions/TextViewExtensions.kt rename to app/src/main/java/com/meloda/fast/extensions/TextViewExtensions.kt index 17d50848..9d130722 100644 --- a/extensions/src/main/java/com/meloda/extensions/TextViewExtensions.kt +++ b/app/src/main/java/com/meloda/fast/extensions/TextViewExtensions.kt @@ -1,4 +1,4 @@ -package com.meloda.extensions +package com.meloda.fast.extensions import android.widget.TextView import com.google.android.material.textfield.TextInputLayout diff --git a/app/src/main/java/com/meloda/fast/fragment/ChatsFragment.kt b/app/src/main/java/com/meloda/fast/fragment/ChatsFragment.kt deleted file mode 100644 index d3b0582c..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ChatsFragment.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.meloda.fast.fragment - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.ProgressBar -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.concurrent.TaskManager -import com.meloda.fast.R -import com.meloda.fast.adapter.ConversationsAdapterDeprecated -import com.meloda.fast.base.BaseFragment -import com.meloda.fast.database.CacheStorage -import com.meloda.fast.widget.Toolbar -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.VKApi -import com.meloda.vksdk.VKConstants -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKMessage - -class ChatsFragment : BaseFragment() { - - private lateinit var toolbar: Toolbar - private lateinit var progressBar: ProgressBar - private lateinit var recyclerView: RecyclerView - private lateinit var refreshLayout: SwipeRefreshLayout - - private lateinit var noItemsView: LinearLayout - private lateinit var noInternetView: LinearLayout - private lateinit var errorView: LinearLayout - - private lateinit var adapter: ConversationsAdapterDeprecated - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_conversations, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - initViews() - prepareViews() - - createAdapter() - - loadConversations() - } - - private fun initViews() { - toolbar = requireView().findViewById(R.id.toolbar) - progressBar = requireView().findViewById(R.id.progressBar) - recyclerView = requireView().findViewById(R.id.recyclerView) - refreshLayout = requireView().findViewById(R.id.refreshLayout) - - noItemsView = requireView().findViewById(R.id.noItemsView) - noInternetView = requireView().findViewById(R.id.noInternetView) - errorView = requireView().findViewById(R.id.errorView) - } - - private fun prepareViews() { - prepareRecyclerView() - } - - private fun prepareRecyclerView() { - val manager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) - - recyclerView.layoutManager = manager - } - - private fun createAdapter() { - adapter = ConversationsAdapterDeprecated(recyclerView, arrayListOf()) - recyclerView.adapter = adapter - } - - private fun loadConversations() { - TaskManager.execute { - VKApi.messages() - .getConversations() - .filter("all") - .extended(true) - .fields(VKConstants.USER_FIELDS) - .offset(0) - .count(30) - .executeArray( - VKConversation::class.java, - object : OnResponseListener> { - override fun onResponse(response: ArrayList) { - TaskManager.execute { - CacheStorage.chatsStorage.insertValues(response) - - val lastMessages = arrayListOf() - response.forEach { lastMessages.add(it.lastMessage) } - - CacheStorage.messagesStorage.insertValues(lastMessages) - CacheStorage.usersStorage.insertValues(VKConversation.profiles) - CacheStorage.groupsStorage.insertValues(VKConversation.groups) - } - - adapter.updateValues(response) - adapter.notifyDataSetChanged() - } - - override fun onError(t: Throwable) { - - } - }) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/FragmentConversationsDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/FragmentConversationsDeprecated.kt deleted file mode 100644 index e93d1243..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/FragmentConversationsDeprecated.kt +++ /dev/null @@ -1,186 +0,0 @@ -package com.meloda.fast.fragment - -import android.content.Intent -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.ProgressBar -import androidx.core.view.isVisible -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.activity.MessagesActivityDeprecated -import com.meloda.fast.base.BaseFragment -import com.meloda.fast.fragment.ui.presenter.ConversationsPresenterDeprecated -import com.meloda.fast.fragment.ui.view.ConversationsViewDeprecated -import com.meloda.fast.util.AndroidUtils -import com.meloda.fast.util.ViewUtils -import com.meloda.fast.widget.Toolbar -import com.meloda.vksdk.VKApiKeys - -@Suppress("UNCHECKED_CAST") -class FragmentConversationsDeprecated : BaseFragment(), ConversationsViewDeprecated { - - private lateinit var presenterDeprecated: ConversationsPresenterDeprecated - - private lateinit var toolbar: Toolbar - private lateinit var refreshLayout: SwipeRefreshLayout - private lateinit var recyclerView: RecyclerView - private lateinit var progressBar: ProgressBar - - private lateinit var noItemsView: LinearLayout - private lateinit var noInternetView: LinearLayout - private lateinit var errorView: LinearLayout - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? = inflater.inflate(R.layout.fragment_conversations, container, false) - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - initViews() - - prepareToolbar() - prepareRecyclerView() - prepareRefreshLayout() - - presenterDeprecated = ConversationsPresenterDeprecated(this) - presenterDeprecated.setup(recyclerView, refreshLayout) - } - - private fun initViews() { - toolbar = requireView().findViewById(R.id.toolbar) - recyclerView = requireView().findViewById(R.id.recyclerView) - refreshLayout = requireView().findViewById(R.id.refreshLayout) - progressBar = requireView().findViewById(R.id.progressBar) - - noItemsView = requireView().findViewById(R.id.noItemsView) - noInternetView = requireView().findViewById(R.id.noInternetView) - errorView = requireView().findViewById(R.id.errorView) - } - - private fun prepareToolbar() { - initToolbar(R.id.toolbar) - toolbar.title = getString(R.string.navigation_chats) - setProfileAvatar() - - TaskManager.addOnEventListener(object : TaskManager.OnEventListener { - override fun onNewEvent(info: EventInfo<*>) { - if (info.key == VKApiKeys.UPDATE_USER.name) { - val userIds = info.data as ArrayList - - if (userIds.contains(UserConfig.userId)) { - setProfileAvatar() - } - } - } - }) - } - - private fun prepareRefreshLayout() { - refreshLayout.setColorSchemeResources(R.color.accent) - } - - private fun prepareRecyclerView() { - val manager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) - - val decoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) - - decoration.setDrawable( - ColorDrawable( - AndroidUtils.getThemeAttrColor( - requireContext(), - R.attr.dividerHorizontal - ) - ) - ) - - recyclerView.itemAnimator = null - recyclerView.addItemDecoration(decoration) - - recyclerView.layoutManager = manager - } - - private fun setProfileAvatar() { - TaskManager.execute { -// AppGlobal.database.users.getById(UserConfig.userId)?.let { -// if (it.photo100.isNotEmpty()) { -// runOnUiThread { -// toolbar.getAvatar().setImageURI(it.photo100) -// } -// } -// } - } - } - - override fun openChat(extras: Bundle) { - startActivity( - Intent(requireContext(), MessagesActivityDeprecated::class.java).putExtras( - extras - ) - ) - } - - override fun showErrorSnackbar(t: Throwable) { - ViewUtils.showErrorSnackbar(requireView(), t) - } - - override fun prepareNoItemsView() { - } - - override fun showNoItemsView() { - noItemsView.isVisible = true - } - - override fun hideNoItemsView() { - noItemsView.isVisible = false - } - - override fun prepareNoInternetView() { - } - - override fun showNoInternetView() { - noInternetView.isVisible = true - } - - override fun hideNoInternetView() { - noInternetView.isVisible = false - } - - override fun prepareErrorView() { - - } - - override fun showErrorView() { - errorView.isVisible = true - } - - override fun hideErrorView() { - errorView.isVisible = false - } - - override fun showProgressBar() { - progressBar.isVisible = true - } - - override fun hideProgressBar() { - progressBar.isVisible = false - } - - override fun showRefreshLayout() { - refreshLayout.isRefreshing = true - } - - override fun hideRefreshLayout() { - refreshLayout.isRefreshing = false - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/FragmentFriendsDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/FragmentFriendsDeprecated.kt deleted file mode 100644 index d4960583..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/FragmentFriendsDeprecated.kt +++ /dev/null @@ -1,194 +0,0 @@ -package com.meloda.fast.fragment - -import android.content.Intent -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.ProgressBar -import androidx.core.content.ContextCompat -import androidx.core.view.isVisible -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.concurrent.EventInfo -import com.meloda.concurrent.TaskManager -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.activity.MessagesActivityDeprecated -import com.meloda.fast.base.BaseFragment -import com.meloda.fast.fragment.ui.presenter.FriendsPresenterDeprecated -import com.meloda.fast.fragment.ui.view.FriendsViewDeprecated -import com.meloda.fast.util.ViewUtils -import com.meloda.fast.widget.Toolbar -import com.meloda.vksdk.VKApiKeys - -class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(), - FriendsViewDeprecated { - - private lateinit var presenterDeprecated: FriendsPresenterDeprecated - - private lateinit var toolbar: Toolbar - private lateinit var recyclerView: RecyclerView - private lateinit var refreshLayout: SwipeRefreshLayout - private lateinit var progressBar: ProgressBar - - private lateinit var noItemsView: LinearLayout - private lateinit var noInternetView: LinearLayout - private lateinit var errorView: LinearLayout - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_friends, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - initViews() - - prepareToolbar() - prepareRecyclerView() - prepareRefreshLayout() - - presenterDeprecated = FriendsPresenterDeprecated(this) - presenterDeprecated.setup(userId, recyclerView, refreshLayout) - } - - private fun initViews() { - toolbar = requireView().findViewById(R.id.toolbar) - recyclerView = requireView().findViewById(R.id.recyclerView) - refreshLayout = requireView().findViewById(R.id.refreshLayout) - progressBar = requireView().findViewById(R.id.progressBar) - - noItemsView = requireView().findViewById(R.id.noItemsView) - noInternetView = requireView().findViewById(R.id.noInternetView) - errorView = requireView().findViewById(R.id.errorView) - } - - private fun prepareToolbar() { - initToolbar(R.id.toolbar) - toolbar.title = getString(R.string.navigation_friends) - setProfileAvatar() - - toolbar.inflateMenu(R.menu.fragment_friends) - - TaskManager.addOnEventListener(object : TaskManager.OnEventListener { - override fun onNewEvent(info: EventInfo<*>) { - if (info.key == VKApiKeys.UPDATE_USER.name) { - val userId = info.data as ArrayList - - if (userId[0] == UserConfig.userId) { - setProfileAvatar() - } - } - } - }) - } - - private fun setProfileAvatar() { - TaskManager.execute { -// AppGlobal.database.users.getById(UserConfig.userId)?.let { -// if (it.photo100.isNotEmpty()) { -// runOnUi { -// toolbar.getAvatar().setImageURI(it.photo100) -// } -// } -// } - } - } - - override fun onDetach() { - presenterDeprecated.destroy() - super.onDetach() - } - - private fun prepareRefreshLayout() { - refreshLayout.setColorSchemeResources(R.color.accent) - } - - private fun prepareRecyclerView() { - val manager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) - - val decoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) - - decoration.setDrawable( - ColorDrawable( - ContextCompat.getColor( - requireContext(), - R.color.divider - ) - ) - ) - - recyclerView.addItemDecoration(decoration) - recyclerView.layoutManager = manager - } - - override fun openChat(extras: Bundle) { - startActivity( - Intent(requireContext(), MessagesActivityDeprecated::class.java).putExtras( - extras - ) - ) - } - - override fun showErrorSnackbar(t: Throwable) { - ViewUtils.showErrorSnackbar(requireView(), t) - } - - override fun prepareNoItemsView() { - } - - override fun showNoItemsView() { - noItemsView.isVisible = true - } - - override fun hideNoItemsView() { - noItemsView.isVisible = false - } - - override fun prepareNoInternetView() { - } - - override fun showNoInternetView() { - noInternetView.isVisible = true - } - - override fun hideNoInternetView() { - noInternetView.isVisible = false - } - - override fun prepareErrorView() { - } - - override fun showErrorView() { - errorView.isVisible = true - } - - override fun hideErrorView() { - errorView.isVisible = false - } - - - override fun showProgressBar() { - progressBar.isVisible = true - } - - override fun hideProgressBar() { - progressBar.isVisible = false - } - - override fun showRefreshLayout() { - refreshLayout.isRefreshing = true - } - - override fun hideRefreshLayout() { - refreshLayout.isRefreshing = false - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/LoginFragment.kt b/app/src/main/java/com/meloda/fast/fragment/LoginFragment.kt index 72a6530e..25e5d03f 100644 --- a/app/src/main/java/com/meloda/fast/fragment/LoginFragment.kt +++ b/app/src/main/java/com/meloda/fast/fragment/LoginFragment.kt @@ -1,171 +1,22 @@ package com.meloda.fast.fragment import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher -import android.view.KeyEvent -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup -import android.view.inputmethod.EditorInfo -import android.widget.EditText -import com.google.android.material.button.MaterialButton -import com.google.android.material.card.MaterialCardView +import android.viewbinding.library.fragment.viewBinding import com.meloda.fast.R import com.meloda.fast.base.BaseFragment -import com.meloda.fast.fragment.ui.presenter.LoginPresenter -import com.meloda.fast.fragment.ui.view.LoginView -import com.meloda.fast.util.AndroidUtils -import com.meloda.fast.util.KeyboardUtils -import kotlin.math.roundToInt +import com.meloda.fast.databinding.FragmentLoginBinding -class LoginFragment : BaseFragment(), LoginView { +class LoginFragment : BaseFragment(R.layout.fragment_login) { - private lateinit var presenter: LoginPresenter - - private lateinit var email: EditText - private lateinit var password: EditText - private lateinit var authorize: MaterialButton - private lateinit var card: MaterialCardView - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - presenter = LoginPresenter(this) - presenter.onCreate(requireContext(), this, savedInstanceState) - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - presenter.onCreateView(savedInstanceState) - return inflater.inflate(R.layout.fragment_login, container, false) - } + private val binding: FragmentLoginBinding by viewBinding() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - presenter.onViewCreated(savedInstanceState) + super.onViewCreated(view, savedInstanceState) + + } - override fun initViews() { - email = requireView().findViewById(R.id.loginEmailEditText) - password = requireView().findViewById(R.id.loginPasswordEditText) - authorize = requireView().findViewById(R.id.loginAuthorize) - card = requireView().findViewById(R.id.loginCard) - } - override fun prepareViews() { - prepareEmailEditText() - preparePasswordEditText() - prepareAuthorizeButton() - prepareCardView() - } - private fun prepareEmailEditText() { - email.addTextChangedListener(onTextChangedListener) - } - - private fun preparePasswordEditText() { - password.addTextChangedListener(onTextChangedListener) - - password.setOnEditorActionListener { _, _, event -> - if (event == null) return@setOnEditorActionListener false - return@setOnEditorActionListener if (event.action == EditorInfo.IME_ACTION_GO || - (event.action == KeyEvent.ACTION_DOWN && (event.keyCode == KeyEvent.KEYCODE_ENTER || event.keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER)) - ) { - KeyboardUtils.hideKeyboardFrom(password) - authorize.performClick() - true - } else false - } - } - - private fun prepareAuthorizeButton() { - authorize.isEnabled = false - authorize.setOnClickListener { - val emailString = email.text.toString().trim() - val passwordString = password.text.toString().trim() - - presenter.login(emailString, passwordString) - } - } - - private fun prepareCardView() { - val width = AndroidUtils.dp(resources.displayMetrics.widthPixels).roundToInt() - - if (width < 380) { - card.strokeWidth = 0 - } - } - - override fun showErrorSnackbar(t: Throwable) { - TODO("Not yet implemented") - } - - override fun prepareNoItemsView() { - TODO("Not yet implemented") - } - - override fun showNoItemsView() { - TODO("Not yet implemented") - } - - override fun hideNoItemsView() { - TODO("Not yet implemented") - } - - override fun prepareNoInternetView() { - TODO("Not yet implemented") - } - - override fun showNoInternetView() { - TODO("Not yet implemented") - } - - override fun hideNoInternetView() { - TODO("Not yet implemented") - } - - override fun prepareErrorView() { - TODO("Not yet implemented") - } - - override fun showErrorView() { - TODO("Not yet implemented") - } - - override fun hideErrorView() { - TODO("Not yet implemented") - } - - override fun showProgressBar() { - TODO("Not yet implemented") - } - - override fun hideProgressBar() { - TODO("Not yet implemented") - } - - override fun showRefreshLayout() { - TODO("Not yet implemented") - } - - override fun hideRefreshLayout() { - TODO("Not yet implemented") - } - - private val onTextChangedListener = object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { - } - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - authorize.isEnabled = - email.text.toString().trim().isNotEmpty() && - password.text.toString().trim().isNotEmpty() - } - - override fun afterTextChanged(s: Editable?) { - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/SettingsFragment.kt b/app/src/main/java/com/meloda/fast/fragment/SettingsFragment.kt deleted file mode 100644 index 97220676..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/SettingsFragment.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.meloda.fast.fragment - -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.app.AppCompatActivity -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.PreferenceScreen -import com.meloda.concurrent.TaskManager -import com.meloda.extensions.ContextExtensions.color -import com.meloda.fast.R -import com.meloda.fast.activity.DropUserDataActivity -import com.meloda.fast.activity.UpdateActivityDeprecated -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.util.AndroidUtils - -class SettingsFragment : PreferenceFragmentCompat(), - Preference.OnPreferenceClickListener, - Preference.OnPreferenceChangeListener { - - companion object { - - const val CATEGORY_GENERAL = "general" - const val KEY_HIDE_KEYBOARD_ON_SCROLL_UP = "hide_keyboard_on_scroll_up" - - const val CATEGORY_APPEARANCE = "appearance" - const val KEY_EXTENDED_CONVERSATIONS = "appearance_extended_conversations" - const val KEY_THEME = "appearance_theme" - - const val CATEGORY_ABOUT = "about" - const val KEY_APP_VERSION = "app_version" - - const val CATEGORY_ACCOUNT = "account" - const val KEY_ACCOUNT_LOGOUT = "account_logout" - - const val CATEGORY_DEBUG = "debug" - const val KEY_CLEAR_USERS_GROUPS_CACHE = "clear_users_groups_cache" - } - - private var currentPreferenceLayout = 0 - private var isRestoringState = false - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.fragment_settings, rootKey) - currentPreferenceLayout = R.xml.fragment_settings - init() - } - - private fun init() { - setTitle() - setPreferencesFromResource(currentPreferenceLayout, null) - - val general = findPreference(CATEGORY_GENERAL) - general?.onPreferenceClickListener = rootLayoutClickListener - - val account = findPreference(CATEGORY_ACCOUNT) - account?.onPreferenceClickListener = rootLayoutClickListener - - val logout = findPreference(KEY_ACCOUNT_LOGOUT) - logout?.onPreferenceClickListener = this - - val about = findPreference(CATEGORY_ABOUT) - about?.onPreferenceClickListener = rootLayoutClickListener - - val appVersion = findPreference(KEY_APP_VERSION) - appVersion?.onPreferenceClickListener = this - - val appearance = findPreference(CATEGORY_APPEARANCE) - appearance?.onPreferenceClickListener = rootLayoutClickListener - - val extendedConversations = findPreference(KEY_EXTENDED_CONVERSATIONS) - extendedConversations?.onPreferenceChangeListener = this - - val theme = findPreference(KEY_THEME) - theme?.onPreferenceChangeListener = this - - val debug = findPreference(CATEGORY_DEBUG) - debug?.onPreferenceClickListener = rootLayoutClickListener - updateDebugCategoryVisibility() - - val clearUsersGroupsCache = findPreference(KEY_CLEAR_USERS_GROUPS_CACHE) - clearUsersGroupsCache?.onPreferenceClickListener = this - - applyTintInPreferenceScreen(preferenceScreen) - } - - override fun onResume() { - super.onResume() - - updateDebugCategoryVisibility() - } - - private fun updateDebugCategoryVisibility() { - findPreference(CATEGORY_DEBUG)?.isVisible = - AndroidUtils.isDeveloperSettingsEnabled(requireContext()) - } - - private val rootLayoutClickListener = - Preference.OnPreferenceClickListener { changeRootLayout(it) } - - private fun setTitle() { - var title = R.string.navigation_settings - when (currentPreferenceLayout) { - R.xml.fragment_settings_general -> title = R.string.prefs_general - R.xml.fragment_settings_appearance -> title = R.string.prefs_appearance - R.xml.fragment_settings_about -> title = R.string.prefs_about - R.xml.fragment_settings_account -> title = R.string.prefs_account - } - requireActivity().setTitle(title) - } - - private fun changeRootLayout(preference: Preference): Boolean { - currentPreferenceLayout = when (preference.key) { - CATEGORY_GENERAL -> R.xml.fragment_settings_general - CATEGORY_ABOUT -> R.xml.fragment_settings_about - CATEGORY_ACCOUNT -> R.xml.fragment_settings_account - CATEGORY_APPEARANCE -> R.xml.fragment_settings_appearance - CATEGORY_DEBUG -> R.xml.fragment_settings_debug - else -> R.xml.fragment_settings - } - - init() - return true - } - - private fun applyTintInPreferenceScreen(rootScreen: PreferenceScreen) { - if (rootScreen.preferenceCount > 0) { - for (i in 0 until rootScreen.preferenceCount) { - val preference = rootScreen.getPreference(i) - tintPreference(preference) - } - } - } - - private fun tintPreference(preference: Preference) { - if (preference.icon != null && context != null) { - preference.icon.setTint(requireContext().color(R.color.accent)) - } - } - - override fun onPreferenceClick(preference: Preference): Boolean { - when (preference.key) { - KEY_ACCOUNT_LOGOUT -> { - logout() - return true - } - KEY_APP_VERSION -> { - openUpdateScreen() - return true - } - KEY_CLEAR_USERS_GROUPS_CACHE -> { - showClearCacheConfirmation() - } - } - return false - } - - private fun showClearCacheConfirmation() { - val builder = AlertDialog.Builder(requireContext()) - - builder.setMessage("Clear cache?") - builder.setPositiveButton("Yes") { _, _ -> - TaskManager.execute { -// AppGlobal.database.users.clear() -// AppGlobal.database.groups.clear() - } - } - builder.setNegativeButton("No", null) - builder.show() - } - - private fun openUpdateScreen() { - startActivity(Intent(requireContext(), UpdateActivityDeprecated::class.java)) - } - - override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { - when (preference.key) { - KEY_EXTENDED_CONVERSATIONS -> { - return true - } - KEY_THEME -> { - val nightMode = AppGlobal.instance.applyNightMode(newValue as String) - (requireActivity() as AppCompatActivity).delegate.localNightMode = nightMode - return true - } - } - - return false - } - - fun onBackPressed() = if (currentPreferenceLayout == R.xml.fragment_settings) { - true - } else { - currentPreferenceLayout = R.xml.fragment_settings - init() - false - } - - private fun logout() { - startActivity(Intent(requireContext(), DropUserDataActivity::class.java)) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ValidationFragment.kt b/app/src/main/java/com/meloda/fast/fragment/ValidationFragment.kt deleted file mode 100644 index cb6aa28c..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ValidationFragment.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.meloda.fast.fragment - -import android.graphics.Bitmap -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.webkit.CookieManager -import android.webkit.WebView -import android.webkit.WebViewClient -import androidx.core.os.bundleOf -import com.meloda.fast.base.BaseFragment -import com.meloda.vksdk.VKAuth - - -class ValidationFragment : BaseFragment() { - - private var url: String = "" - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (arguments != null && requireArguments().isEmpty.not()) { - url = requireArguments().getString("url") ?: "" - } - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val webView = WebView(requireContext()) - webView.webViewClient = object : WebViewClient() { - override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { - parseUrl(url ?: "") - } - } - - webView.settings.domStorageEnabled = true - webView.clearCache(true) - webView.layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - ) - - val manager = CookieManager.getInstance() - manager.removeAllCookies(null) - manager.flush() - manager.setAcceptCookie(true) - - return webView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - (requireView() as WebView).loadUrl(url) - } - - private fun parseUrl(url: String) { - Log.d("WebView url", url) - try { - if (url.startsWith("https://oauth.vk.com/blank.html#success=1")) { - Log.d("Success WebView", "") - if (!url.contains("error=")) { - val auth = VKAuth.parseRedirectUrl(url) - - val token = auth[0] - val userId = auth[1].toInt() - - parentFragmentManager.setFragmentResult( - "validation", - bundleOf( - Pair("token", token), - Pair("userId", userId) - ) - ) - - parentFragmentManager.popBackStack() - - } - } - } catch (e: Exception) { - e.printStackTrace() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/ChatsPresenter.kt b/app/src/main/java/com/meloda/fast/fragment/ui/presenter/ChatsPresenter.kt deleted file mode 100644 index 55369a82..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/ChatsPresenter.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.meloda.fast.fragment.ui.presenter - -import android.os.Bundle -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.fast.adapter.ChatsAdapter -import com.meloda.fast.common.TimeManager -import com.meloda.fast.fragment.ui.repository.ChatsRepository -import com.meloda.fast.fragment.ui.view.ChatsView -import com.meloda.fast.listener.ItemClickListener -import com.meloda.fast.listener.ItemLongClickListener -import com.meloda.fast.util.AndroidUtils -import com.meloda.mvp.MvpOnLoadListener -import com.meloda.mvp.MvpPresenter -import com.meloda.vksdk.model.VKConversation - -class ChatsPresenter(viewState: ChatsView) : - MvpPresenter( - viewState, ChatsRepository::class.java.name - ), - ItemClickListener, - ItemLongClickListener, - TimeManager.OnMinuteChangeListener { - - companion object { - const val DEFAULT_CONVERSATIONS_COUNT = 30 - } - - private lateinit var adapter: ChatsAdapter - - override fun onViewCreated(bundle: Bundle?) { - viewState.initViews() - } - - fun setup(recyclerView: RecyclerView, refreshLayout: SwipeRefreshLayout) { - viewState.prepareViews() - - createAdapter() - } - - private fun createAdapter() { - adapter = ChatsAdapter(requireContext(), arrayListOf()).also { - it.itemClickListener = this - it.itemLongClickListener = this - } - - } - - private fun fillAdapter(conversations: ArrayList, offset: Int) { - - } - - private fun getCachedConversations( - offset: Int = 0, - count: Int = DEFAULT_CONVERSATIONS_COUNT, - listener: MvpOnLoadListener? = null - ) { - listener?.onSuccess() - } - - private fun loadConversations( - offset: Int = 0, - count: Int = DEFAULT_CONVERSATIONS_COUNT, - listener: MvpOnLoadListener? = null - ) { - if (AndroidUtils.hasConnection()) { - - } else { - - } - } - - override fun onItemClick(position: Int) { - TODO("Not yet implemented") - } - - override fun onItemLongClick(position: Int) { - TODO("Not yet implemented") - } - - override fun onMinuteChange(currentMinute: Int) { - TODO("Not yet implemented") - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/ConversationsPresenterDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/ui/presenter/ConversationsPresenterDeprecated.kt deleted file mode 100644 index c519fa36..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/ConversationsPresenterDeprecated.kt +++ /dev/null @@ -1,256 +0,0 @@ -package com.meloda.fast.fragment.ui.presenter - -import android.util.Log -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.arrayutils.ArrayUtils -import com.meloda.fast.BuildConfig -import com.meloda.fast.adapter.ConversationsAdapterDeprecated -import com.meloda.fast.adapter.diffutil.ConversationsCallbackDeprecated -import com.meloda.fast.common.TimeManager -import com.meloda.fast.fragment.ui.repository.ConversationsRepositoryDeprecated -import com.meloda.fast.fragment.ui.view.ConversationsViewDeprecated -import com.meloda.fast.listener.ItemClickListener -import com.meloda.fast.listener.ItemLongClickListener -import com.meloda.fast.util.AndroidUtils -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpPresenter -import com.meloda.vksdk.model.VKConversation -import java.util.* - -class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) : - MvpPresenter( - viewState, - ConversationsRepositoryDeprecated::class.java.name - ), - ItemClickListener, - ItemLongClickListener, - TimeManager.OnMinuteChangeListener { - - companion object { - const val DEFAULT_CONVERSATIONS_COUNT = 30 - } - - private var conversationsCount: Int = 0 - - private lateinit var adapter: ConversationsAdapterDeprecated - - private lateinit var recyclerView: RecyclerView - private lateinit var layoutManager: LinearLayoutManager - - fun setup(recyclerView: RecyclerView, refreshLayout: SwipeRefreshLayout) { - this.recyclerView = recyclerView - this.context = recyclerView.context - this.layoutManager = recyclerView.layoutManager as LinearLayoutManager - - prepareViews() - -// setRecyclerViewScrollListener(recyclerView) - setRefreshLayoutListener(refreshLayout) - - createAdapter() - - TimeManager.addOnMinuteChangeListener(this) - - loadConversations(0, DEFAULT_CONVERSATIONS_COUNT) - -// getCachedConversations(0, DEFAULT_CONVERSATIONS_COUNT, object : MvpOnLoadListener { -// override fun onResponse(response: Any?) { -// setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) -// loadConversations(0, DEFAULT_CONVERSATIONS_COUNT) -// } -// -// override fun onError(t: Throwable) { -// setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) -// loadConversations(0, DEFAULT_CONVERSATIONS_COUNT) -// } -// }) - } - - private fun setRecyclerViewScrollListener(recyclerView: RecyclerView) { - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - } - - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - if (dy > 0) { - if (adapter.isLastItem() && !adapter.isLoading && adapter.itemCount < conversationsCount) { - adapter.isLoading = true - - val position = adapter.itemCount - 1 -// adapter.itemCount - 1 - (layoutManager.findLastCompletelyVisibleItemPosition() - layoutManager.findFirstCompletelyVisibleItemPosition()) - - setState(ListState.FILLED_LOADING) - if (AndroidUtils.hasConnection()) { - loadConversations(adapter.itemCount, DEFAULT_CONVERSATIONS_COUNT, - object : MvpOnResponseListener { - override fun onResponse(response: Any?) { - recyclerView.scrollToPosition(position) - - adapter.isLoading = false - } - - override fun onError(t: Throwable) { - viewState.showErrorSnackbar(t) - } - }) - } else { - getCachedConversations(adapter.itemCount, DEFAULT_CONVERSATIONS_COUNT, - object : MvpOnResponseListener { - override fun onResponse(response: Any?) { - recyclerView.scrollToPosition(position) - - adapter.isLoading = false - } - - override fun onError(t: Throwable) { - viewState.showErrorSnackbar(t) - } - }) - } - - if (BuildConfig.DEBUG) - Log.d("RecyclerView", "Bottom reached") - } - } - } - }) - } - - private fun setRefreshLayoutListener(refreshLayout: SwipeRefreshLayout) { - refreshLayout.setOnRefreshListener { loadConversations() } - } - - private fun getCachedConversations( - offset: Int = 0, - count: Int = DEFAULT_CONVERSATIONS_COUNT, - listener: MvpOnResponseListener? = null - ) { - setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) - - repository.getCachedConversations(offset, count, - object : MvpOnResponseListener> { - override fun onResponse(response: ArrayList) { - conversationsCount = response.size - - val conversations = ArrayUtils.cut(response, offset, count) - - fillAdapter(conversations, offset) - - setState(if (adapter.isEmpty()) ListState.EMPTY else ListState.FILLED) - - listener?.onResponse(null) - } - - override fun onError(t: Throwable) { - setState(if (adapter.isEmpty()) ListState.EMPTY_ERROR else ListState.FILLED) - - listener?.onError(t) - } - }) - } - - private fun loadConversations( - offset: Int = 0, - count: Int = DEFAULT_CONVERSATIONS_COUNT, - listener: MvpOnResponseListener? = null - ) { - if (!AndroidUtils.hasConnection()) { - setState(if (adapter.isEmpty()) ListState.EMPTY_NO_INTERNET else ListState.FILLED) - return - } else { - setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) - } - - repository.loadConversations(offset, count, - object : MvpOnResponseListener> { - override fun onResponse(response: ArrayList) { - conversationsCount = VKConversation.conversationsCount - - fillAdapter(response, offset) - - setState(if (adapter.isEmpty()) ListState.EMPTY else ListState.FILLED) - - listener?.onResponse(null) - } - - override fun onError(t: Throwable) { - setState(if (adapter.isEmpty()) ListState.EMPTY_ERROR else ListState.FILLED) - - listener?.onError(t) - } - }) - } - - override fun destroy() { - adapter.destroy() - TimeManager.removeOnMinuteChangeListener(this) - } - - private fun createAdapter() { - adapter = ConversationsAdapterDeprecated(recyclerView, arrayListOf()).also { - it.itemClickListener = this - it.itemLongClickListener = this - } - - recyclerView.adapter = adapter - } - - private fun fillAdapter(conversations: ArrayList, offset: Int) { - val oldItems = ArrayList(adapter.values) - - if (offset > 0) { - adapter.addAll(conversations) - } else { - adapter.updateValues(conversations) - } - - adapter.notifyChanges(oldItems) - - if (offset == 0) recyclerView.scrollToPosition(0) - } - - override fun onItemClick(position: Int) { - openChat(adapter[position]) - } - - override fun onItemLongClick(position: Int) { - - } - - override fun onMinuteChange(currentMinute: Int) { - post { - adapter.notifyItemRangeChanged( - 0, - adapter.itemCount, - ConversationsCallbackDeprecated.DATE - ) - } - } - - private fun openChat(conversation: VKConversation) { -// TaskManager.execute { -// val peerUser = MemoryCache.getUserById(conversation.conversationId) -// val peerGroup = MemoryCache.getGroupById(conversation.conversationId) -// -// val extras = Bundle().also { -// it.putInt(MessagesActivityDeprecated.TAG_EXTRA_ID, conversation.conversationId) -// it.putString( -// MessagesActivityDeprecated.TAG_EXTRA_TITLE, -// VKUtil.getTitle(conversation, peerUser, peerGroup) -// ) -// it.putString( -// MessagesActivityDeprecated.TAG_EXTRA_AVATAR, -// VKUtil.getAvatar(conversation, peerUser, peerGroup) -// ) -// it.putSerializable(MessagesActivityDeprecated.TAG_EXTRA_USER, peerUser) -// it.putSerializable(MessagesActivityDeprecated.TAG_EXTRA_GROUP, peerGroup) -// } -// -// post { viewState.openChat(extras) } -// } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/FriendsPresenterDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/ui/presenter/FriendsPresenterDeprecated.kt deleted file mode 100644 index c3e289d1..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/FriendsPresenterDeprecated.kt +++ /dev/null @@ -1,232 +0,0 @@ -package com.meloda.fast.fragment.ui.presenter - -import android.os.Bundle -import android.util.Log -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.meloda.arrayutils.ArrayUtils -import com.meloda.fast.activity.MessagesActivityDeprecated -import com.meloda.fast.adapter.UsersAdapterDeprecated -import com.meloda.fast.fragment.ui.repository.FriendsRepositoryDeprecated -import com.meloda.fast.fragment.ui.view.FriendsViewDeprecated -import com.meloda.fast.listener.ItemClickListener -import com.meloda.fast.util.AndroidUtils -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpPresenter -import com.meloda.vksdk.model.VKUser - -class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) : - MvpPresenter( - viewState, - FriendsRepositoryDeprecated::class.java.name - ), - ItemClickListener { - - companion object { - const val ONLY_ONLINE = "_only_online" - - const val DEFAULT_FRIENDS_COUNT = 30 - } - - private var userId: Int = 0 - private var friendsCount: Int = 0 - - private lateinit var adapter: UsersAdapterDeprecated - - private lateinit var recyclerView: RecyclerView - private lateinit var layoutManager: LinearLayoutManager - - fun setup(userId: Int, recyclerView: RecyclerView, refreshLayout: SwipeRefreshLayout) { - this.userId = userId - this.recyclerView = recyclerView - this.context = recyclerView.context - this.layoutManager = recyclerView.layoutManager as LinearLayoutManager - - setRecyclerViewScrollListener(recyclerView) - setRefreshListener(refreshLayout) - - createAdapter() - - getCachedFriends(userId, 0, DEFAULT_FRIENDS_COUNT, false, object : MvpOnResponseListener { - override fun onResponse(response: Any?) { - setState(if (adapter.isEmpty()) MvpPresenter.ListState.EMPTY_LOADING else ListState.FILLED_LOADING) - loadFriends(userId, 0, DEFAULT_FRIENDS_COUNT) - } - - override fun onError(t: Throwable) { - setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) - loadFriends(userId, 0, DEFAULT_FRIENDS_COUNT) - } - }) - } - - private fun getCachedFriends( - userId: Int, - offset: Int = 0, - count: Int = DEFAULT_FRIENDS_COUNT, - onlyOnline: Boolean = false, - listener: MvpOnResponseListener? = null - ) { - setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) - - repository.getCachedFriends( - userId, - offset, - count, - onlyOnline, - object : MvpOnResponseListener> { - override fun onResponse(response: ArrayList) { - val friends = ArrayUtils.cut(response, offset, count) - - fillAdapter(friends, offset) - - setState(if (adapter.isEmpty()) ListState.EMPTY else ListState.FILLED) - - listener?.onResponse(null) - } - - override fun onError(t: Throwable) { - setState(if (adapter.isEmpty()) ListState.EMPTY_ERROR else ListState.FILLED) - - listener?.onError(t) - } - }) - } - - private fun loadFriends( - userId: Int, - offset: Int = 0, - count: Int = DEFAULT_FRIENDS_COUNT, - onlyOnline: Boolean = false, - listener: MvpOnResponseListener? = null - ) { - if (!AndroidUtils.hasConnection()) { - setState(if (adapter.isEmpty()) ListState.EMPTY_NO_INTERNET else ListState.FILLED) - return - } else { - setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING) - } - - repository.loadFriends( - userId, - offset, - count, - object : MvpOnResponseListener> { - override fun onResponse(response: ArrayList) { - friendsCount = VKUser.friendsCount - - fillAdapter(response, offset) - - setState(if (adapter.isEmpty()) ListState.EMPTY else ListState.FILLED) - - listener?.onResponse(null) - } - - override fun onError(t: Throwable) { - setState(if (adapter.isEmpty()) ListState.EMPTY_ERROR else ListState.FILLED) - - listener?.onError(t) - } - }) - } - - private fun setRecyclerViewScrollListener(recyclerView: RecyclerView) { - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - } - - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - if (dy > 0) { - if (adapter.isLastItem() && !adapter.isLoading && adapter.itemCount < friendsCount) { - adapter.isLoading = true - - val position = adapter.itemCount - 1 -// adapter.itemCount - 1 - (layoutManager.findLastCompletelyVisibleItemPosition() - layoutManager.findFirstCompletelyVisibleItemPosition()) - - setState(ListState.FILLED_LOADING) - if (AndroidUtils.hasConnection()) { - loadFriends( - userId, - adapter.itemCount, - DEFAULT_FRIENDS_COUNT, - false, - object : MvpOnResponseListener { - override fun onResponse(response: Any?) { - recyclerView.scrollToPosition(position) - - adapter.isLoading = false - } - - override fun onError(t: Throwable) { - viewState.showErrorSnackbar(t) - } - }) - } else { - getCachedFriends( - userId, - adapter.itemCount, - DEFAULT_FRIENDS_COUNT, - false, - object : MvpOnResponseListener { - override fun onResponse(response: Any?) { - recyclerView.scrollToPosition(position) - - adapter.isLoading = false - } - - override fun onError(t: Throwable) { - viewState.showErrorSnackbar(t) - } - }) - } - - Log.d("RecyclerView", "Bottom reached") - } - } - } - }) - } - - private fun setRefreshListener(refreshLayout: SwipeRefreshLayout) { - refreshLayout.setOnRefreshListener { loadFriends(userId) } - } - - private fun createAdapter() { - adapter = UsersAdapterDeprecated(context!!, arrayListOf()).also { - it.itemClickListener = this - } - - recyclerView.adapter = adapter - } - - private fun fillAdapter(values: ArrayList, offset: Int) { - val oldItems = ArrayList(adapter.values) - - if (offset > 0) { - adapter.addAll(values) - } else { - adapter.updateValues(values) - } - -// adapter.notifyDataSetChanged() - adapter.notifyChanges(oldItems) - - if (offset == 0) recyclerView.scrollToPosition(0) - } - - private fun openChat(position: Int) { - val user = adapter[position] - - val data = Bundle().apply { - putInt(MessagesActivityDeprecated.TAG_EXTRA_ID, user.userId) - putString(MessagesActivityDeprecated.TAG_EXTRA_TITLE, user.toString()) - putString(MessagesActivityDeprecated.TAG_EXTRA_AVATAR, user.photo200) - } - } - - override fun onItemClick(position: Int) { - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/LoginPresenter.kt b/app/src/main/java/com/meloda/fast/fragment/ui/presenter/LoginPresenter.kt deleted file mode 100644 index ec50e250..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/presenter/LoginPresenter.kt +++ /dev/null @@ -1,190 +0,0 @@ -package com.meloda.fast.fragment.ui.presenter - -import android.content.Context -import android.os.Bundle -import android.view.Gravity -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.LinearLayout -import androidx.appcompat.app.AlertDialog -import androidx.core.view.isVisible -import androidx.fragment.app.setFragmentResultListener -import com.google.android.material.textfield.TextInputEditText -import com.meloda.fast.R -import com.meloda.fast.UserConfig -import com.meloda.fast.activity.MainActivity -import com.meloda.fast.common.AppGlobal -import com.meloda.fast.fragment.ChatsFragment -import com.meloda.fast.fragment.LoginFragment -import com.meloda.fast.fragment.ValidationFragment -import com.meloda.fast.fragment.ui.repository.LoginRepository -import com.meloda.fast.fragment.ui.view.LoginView -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpPresenter -import com.meloda.vksdk.VKApi -import com.squareup.picasso.Picasso -import org.json.JSONObject -import java.util.* - - -class LoginPresenter( - viewState: LoginView -) : MvpPresenter( - viewState, - LoginRepository::class.java.name -) { - - private var lastEmail: String = "" - private var lastPassword: String = "" - - private lateinit var fragment: LoginFragment - - fun onCreate(context: Context, fragment: LoginFragment, bundle: Bundle?) { - super.onCreate(context, bundle) - this.fragment = fragment - } - - override fun onViewCreated(bundle: Bundle?) { - viewState.initViews() - viewState.prepareViews() - } - - fun login( - email: String, - password: String, - captcha: String = "", - onResponseListener: MvpOnResponseListener? = null - ) { - lastEmail = email - lastPassword = password - - repository.login(requireContext(), email, password, captcha, - object : MvpOnResponseListener { - override fun onResponse(response: JSONObject) { - checkResponse(response, onResponseListener) - } - - override fun onError(t: Throwable) { - onResponseListener?.onError(t) - } - }) - } - - @Suppress("MoveVariableDeclarationIntoWhen") - private fun checkResponse( - response: JSONObject, - onResponseListener: MvpOnResponseListener? = null - ) { - if (response.has("error")) { - val errorString = response.optString("error") - when (errorString) { - "need_validation" -> { - val redirectUrl = response.optString("redirect_uri") - - val bundle = Bundle() - bundle.putString("url", redirectUrl) - - fragment.runOnUiThread { - fragment.setFragmentResultListener("validation") { _, bundle -> - val userId = bundle.getInt("userId") - val token = bundle.getString("token") ?: "" - saveUserData(userId, token) - - openMainScreen() - } - } - - fragment.parentFragmentManager.beginTransaction() - .replace( - R.id.fragmentContainer, - ValidationFragment().apply { arguments = bundle }) - .addToBackStack("") - .commit() - - } - "need_captcha" -> { - val captchaImage = response.optString("captcha_img") - val captchaSid = response.optString("captcha_sid") - showCaptchaDialog(captchaImage, captchaSid) - } - } - } else { - val userId = response.optInt("user_id", -1) - val token = response.optString("access_token") - saveUserData(userId, token) - - openMainScreen() - - onResponseListener?.onResponse(null) - } - } - - private fun openMainScreen() { - fragment.runOnUiThread { - VKApi.init(Locale.getDefault().language, UserConfig.token, AppGlobal.handler) - - (fragment.requireActivity() as MainActivity).bottomBar.isVisible = true - - fragment.parentFragmentManager.beginTransaction() - .replace( - R.id.fragmentContainer, - ChatsFragment() - ).commit() - } - } - - private fun saveUserData(userId: Int, token: String) { - UserConfig.userId = userId - UserConfig.token = token - UserConfig.save() - } - - private fun showCaptchaDialog(captchaImage: String, captchaSid: String) { - val resources = fragment.resources - val metrics = resources.displayMetrics - - fragment.runOnUiThread { - val image = ImageView(requireContext()) - image.layoutParams = ViewGroup.LayoutParams( - (metrics.widthPixels / 3.5).toInt(), metrics.heightPixels / 7 - ) - - Picasso.get().load(captchaImage).priority(Picasso.Priority.HIGH).into(image) - - val captchaCodeEditText = TextInputEditText(requireContext()) - captchaCodeEditText.setHint(R.string.captcha_hint) - - captchaCodeEditText.layoutParams = - LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - - val builder = AlertDialog.Builder(requireContext()) - - val layout = LinearLayout(requireContext()) - - layout.orientation = LinearLayout.VERTICAL - layout.gravity = Gravity.CENTER - layout.addView(image) - layout.addView(captchaCodeEditText) - - builder.setView(layout) - builder.setNegativeButton(android.R.string.cancel, null) - builder.setPositiveButton(android.R.string.ok) { _, _ -> - val captchaCode = captchaCodeEditText.text.toString().trim() - - login( - lastEmail, - lastPassword, - "&captcha_sid=$captchaSid&captcha_key=$captchaCode" - ) - } - - builder.setTitle(R.string.input_captcha) - builder.show() - } - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/repository/ChatsRepository.kt b/app/src/main/java/com/meloda/fast/fragment/ui/repository/ChatsRepository.kt deleted file mode 100644 index f9aa014d..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/repository/ChatsRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.meloda.fast.fragment.ui.repository - -import com.meloda.mvp.MvpRepository -import com.meloda.vksdk.model.VKConversation - -class ChatsRepository : MvpRepository() { -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/repository/ConversationsRepositoryDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/ui/repository/ConversationsRepositoryDeprecated.kt deleted file mode 100644 index 10c5b0be..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/repository/ConversationsRepositoryDeprecated.kt +++ /dev/null @@ -1,103 +0,0 @@ -package com.meloda.fast.fragment.ui.repository - -import com.meloda.concurrent.TaskManager -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpRepository -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.VKApi -import com.meloda.vksdk.VKConstants -import com.meloda.vksdk.model.VKConversation -import com.meloda.vksdk.model.VKMessage - -class ConversationsRepositoryDeprecated : MvpRepository() { - - fun loadConversations( - offset: Int, count: Int, - listener: MvpOnResponseListener> - ) { - TaskManager.execute { - VKApi.messages() - .getConversations() - .filter("all") - .extended(true) - .fields(VKConstants.USER_FIELDS) - .offset(offset) - .count(count) - .executeArray(VKConversation::class.java, - object : OnResponseListener> { - override fun onResponse(response: ArrayList) { - TaskManager.execute { - cacheLoadedConversations(response) - -// MemoryCache.putUsers(VKConversation.profiles) -// MemoryCache.putGroups(VKConversation.groups) - - sendResponse(listener, response) - } - } - - override fun onError(t: Throwable) { - sendError(listener, t) - } - }) - } - } - - fun getCachedConversations( - offset: Int, count: Int, - listener: MvpOnResponseListener> - ) { - if (true) { - sendResponse(listener, arrayListOf()) - return - } - TaskManager.execute { -// val conversations = MemoryCache.getConversations().asArrayList() -// -// VKUtil.sortConversationsByDate(conversations, true) - -// sendResponse(listener, conversations) - } - } - - private fun fillConversationsWithProfilesAndGroups(conversations: ArrayList) { - for (conversation in conversations) { - val lastMessage = conversation.lastMessage - - when (conversation.type) { - VKConversation.Type.USER -> { -// VKUtil.searchUser(conversation.conversationId)?.let { -// conversation.peerUser = it -// } - } - - VKConversation.Type.GROUP -> { -// VKUtil.searchGroup(conversation.conversationId)?.let { -// conversation.peerGroup = it -// } - } - } - - if (lastMessage.isFromGroup()) { -// VKUtil.searchGroup(lastMessage.fromId)?.let { -// lastMessage.fromGroup = it -// } - } else { -// VKUtil.searchUser(lastMessage.fromId)?.let { -// lastMessage.fromUser = it -// } - } - } - } - - private fun cacheLoadedConversations(conversations: List) { - val messages = arrayListOf() - - for (conversation in conversations) { - messages.add(conversation.lastMessage) - } - -// MemoryCache.putMessages(messages) -// MemoryCache.putConversations(conversations) - } -} diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/repository/FriendsRepositoryDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/ui/repository/FriendsRepositoryDeprecated.kt deleted file mode 100644 index a204db48..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/repository/FriendsRepositoryDeprecated.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.meloda.fast.fragment.ui.repository - -import android.util.Log -import com.meloda.concurrent.TaskManager -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpRepository -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.VKApi -import com.meloda.vksdk.VKConstants -import com.meloda.vksdk.model.VKUser - -class FriendsRepositoryDeprecated : MvpRepository() { - - fun loadFriends( - userId: Int, - offset: Int, - count: Int, - listener: MvpOnResponseListener> - ) { - TaskManager.execute { - VKApi.friends() - .get() - .order("hints") - .userId(userId) - .fields(VKConstants.USER_FIELDS) - .count(count) - .offset(offset) - .executeArray(VKUser::class.java, - object : OnResponseListener> { - override fun onResponse(response: ArrayList) { - Log.d("FriendsRepository", "get ${response.size} friends from api") - - TaskManager.execute { - cacheLoadedUsers(userId, response) - } - - sendResponse(listener, response) - } - - override fun onError(t: Throwable) { - sendError(listener, t) - } - }) - } - } - - fun getCachedFriends( - userId: Int, offset: Int, count: Int, onlyOnline: Boolean, - listener: MvpOnResponseListener> - ) { -// TaskManager.execute { -// val friendsArray = MemoryCache.getFriends(userId) -// -// Log.d("FriendsRepository", "get ${friendsArray.size} friends from cache") -// -// if (friendsArray.isEmpty()) { -// sendError(listener, NullPointerException("Friends list is empty")) -// return@execute -// } -// -// val friends = arrayListOf() -// -// for (friend in friendsArray) { -// val user = MemoryCache.getUserById(friend.friendId) -// -// user?.let { -// if (onlyOnline && user.isOnline || !onlyOnline) { -// friends.add(user) -// } -// } -// } -// -// sendResponse(listener, friends) -// } - } - - private fun cacheLoadedUsers(userId: Int, users: ArrayList) { -// MemoryCache.putUsers(users) -// -// val friends = ArrayList() -// -// for (user in users) { -// friends.add(VKFriend(user.userId, userId)) -// } - -// MemoryCache.putFriends(friends) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/repository/LoginRepository.kt b/app/src/main/java/com/meloda/fast/fragment/ui/repository/LoginRepository.kt deleted file mode 100644 index ff48425e..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/repository/LoginRepository.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.meloda.fast.fragment.ui.repository - -import android.annotation.SuppressLint -import android.content.Context -import android.webkit.CookieManager -import android.webkit.JavascriptInterface -import android.webkit.WebView -import android.webkit.WebViewClient -import com.meloda.mvp.MvpOnResponseListener -import com.meloda.mvp.MvpRepository -import com.meloda.vksdk.VKAuth -import org.json.JSONObject -import org.jsoup.Jsoup - -class LoginRepository : MvpRepository() { - - fun login( - context: Context, - email: String, - password: String, - captcha: String, - onResponseListener: MvpOnResponseListener - ) { - if (email.trim().isEmpty() || password.trim().isEmpty()) return - val loadingUrl = VKAuth.getDirectAuthUrl(email, password, captcha) - - val webView = createWebView(context) - - webView.addJavascriptInterface(WebViewHandlerInterface(onResponseListener), "HtmlHandler") - webView.webViewClient = object : WebViewClient() { - override fun onPageFinished(view: WebView?, url: String?) { - webView.loadUrl( - "javascript:window.HtmlHandler.handleHtml" + - "(''+document.getElementsByTagName('html')[0].innerHTML+'');" - ) - } - } - - webView.loadUrl(loadingUrl) - } - - @SuppressLint("SetJavaScriptEnabled") - private fun createWebView(context: Context): WebView { - val loginWebView = WebView(context) - - loginWebView.settings.javaScriptEnabled = true - loginWebView.settings.domStorageEnabled = true - loginWebView.settings.loadsImagesAutomatically = false - loginWebView.settings.userAgentString = "Chrome/41.0.2228.0 Safari/537.36" - - loginWebView.clearCache(true) - - val cookieManager = CookieManager.getInstance() - cookieManager.removeAllCookies(null) - cookieManager.flush() - cookieManager.setAcceptCookie(false) - - return loginWebView - } - - private class WebViewHandlerInterface(private var onResponseListener: MvpOnResponseListener) { - @JavascriptInterface - fun handleHtml(html: String?) { - val doc = Jsoup.parse(html) - - val responseString = - doc.select("pre[style=\"word-wrap: break-word; white-space: pre-wrap;\"]") - .first() - .text() - - onResponseListener.onResponse(JSONObject(responseString)) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/view/ChatsView.kt b/app/src/main/java/com/meloda/fast/fragment/ui/view/ChatsView.kt deleted file mode 100644 index 65f185f9..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/view/ChatsView.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.meloda.fast.fragment.ui.view - -import com.meloda.mvp.MvpView - -interface ChatsView : MvpView { - - fun initViews() - - fun prepareViews() - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/view/ConversationsViewDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/ui/view/ConversationsViewDeprecated.kt deleted file mode 100644 index bb53bed2..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/view/ConversationsViewDeprecated.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.meloda.fast.fragment.ui.view - -import android.os.Bundle -import com.meloda.mvp.MvpView - -interface ConversationsViewDeprecated : MvpView { - - fun openChat(extras: Bundle) - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/view/FriendsViewDeprecated.kt b/app/src/main/java/com/meloda/fast/fragment/ui/view/FriendsViewDeprecated.kt deleted file mode 100644 index 2bf0ba3b..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/view/FriendsViewDeprecated.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.meloda.fast.fragment.ui.view - -import android.os.Bundle -import com.meloda.mvp.MvpView - -interface FriendsViewDeprecated : MvpView { - - fun openChat(extras: Bundle) - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/fragment/ui/view/LoginView.kt b/app/src/main/java/com/meloda/fast/fragment/ui/view/LoginView.kt deleted file mode 100644 index dc55c615..00000000 --- a/app/src/main/java/com/meloda/fast/fragment/ui/view/LoginView.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.meloda.fast.fragment.ui.view - -import com.meloda.mvp.MvpView - -interface LoginView : MvpView { - - fun initViews() - - fun prepareViews() - -} \ No newline at end of file diff --git a/netservices/src/main/java/com/meloda/netservices/io/BytesOutputStream.kt b/app/src/main/java/com/meloda/fast/io/BytesOutputStream.kt similarity index 85% rename from netservices/src/main/java/com/meloda/netservices/io/BytesOutputStream.kt rename to app/src/main/java/com/meloda/fast/io/BytesOutputStream.kt index 89746909..65892969 100644 --- a/netservices/src/main/java/com/meloda/netservices/io/BytesOutputStream.kt +++ b/app/src/main/java/com/meloda/fast/io/BytesOutputStream.kt @@ -1,4 +1,4 @@ -package com.meloda.netservices.io +package com.meloda.fast.io import java.io.ByteArrayOutputStream diff --git a/netservices/src/main/java/com/meloda/netservices/io/Charsets.kt b/app/src/main/java/com/meloda/fast/io/Charsets.kt similarity index 85% rename from netservices/src/main/java/com/meloda/netservices/io/Charsets.kt rename to app/src/main/java/com/meloda/fast/io/Charsets.kt index 90f91197..d9de4363 100644 --- a/netservices/src/main/java/com/meloda/netservices/io/Charsets.kt +++ b/app/src/main/java/com/meloda/fast/io/Charsets.kt @@ -1,4 +1,4 @@ -package com.meloda.netservices.io +package com.meloda.fast.io import java.nio.charset.Charset import java.nio.charset.StandardCharsets diff --git a/netservices/src/main/java/com/meloda/netservices/io/EasyStreams.kt b/app/src/main/java/com/meloda/fast/io/EasyStreams.kt similarity index 99% rename from netservices/src/main/java/com/meloda/netservices/io/EasyStreams.kt rename to app/src/main/java/com/meloda/fast/io/EasyStreams.kt index 15c580af..af371aa5 100644 --- a/netservices/src/main/java/com/meloda/netservices/io/EasyStreams.kt +++ b/app/src/main/java/com/meloda/fast/io/EasyStreams.kt @@ -1,4 +1,4 @@ -package com.meloda.netservices.io +package com.meloda.fast.io import org.jetbrains.annotations.Contract import java.io.* diff --git a/netservices/src/main/java/com/meloda/netservices/io/FileStreams.kt b/app/src/main/java/com/meloda/fast/io/FileStreams.kt similarity index 98% rename from netservices/src/main/java/com/meloda/netservices/io/FileStreams.kt rename to app/src/main/java/com/meloda/fast/io/FileStreams.kt index 40072705..f02f7e7d 100644 --- a/netservices/src/main/java/com/meloda/netservices/io/FileStreams.kt +++ b/app/src/main/java/com/meloda/fast/io/FileStreams.kt @@ -1,4 +1,4 @@ -package com.meloda.netservices.io +package com.meloda.fast.io import org.jetbrains.annotations.Contract import java.io.* diff --git a/app/src/main/java/com/meloda/fast/item/SimpleMenuItem.kt b/app/src/main/java/com/meloda/fast/item/SimpleMenuItem.kt deleted file mode 100644 index c580e72f..00000000 --- a/app/src/main/java/com/meloda/fast/item/SimpleMenuItem.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.meloda.fast.item - -import android.graphics.drawable.Drawable -import android.view.View - -data class SimpleMenuItem( - val icon: Drawable?, - val title: String, - var clickListener: View.OnClickListener? = null -) diff --git a/app/src/main/java/com/meloda/fast/listener/ItemClickListener.kt b/app/src/main/java/com/meloda/fast/listener/ItemClickListener.kt deleted file mode 100644 index 7780ad62..00000000 --- a/app/src/main/java/com/meloda/fast/listener/ItemClickListener.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.meloda.fast.listener - -interface ItemClickListener { - fun onItemClick(position: Int) -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/listener/ItemLongClickListener.kt b/app/src/main/java/com/meloda/fast/listener/ItemLongClickListener.kt deleted file mode 100644 index 4f7b095f..00000000 --- a/app/src/main/java/com/meloda/fast/listener/ItemLongClickListener.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.meloda.fast.listener - -interface ItemLongClickListener { - fun onItemLongClick(position: Int) -} \ No newline at end of file diff --git a/netservices/src/main/java/com/meloda/netservices/HttpRequest.kt b/app/src/main/java/com/meloda/fast/net/HttpRequest.kt similarity index 92% rename from netservices/src/main/java/com/meloda/netservices/HttpRequest.kt rename to app/src/main/java/com/meloda/fast/net/HttpRequest.kt index 2843c33e..a43dc092 100644 --- a/netservices/src/main/java/com/meloda/netservices/HttpRequest.kt +++ b/app/src/main/java/com/meloda/fast/net/HttpRequest.kt @@ -1,7 +1,6 @@ -package com.meloda.netservices +package com.meloda.fast.net import androidx.collection.ArrayMap -import com.meloda.netservices.io.EasyStreams import java.io.IOException import java.io.InputStream import java.io.UnsupportedEncodingException @@ -37,7 +36,7 @@ class HttpRequest( fun asString(): String { val input = getStream() - val content = EasyStreams.read(input) + val content = com.meloda.fast.io.EasyStreams.read(input) connection?.disconnect() @@ -47,7 +46,7 @@ class HttpRequest( @Throws(IOException::class) fun asBytes(): ByteArray { val input = getStream() - val content = EasyStreams.readBytes(input) + val content = com.meloda.fast.io.EasyStreams.readBytes(input) connection?.disconnect() @@ -63,7 +62,7 @@ class HttpRequest( var input = connection!!.inputStream val encoding = connection!!.getHeaderField("Content-Encoding") if ("gzip".equals(encoding, ignoreCase = true)) { - input = EasyStreams.gzip(input) + input = com.meloda.fast.io.EasyStreams.gzip(input) } return input diff --git a/app/src/main/java/com/meloda/fast/receiver/DownloadUpdateReceiver.kt b/app/src/main/java/com/meloda/fast/receiver/DownloadUpdateReceiver.kt index f23a5530..a375da0a 100644 --- a/app/src/main/java/com/meloda/fast/receiver/DownloadUpdateReceiver.kt +++ b/app/src/main/java/com/meloda/fast/receiver/DownloadUpdateReceiver.kt @@ -3,7 +3,7 @@ package com.meloda.fast.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.meloda.vksdk.OnResponseListener +import com.meloda.fast.api.OnResponseListener open class DownloadUpdateReceiver : BroadcastReceiver() { diff --git a/app/src/main/java/com/meloda/fast/service/LongPollService.kt b/app/src/main/java/com/meloda/fast/service/LongPollService.kt index 32ce8a2e..f2ad56da 100644 --- a/app/src/main/java/com/meloda/fast/service/LongPollService.kt +++ b/app/src/main/java/com/meloda/fast/service/LongPollService.kt @@ -6,13 +6,13 @@ import android.os.IBinder import android.util.Log import androidx.annotation.WorkerThread import androidx.collection.arrayMapOf -import com.meloda.concurrent.LowThread import com.meloda.fast.UserConfig import com.meloda.fast.VKLongPollParser +import com.meloda.fast.api.VKApi +import com.meloda.fast.api.model.VKLongPollServer +import com.meloda.fast.concurrent.LowThread +import com.meloda.fast.net.HttpRequest import com.meloda.fast.util.AndroidUtils -import com.meloda.netservices.HttpRequest -import com.meloda.vksdk.VKApi -import com.meloda.vksdk.model.VKLongPollServer import org.json.JSONArray import org.json.JSONObject diff --git a/app/src/main/java/com/meloda/fast/util/AndroidUtils.kt b/app/src/main/java/com/meloda/fast/util/AndroidUtils.kt index 2f0a75d4..ce6197a9 100644 --- a/app/src/main/java/com/meloda/fast/util/AndroidUtils.kt +++ b/app/src/main/java/com/meloda/fast/util/AndroidUtils.kt @@ -1,10 +1,8 @@ package com.meloda.fast.util -import android.content.ClipData import android.content.Context import android.content.Intent import android.content.res.Configuration -import android.net.NetworkCapabilities import android.net.Uri import android.os.Build import android.provider.Settings @@ -38,18 +36,20 @@ object AndroidUtils { } } + //TODO fun hasConnection(): Boolean { - val network = AppGlobal.connectivityManager.activeNetwork ?: return false - val activeNetwork = - AppGlobal.connectivityManager.getNetworkCapabilities(network) ?: return false - - return when { - activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true - activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true - activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true - activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true - else -> false - } + return false +// val network = AppGlobal.connectivityManager.activeNetwork ?: return false +// val activeNetwork = +// AppGlobal.connectivityManager.getNetworkCapabilities(network) ?: return false +// +// return when { +// activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true +// activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true +// activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true +// activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true +// else -> false +// } } fun getDisplayWidth(): Int { @@ -88,8 +88,9 @@ object AndroidUtils { }) } + //TODO fun copyText(label: String? = "", text: String) { - AppGlobal.clipboardManager.setPrimaryClip(ClipData.newPlainText(label, text)) +// AppGlobal.clipboardManager.setPrimaryClip(ClipData.newPlainText(label, text)) } fun getThemeAttrColor(context: Context, @AttrRes resId: Int): Int { diff --git a/arrayutils/src/main/java/com/meloda/arrayutils/ArrayUtils.kt b/app/src/main/java/com/meloda/fast/util/ArrayUtils.kt similarity index 98% rename from arrayutils/src/main/java/com/meloda/arrayutils/ArrayUtils.kt rename to app/src/main/java/com/meloda/fast/util/ArrayUtils.kt index 7bb66fee..de96a79d 100644 --- a/arrayutils/src/main/java/com/meloda/arrayutils/ArrayUtils.kt +++ b/app/src/main/java/com/meloda/fast/util/ArrayUtils.kt @@ -1,4 +1,4 @@ -package com.meloda.arrayutils +package com.meloda.fast.util import java.util.stream.Collectors diff --git a/app/src/main/java/com/meloda/fast/util/ImageUtils.kt b/app/src/main/java/com/meloda/fast/util/ImageUtils.kt index fe12c2ab..c1d2c056 100644 --- a/app/src/main/java/com/meloda/fast/util/ImageUtils.kt +++ b/app/src/main/java/com/meloda/fast/util/ImageUtils.kt @@ -3,51 +3,48 @@ package com.meloda.fast.util import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.widget.ImageView -import com.facebook.drawee.view.SimpleDraweeView -import com.squareup.picasso.Picasso -import com.squareup.picasso.Target object ImageUtils { fun loadImage(image: String, imageView: ImageView, placeholder: Drawable?) { if (image.isEmpty()) return - if (imageView is SimpleDraweeView) { - imageView.setImageURI(image) - return - } +// if (imageView is SimpleDraweeView) { +// imageView.setImageURI(image) +// return +// } +// +// val picasso = Picasso.get() +// .load(image) +// .priority(Picasso.Priority.LOW) - val picasso = Picasso.get() - .load(image) - .priority(Picasso.Priority.LOW) - - if (placeholder != null) picasso.placeholder(placeholder) - - picasso.into(imageView) +// if (placeholder != null) picasso.placeholder(placeholder) +// +// picasso.into(imageView) } fun loadImage(image: String?, listener: OnLoadListener?) { if (image.isNullOrEmpty()) return - val picasso = Picasso.get() - .load(image) - .priority(Picasso.Priority.LOW) +// val picasso = Picasso.get() +// .load(image) +// .priority(Picasso.Priority.LOW) +// +// val target = object : Target { +// override fun onPrepareLoad(placeHolderDrawable: Drawable?) { +// +// } +// +// override fun onBitmapFailed(e: Exception, errorDrawable: Drawable?) { +// listener?.onError(e) +// } +// +// override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) { +// listener?.onLoad(bitmap) +// } +// } - val target = object : Target { - override fun onPrepareLoad(placeHolderDrawable: Drawable?) { - - } - - override fun onBitmapFailed(e: Exception, errorDrawable: Drawable?) { - listener?.onError(e) - } - - override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) { - listener?.onLoad(bitmap) - } - } - - picasso.into(target) +// picasso.into(target) } diff --git a/app/src/main/java/com/meloda/fast/util/KeyboardUtils.kt b/app/src/main/java/com/meloda/fast/util/KeyboardUtils.kt index 0edeb181..8b31c442 100644 --- a/app/src/main/java/com/meloda/fast/util/KeyboardUtils.kt +++ b/app/src/main/java/com/meloda/fast/util/KeyboardUtils.kt @@ -1,16 +1,16 @@ package com.meloda.fast.util import android.view.View -import com.meloda.fast.common.AppGlobal +//TODO object KeyboardUtils { fun hideKeyboardFrom(view: View) { - AppGlobal.inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) +// AppGlobal.inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) } fun showKeyboard(focusedView: View) { - AppGlobal.inputMethodManager.showSoftInput(focusedView, 0) +// AppGlobal.inputMethodManager.showSoftInput(focusedView, 0) } } \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/util/Utils.kt b/app/src/main/java/com/meloda/fast/util/Utils.kt index 3e150a06..32497083 100644 --- a/app/src/main/java/com/meloda/fast/util/Utils.kt +++ b/app/src/main/java/com/meloda/fast/util/Utils.kt @@ -1,9 +1,9 @@ package com.meloda.fast.util import android.content.Context -import com.meloda.arrayutils.ArrayUtils.isNullOrEmpty +import com.meloda.fast.util.ArrayUtils.isNullOrEmpty import com.meloda.fast.R -import com.meloda.netservices.io.BytesOutputStream +import com.meloda.fast.io.BytesOutputStream import java.io.ByteArrayInputStream import java.io.IOException import java.io.ObjectInputStream diff --git a/app/src/main/java/com/meloda/fast/util/VKUtils.kt b/app/src/main/java/com/meloda/fast/util/VKUtils.kt index ada15629..b97e060f 100644 --- a/app/src/main/java/com/meloda/fast/util/VKUtils.kt +++ b/app/src/main/java/com/meloda/fast/util/VKUtils.kt @@ -4,17 +4,16 @@ import android.content.Context import android.graphics.drawable.Drawable import androidx.annotation.WorkerThread import androidx.core.content.ContextCompat -import com.amulyakhare.textdrawable.TextDrawable -import com.meloda.concurrent.TaskManager -import com.meloda.extensions.ContextExtensions.color -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.extensions.DrawableExtensions.tint -import com.meloda.extensions.StringExtensions.lowerCase +import com.meloda.fast.concurrent.TaskManager +import com.meloda.fast.extensions.ContextExtensions.color +import com.meloda.fast.extensions.ContextExtensions.drawable +import com.meloda.fast.extensions.DrawableExtensions.tint +import com.meloda.fast.extensions.StringExtensions.lowerCase import com.meloda.fast.R +import com.meloda.fast.api.model.* import com.meloda.fast.common.AppGlobal -import com.meloda.vksdk.OnResponseListener -import com.meloda.vksdk.model.* -import com.meloda.vksdk.util.VKUtil +import com.meloda.fast.api.OnResponseListener +import com.meloda.fast.api.util.VKUtil import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -73,14 +72,14 @@ object VKUtils { return getUserOnlineIcon(context, null, user) } - fun getAvatarPlaceholder(context: Context, dialogTitle: String): TextDrawable { - return TextDrawable.builder().buildRound( - if (dialogTitle.isEmpty()) "" else { - TextUtils.getFirstLetterFromString(dialogTitle) - }, - context.color(R.color.accent) - ) - } + // fun getAvatarPlaceholder(context: Context, dialogTitle: String): TextDrawable { +// return TextDrawable.builder().buildRound( +// if (dialogTitle.isEmpty()) "" else { +// TextUtils.getFirstLetterFromString(dialogTitle) +// }, +// context.color(R.color.accent) +// ) +// } @Deprecated("") @WorkerThread diff --git a/app/src/main/java/com/meloda/fast/util/ViewUtils.kt b/app/src/main/java/com/meloda/fast/util/ViewUtils.kt index 7c1c6516..68a91afd 100644 --- a/app/src/main/java/com/meloda/fast/util/ViewUtils.kt +++ b/app/src/main/java/com/meloda/fast/util/ViewUtils.kt @@ -7,12 +7,11 @@ import android.view.View import android.widget.TextView import android.widget.Toast import com.google.android.material.snackbar.Snackbar -import com.meloda.extensions.ContextExtensions.color +import com.meloda.fast.extensions.ContextExtensions.color import com.meloda.fast.R import com.meloda.fast.widget.CircleImageView -import com.meloda.vksdk.model.VKUser -import com.meloda.vksdk.util.VKUtil -import com.squareup.picasso.Picasso +import com.meloda.fast.api.model.VKUser +import com.meloda.fast.api.util.VKUtil object ViewUtils { @@ -47,7 +46,7 @@ object ViewUtils { val profileAvatar: CircleImageView = view.findViewById(R.id.headerAvatar) if (AndroidUtils.hasConnection()) { - Picasso.get().load(VKUtil.getUserPhoto(user)).into(profileAvatar) +// Picasso.get().load(VKUtil.getUserPhoto(user)).into(profileAvatar) } else { profileAvatar.setImageDrawable(ColorDrawable(view.context.color(R.color.accent))) } diff --git a/app/src/main/java/com/meloda/fast/viewmodel/ChatsViewModel.kt b/app/src/main/java/com/meloda/fast/viewmodel/ChatsViewModel.kt new file mode 100644 index 00000000..02d56102 --- /dev/null +++ b/app/src/main/java/com/meloda/fast/viewmodel/ChatsViewModel.kt @@ -0,0 +1,70 @@ +package com.meloda.fast.viewmodel + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.meloda.fast.database.CacheStorage +import com.meloda.fast.api.VKApi +import com.meloda.fast.api.VKConstants +import com.meloda.fast.api.model.VKConversation +import com.meloda.fast.api.model.VKMessage +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class ChatsViewModel : ViewModel() { + + val chatsAnswer = MutableLiveData() + + data class ChatsAnswer(var status: Status, var message: String? = "") { + companion object { + val SUCCESS get() = ChatsAnswer(Status.SUCCESS) + val FAIL get() = ChatsAnswer(Status.FAIL) + val LOADING get() = ChatsAnswer(Status.LOADING) + } + + enum class Status { + SUCCESS, FAIL, LOADING + } + } + + fun loadChats() = viewModelScope.launch(Dispatchers.IO) { + chatsAnswer.postValue(ChatsAnswer.LOADING) + + try { + val chats = VKApi.messages() + .getConversations() + .filter("all") + .extended(true) + .fields(VKConstants.USER_FIELDS + ',' + VKConstants.GROUP_FIELDS) + .offset(0) + .count(30) + .executeSuspend(VKConversation::class.java) + +// CacheStorage.chatsStorage.insertValues(chats) + + val lastMessages = arrayListOf() + chats.collect { + lastMessages.add(it.lastMessage) + } + + CacheStorage.messagesStorage.insertValues(lastMessages) + CacheStorage.usersStorage.insertValues(VKConversation.profiles) + CacheStorage.groupsStorage.insertValues(VKConversation.groups) +// +// chatsAnswer.value = ChatsAnswer.SUCCESS + + chatsAnswer.postValue(ChatsAnswer.SUCCESS) + + withContext(Dispatchers.Main) { +// adapter.updateValues(chats.toList()) +// adapter.notifyDataSetChanged() + } + } catch (e: Exception) { + chatsAnswer.postValue(ChatsAnswer.FAIL.also { it.message = e.message }) +// chatsAnswer.value = ChatsAnswer.FAIL.also { it.message = e.message } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/widget/NoItemsView.kt b/app/src/main/java/com/meloda/fast/widget/NoItemsView.kt index 0f7b6adb..5c1c9729 100644 --- a/app/src/main/java/com/meloda/fast/widget/NoItemsView.kt +++ b/app/src/main/java/com/meloda/fast/widget/NoItemsView.kt @@ -11,11 +11,10 @@ import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.core.view.isVisible -import com.meloda.extensions.ContextExtensions.drawable -import com.meloda.extensions.DrawableExtensions.tint -import com.meloda.extensions.FloatExtensions.int +import com.meloda.fast.extensions.ContextExtensions.drawable +import com.meloda.fast.extensions.DrawableExtensions.tint +import com.meloda.fast.extensions.FloatExtensions.int import com.meloda.fast.R -import com.meloda.fast.base.BaseAdapter import com.meloda.fast.util.AndroidUtils @Suppress("UNCHECKED_CAST") @@ -26,8 +25,6 @@ class NoItemsView @JvmOverloads constructor( private lateinit var noItemsPicture: ImageView private lateinit var noItemsTextView: TextView - private var recyclerView: RecyclerView? = null - private val textViewParams get() = LayoutParams( LayoutParams.MATCH_PARENT, @@ -129,16 +126,6 @@ class NoItemsView @JvmOverloads constructor( noItemsTextView.setTextColor(color) } - fun syncWith(recyclerView: RecyclerView) { - this.recyclerView = recyclerView - - recyclerView.noItemsView = this - } - - fun > updateState(adapter: ADAPTER) { - if (adapter.isEmpty()) show() else hide() - } - fun show() { isVisible = true } diff --git a/app/src/main/java/com/meloda/fast/widget/RecyclerView.kt b/app/src/main/java/com/meloda/fast/widget/RecyclerView.kt deleted file mode 100644 index 4252f1c1..00000000 --- a/app/src/main/java/com/meloda/fast/widget/RecyclerView.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.meloda.fast.widget - -import android.content.Context -import android.util.AttributeSet -import androidx.recyclerview.widget.RecyclerView - -class RecyclerView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : RecyclerView(context, attrs, defStyleAttr) { - - var noItemsView: NoItemsView? = null - - -} \ No newline at end of file diff --git a/app/src/main/java/com/meloda/fast/widget/Toolbar.kt b/app/src/main/java/com/meloda/fast/widget/Toolbar.kt index e792312d..15b24544 100644 --- a/app/src/main/java/com/meloda/fast/widget/Toolbar.kt +++ b/app/src/main/java/com/meloda/fast/widget/Toolbar.kt @@ -15,7 +15,6 @@ import android.widget.TextView import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.core.content.res.ResourcesCompat -import com.facebook.drawee.view.SimpleDraweeView import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.theme.overlay.MaterialThemeOverlay import com.meloda.fast.R @@ -97,7 +96,7 @@ class Toolbar : MaterialToolbar { } fun setAvatarIcon(@DrawableRes resId: Int) { - findViewById(R.id.toolbarAvatar).setActualImageResource(resId) +// findViewById(R.id.toolbarAvatar).setActualImageResource(resId) } fun setAvatarClickListener(listener: OnClickListener?) { @@ -108,9 +107,9 @@ class Toolbar : MaterialToolbar { findViewById(R.id.toolbarAvatar).visibility = if (visible) VISIBLE else GONE } - fun getAvatar(): SimpleDraweeView { - return findViewById(R.id.toolbarAvatar) - } +// fun getAvatar(): SimpleDraweeView { +// return findViewById(R.id.toolbarAvatar) +// } fun setTitleMode(titleMode: TitleMode) { val title = findViewById(R.id.toolbarTitle) diff --git a/app/src/main/res/layout/activity_update.xml b/app/src/main/res/layout/activity_update.xml index dfdca701..338b9f50 100644 --- a/app/src/main/res/layout/activity_update.xml +++ b/app/src/main/res/layout/activity_update.xml @@ -63,13 +63,13 @@ android:gravity="center" android:visibility="gone"> - + + + + + + + diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml index ffcccacb..8a35cf3b 100644 --- a/app/src/main/res/layout/item_conversation.xml +++ b/app/src/main/res/layout/item_conversation.xml @@ -26,13 +26,11 @@ android:layout_height="wrap_content" android:layout_weight="0"> - @@ -94,14 +92,12 @@ android:minHeight="26dp" android:orientation="horizontal"> - @@ -141,7 +137,7 @@ android:paddingStart="6dp" android:paddingEnd="6dp"> - - + android:src="?colorAccent" /> diff --git a/arrayutils/.gitignore b/arrayutils/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/arrayutils/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/arrayutils/build.gradle b/arrayutils/build.gradle deleted file mode 100644 index b4adb37e..00000000 --- a/arrayutils/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - coreLibraryDesugaringEnabled true - - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.3.2' - - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' -} \ No newline at end of file diff --git a/arrayutils/proguard-rules.pro b/arrayutils/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/arrayutils/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/arrayutils/src/main/AndroidManifest.xml b/arrayutils/src/main/AndroidManifest.xml deleted file mode 100644 index 5cc67c2d..00000000 --- a/arrayutils/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 0219495c..00000000 --- a/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -buildscript { - ext.kotlin_version = "1.4.30" - repositories { - google() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - jcenter() - flatDir { - dirs 'libs' - } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..d83584b9 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,24 @@ +buildscript { + + repositories { + google() + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}") + classpath("com.android.tools.build:gradle:${Versions.gradlePlugin}") + } +} + +allprojects { + repositories { + google() + mavenCentral() + maven(url = "https://jitpack.io") + //maven { url 'https://jitpack.io' } + } +} + +tasks.register("clean", Delete::class) { + delete(rootProject.buildDir) +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 00000000..8e88a958 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,9 @@ +import org.gradle.kotlin.dsl.`kotlin-dsl` + +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/buildSrc/build/classes/kotlin/main/BuildPlugins$android$2.class b/buildSrc/build/classes/kotlin/main/BuildPlugins$android$2.class new file mode 100644 index 0000000000000000000000000000000000000000..c242e5c9cec80d9b270ed01c55f99b49c9c25a68 GIT binary patch literal 1068 zcmZ`%TTc@~6#iy=rBqrfatAL|ZBe?Vq7Q&1h!C69N-Sw&c$)66W!mkG*-I1O_$~ed zjfo_h7~-Qp%6O&}tx-3-bLQN>bI!Nt`;X6G0c_wA!}OC-xb~qNwuSWbT-u%zcD|AT zV>qmJRp1I~cKSV2$iVR=cg-5_wQRmM>U$kZD-cTh=E3k*-mZ0cpPMe1ZL<-0LbkVd zwixFBkC;G|VR^*=57Y$W3~?d*s_QUJ6^bKOUbH%n6;O>o&BNkpB#}zNz&OK7O?hpz z;{+{_)6^!HQU&~CfVv9mq3aS%-cr5NkdRWKlq$&7M1vFI zGtAch%_U*Qw}lkJ4nw3+Y*Ip@T5P6~!&C|}Tw_R9>y4w``rbZWw=JT45IlLw@pC8O zHV-%<8NGgl{vFdtmekfjg;paBtVUdQw$6lPu{$QUuvSo$?Uo z3Q1@}$*W;&{{rLH8Hyiq?;yje literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/BuildPlugins$kotlin$2.class b/buildSrc/build/classes/kotlin/main/BuildPlugins$kotlin$2.class new file mode 100644 index 0000000000000000000000000000000000000000..d9654fc1b21f244fa577ff6899114c89c628903d GIT binary patch literal 1077 zcmZ`%TTc@~6#iznH%g_Yg52=}YKzh>2tGh1L4??(R$@sL!_&08mT9-MWG_v80=nJ?wiI$fhqG=@|!uTd`DW^By;BE?Y*;cZFg{x%PSr;tE02@RtROBKg$8EwmN zxSWbMxRj31`vp`TzZ%#!(HI0OT!9Mx#J2ikwdHctwpLHWwr#ByHVefB#uy_0iSQVv zD%Wm&qR=Vp>8|n01EH z5|@sA-*p0yG6O?uIQ=*ts0?qa?&VUL!uSZ?Rv6MRtW!&xmTU^kD|CD+XU{QdFzJer zRyF80Ecb{vY_eo4PLtbp?h2(3jB{@S>5HyamObGKvhV&G1m#ec(sK7~?s*oqG`%mI zw&T$vQ4dZWlVPMLT9W&LOZ>^26Sz(5K&W6d1K#>StSD0EQ7Vx38#AgD>Q*GPOUp4r zmQ~UgNKy|FUHO94N4hW+=!}I%Mh|F@h(tkG2T(nmRzPhCsKX#jDtx3P6UHeHXl{^% zYAAUXO_pA&h_My@9Jf9xCk2_l@=uXp{YJk*dwY)jXFTeIqF5tyk{N>@oB*=E83t3zynr8Mkpq9e0nxJlw+)xjZa;xbGqH8p0aBu9QCyabii^`qn#c>wuA^B| zNlqM6{vkQ#nBar+sB)>uEk7!io|R-IVqaXfHQhbk)BR2NH~Y`Of4&583wsRacH40q z58QUs@uUvMkUF$a?5t~h&Ft5;Ls1WOL}=Ic8ZF;xEH#8Hnsy)lkN<22UKxFlr6noPb^FmKwNV zf@+n+E1H<*r(8rM>tQ?40G86{~Le?QaGozrz~ zjcx0OcK&l*OKA`1QjuA0EqbT;&H1zQpVY3&qlTU`W}`+d6(@hvnR40>0#u3UkE&(zngvK&uT+Q&7~>g|{%&l9a3*OpQcWqH+a zx9XzksOX8Vu`6orX5srlc#<9(!%VOI{{M<2N5hILiV zOui__U_cGKNY(~L#Yj$`A!%jySS4~hy7~vk7&>_8S8_0XL90oUf-n)L7%Vl0>DMKj zd8=fadVy3*A`y4EnNSPzwf_g){ui{zFOV%~o+EdL z+a28b9rvCid4`?7KBJPeF!^ZsZ0Scz$J3-oQ6k?sSsNrld-r?tE0P*^Q6~Agx|e^z zFOi3r!=DY$R2TYMk*_Y~7B0sPa+YT-o?Fb_*vQ?@@l1ikqVxv@Zh?k$?EsMy-VeV; vEcLDHC47JnX&1{BDY1gg0Y)SyB~~ToByNO?A(4=XNyH^Sl9-m5lDPRFrJIN zp71;N+vbteQYpk3vaO)^(e<2KyW4O==>|RnE5}G=nVQYM>$U4a;K{3It}@c8snGR1 zPZ^S1#X_;LWx!-usRUuiK5|qu6s|9A;roFSij<{Y4OF%7d2}MvbN$hs`o4Lxs6^Ot z)QD%89t>UW1#L%9(I2^_s-ovG#7c#tfotSp$Ms$HjF`3cMjAITXCkgufTE#cUs=X*=(g7C<68yM~OB?N0Yoa&^KFDHKPg|Qg*CMRJ+9R+IO%hAw7IU0Mdggz@WyFPt53@*;blGWhwYB)9nfj1|lCV*KFzq^=p7Cn`Zy z@?R=7Ng0#W)FfpRH7hr>NSXw;2Uh=&B)>O8BZF zygo&~wBPrY+jGkPz?E*(b9P5hOmXX{VwkPCzEkb@nod|3G{caq1TEn;MCfXKL7KIo zAGVxV^a(O7UI;fPWKkk(af&^KMI?|U|4#_<2piDGhjq*WWxA(v=P4+ltGA2)FG>hLPr z)^nL3;O|bc{(9pZ9%&JVaS@J9;y4~-i}nNR-l7ba4-qRP8~twM&Lz5A#yzYMi~EOQ e603M{h_pmr;-SQxgb@{qXw68>N>~y(iM79bYTFtB literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$acra$2.class b/buildSrc/build/classes/kotlin/main/Deps$acra$2.class new file mode 100644 index 0000000000000000000000000000000000000000..b8f740e22d1bf589993829b8ccc163a31d2fe9a0 GIT binary patch literal 1021 zcmZ`%U2hUW6g{(ic1sJT)qdBHR)uO=sMQCHO-OAc38ImP#Pn%cRywfEn%#lKxBeD? zfyTrpnwZ8%f0XggmMTUi%bmIRo;mm4GxPn&=dS>E@Q`8hiSs7d;I_{*aI`CyYh6C%mdjnA zU_A=8OAIULr%Cht)HE{Fv}Ddtmy9BNYJPhcH%@; z&Ste9xfJFxGeNsehBRdz*>A*5eb{C>={Vo0i zjfqV(F^!M@DC3zewRqd?&bfW_oy(r@KR$m2u!V;V=_l5}Tjzs8#pw^Yzg~)gF}$et z9N!kw=#Kh^kiO+gZW}e;Z?*aMWbE}&n!a$PXY7x)V!77kBW~DSc8rGa3fbA-*=AV$ zKVuAGhSiDqKUiakGDL+OIX#PEHk+Hs^1RixOrLW6?j9#kA`V@Lh6KY}&2c+M*YaB~ z7gRKt(((CO19iu*4{e)h@?5rEN3`D*Xf9?jmq!=cW?`#P+~D@$h!;z7Of!W2BjGV* zYJbj>xT0ktg}=iP%I2B`%~o^GBr=%Q5y2IPc(vX**sWLgNG+Q*@&G(@KI3PW&)eMR z#H95{A^K}f9ceOKfeB@X7+8;7?M;T|)8n{)daP^dX%gwv<3+8=p6cJ;MYXu5FeQdW znM+5$?K?w{Dg%|JDv#l|s_e3wRW^w^%uJD%XGl@hl5I= z`z^~o;4PaxnVMsAyUAUl?6Gs{6$SRUVqo zYlS5Bj!6C!lJ7}jD9{-VoKde>mF`-i2nri@#cI0 literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$cardView$2.class b/buildSrc/build/classes/kotlin/main/Deps$cardView$2.class new file mode 100644 index 0000000000000000000000000000000000000000..0b96185494733b0bb0f9497b3c872ae19a74580c GIT binary patch literal 1042 zcmZ`%+iuf95IyT$>jrY6(0eJgKvHO&mcj!Km8#N;NFg9nMM8br*h{*JvqrWP;H}@n z7l4qc1QM!vU&&#s9&YK%5~iRp09fhKYRPT$ZQJwy;CW@wux}As`XN z%Tmd3iy@LPGzgim6dEbyFkvEw%M8g%t-ilq+u5aK*(RL_;OwcePejNa9&%zby8Q_K zDW;bUnazO-ZAKVahg{AY!`#VH(mXjbjm$;bGABnfMu|N(zrBkaNke1S8OF<8dFpM~ z>jhL9s4QK00ylMKm$X3n6ef`!qtnW8E`)M~vZV-$osjT5o$)z>WI0wwaB2Q{?DT2%(PiaJRfp%y?DXM95bW>-H zuSAY<<%14VlBu)!B*pbJ{sqR1V-!B(_7D`q8o5onJOoT(o$M%X(R!CYgN9&Zu;0Nw r+8+{fn%bW^K%|1%!8?cfQ){7ut60>_wF9sK*Re#Q0LuYx1W5h_c>UrX literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$core$2.class b/buildSrc/build/classes/kotlin/main/Deps$core$2.class new file mode 100644 index 0000000000000000000000000000000000000000..075417b450a20d453239ee0fc116a9c024546db2 GIT binary patch literal 1035 zcmZ`%TTc@~6#iy=r4(8!${j^eTeRI4kq4+G1R*x5)mYNR@HE{W%e32Bv%78Zjo;!g z(3nV~i6K7vql{-t(Hgbco-^m1@7%tb?>|0&1+a-NhVdujjlX8Oo><$6fib+OcHF>` z%53+$rc{CO6nD%j?>23|Ga7r{Q&u2d<(r4YQ?Xoa^FB8nu3Bb2@T6+(?Cvnk|G#1k zVTR?A_&=(~5M_u;)pt9BVLF=|>GHhU7FIw#{&WwUClN;?0R!UTI4&y>2|5GRVd~?t5}L-k|7+NNS|S%I>H`h zN6S*lV3#43%{2&>t>hX>WH6mT1lJkjm0JC1ueN_c$FfBv55QAbtUeO~w|T&+lF{vl z=!%#YX)>Dw6WR^G1<9O?-P7HR6WGY|sstxpLLp zuG{lzGSFCh=os$m$*yU3vPsNfYK%_n3@M5VWea6V;TJjq;rCseh)-3e6185pDZC@z zbjXvbx)ygD+>_cKIu~B{R3N*eqWaR8EJlF@-PN(uB%sECHZ~`WIl7plW(t|$5VVMci(1cP{m&s73 z?igJUo#Vy_9i%3+zv43#*T3;EFkYP__YwCmK@pV5ouK4Pz$`Y%4&xrlhx9k-5o`|h t13V)An2>X{{`@gQ6)X(CMJ!!e%N5+jEiG1#!F=4tDusNk`MBdF{u5<(-j4tP literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$coroutineAndroid$2.class b/buildSrc/build/classes/kotlin/main/Deps$coroutineAndroid$2.class new file mode 100644 index 0000000000000000000000000000000000000000..77d4e283c3a9d1de5c30a68f239a55b8ef749a98 GIT binary patch literal 1080 zcmZ`%TW=CU6#izpc8i5#YfEolS{16W^kN@cY(i=qNf3=RB&JUTyV8MW*6fAoTYrnc zKx1MPO-$pXKgxIpXvL^xnKS2{?|kPn=f}@4-vDf5hhgrC^~PIkIj$4lbIbmYO1wx;R_VitMTW{e4u6 zYYMZ;Fj?Z#k?(p=;8A6uvQz^x+*6fZSL4ejFo)?0x~(%L$!kf|k}Y9*g|1Kd1IMJ7 zNmgl@YC*4QxyQU|lO)H@>UpON@L7ls0z(Sb2a0klX&qM-Q^G?Y#%pf(1ag+Z3YASi^?AWv~b zbB!d_K*_6U(iEvOM%P2H~AIXt8?T&;lU6T!3LRi3LXOHu}OLu z_vzfCzeY>2J&+Iah~#5JW~lvz6ND;Q9DGYyzSLGKxQScpxP1cV;SN^G0$(aobX>8z83SW@ zS?)N#EtS>obuFoU;VN!hW!|kf`R-`!O`saSbd+Zu4z+xt+~z%Q*<7`(s_#nG+TGh_ znEyXx3}J@lk@yv?F+>@nQuUmUpvp7Zkt{FjZPD;4$KUQ@@&w{AO&AzwSSdSh%W4b1 z?s7>*bEO=g4;rXAekHJNqS+!)?h=$66!vasDAz9s=4n;zY~;3cTX9S9Sx9db1{7#7b@hy7U8(J%bKzB>eAyKx)svni|NfshU`Ujd5^mAvo+oIM$ph7}9glX1 zdOvZR3}aQtrpF zq}~x(`+~$rQW$b{M*GevU7!^r5)EA+LPP1K1{x#4DOlu5^e=^w>gUN1X|9ok9wZ|I2fLarU?UM49ivJwF+$~ zXnI^w(OgOu@QVg&Dya2bmuRw<>gKt$JtgdXpp@%x4JUNmwmZkJX!={Fd?~*f$2dbc zI1xU>WcA7@i7HwaQUp5;p=_=}*lZ=&NFswN6A@fzh*xU$!`<56J{`*zO?&{JxE%3w zC*U>@I58RBeu(}W(;`h~b6`T7AqLhVmtA65I6sY>=clHT9w(JPKb z8nezYR_0R4cU{%B=VcsIo~+Voy(lkT+fOWU9*IZi7}y+e7F4tDX!**Qv<9@CEsI|4f}BS&`E5_FV4!4vjIj zFD+O3v^CWGiLx0IbY55oCBeg%?^1RS6ES`$|KYmEi-0yD>S8WdY3jK zL7p|T7D-d@h^&4_@&g?h@+6}JXOu3`(h!M;t_`7~OiBZd5nuuZ@+1eBLP!tt6o)j| zNJ9^lqM9Z{H+9D7YUm6%KI$MPnfV=`rnr8_zQTBYhTJDSxBx{^BDYDGF90)GCp(P$ zBp=ad&=PD6^h0ctenQAuYJctsp$g^)?*bMtt)&WX;+7V-kHCD~!7_z>toXR=BmN8J CEaw*h literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$fragment$2.class b/buildSrc/build/classes/kotlin/main/Deps$fragment$2.class new file mode 100644 index 0000000000000000000000000000000000000000..53871408a3ea15e43c2adb173207299e345872f4 GIT binary patch literal 1046 zcmZ`%TW=CU6#izpc8i5#wRdktg=$%P^P$BiO>H9yqLGHg^l4zXbYPh^y923j{Vo0i zjfqV(F^!M@DB~HRiZ=pt=A84*ch31Z-@bqP0$>A=7?Mw%*Fomk=gp2IRc0*)#_*!t z_LM86)#`ODA(i7x?pkHusoQ*eG#fp;&J59=BXBn^sl%LN>Q|wi)LB z&lp3P;l@b*AFMG%8KOe=ytczImCcP*d0uZh4MjD64-bnc5Qk~Pz&OKF+4GxL%TaZo z3u>B6=_x)KpyH`Y*L8^|!=>$e!amJk%CdENS!t`&t=0T`elv~K9fnXgS0iM$l&d9>#*~Q&t}(<*mFnScWpAIZ#Rh5J2Txv#`^-_?=86-O(dmWg z-(vbmkz4P(&~AuB%=8 zuNzQjptf}5G2GLgUDYCG6PU*27~Pf!yWvRNkqzMl`L-hbo@bN($+D16rQ4}H{vofs z6iJu826t=R7up{N=U;ZE5*?=`dm<1N-~FXGL!u<5?fYh zFjf^!$yL`UezWRz{f2WObg|hXZ|yHu6sYqE4MuB>Sv?A=6i)5Z4vbM`g}g^8 zACY)R7lu5Y(S9&W4`^M8L_=4G&`>(5fyM|h4T~a){-Y35{W^sq%@wlHf>Kt~r0J!u z7+nsXHq)$ literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$gson$2.class b/buildSrc/build/classes/kotlin/main/Deps$gson$2.class new file mode 100644 index 0000000000000000000000000000000000000000..061560dcb2c9b317de5171f2d1ce6e0dd35c4bde GIT binary patch literal 1033 zcmZ`%ZBG+H5PtUhN-0n(3Y0e$)E1>J6^W5bLJ(q;T8$-544<~wwQPIcHFwu0e&e_J z3p6H@Xkv&T{ZYo*qiBuVTxWJ>o_TwAzyJ9B6~Gp@8OEQ8H{M#?(`v0017mnm?P}kV zs?Ztq3R3yPRop35d9T^xJEO7JeP#PnE3a@kJQd5;4j=G>!&SRb_g$&lJG(m!ng3Ue zA zmGpNRLfKq{P}xeZkwh9Z2}E#}AzrD~kM?T&2XrjkL~#I~zU1_o@Og{-oGMwpL5MDh z8IdBh8JI9;h=Fy<)!JlOJU@*m&QB9oYLZmy{4`?~+0(?gcTp>D8BB@px6GARZ+p7$ z(PW^p%+N91Hj`a3++>rO#q=1R))}TKDpX4-TM94V^$EXEG*F-_m8kW5P2nE#rbC`| zRomQYa90|8=v;W&SHA3tiW*2yl7H_v%?!zkQo`MLxaSEXaOyzWj`rx8(C#O?#V}Tv zZN>e*OZ5|V-FIzqC{45ZVco`GRZ*nLBeWR3Ud)?Sh^269kFI`WUOCP+=@e#K`gZhqrmV7)p+?j!DAfFjr=cY=~H0COmj9mXA!_vvrZBiIV`Jv<=& pn2__de&!gV3KoKI5lffWas?~6Zp4jaFb_AeN+Azx9&UMv{{+`H-cA4j literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$jsoup$2.class b/buildSrc/build/classes/kotlin/main/Deps$jsoup$2.class new file mode 100644 index 0000000000000000000000000000000000000000..42d6eaef132e29a2625510e61aed08fbfafe3742 GIT binary patch literal 1026 zcmZ`%TTc@~6#iy=WvR4OE`Ta<1K=z~-ef)Jb3YAk7Dc$&6jnRYu%_R_>Rev7|A zV4|xQg3WmG_%%zBBH76R4Ii9pzbvqg%0D?eYP)Y_2+1-FKzx?CkC^EdD=Z z0#SzRWBz|+O(4z?mulej1j9@&KUU>MvnyIY)%epqDxN|TrU?U+469Yg?O0vmH(f5N zX|9yx^WgwB$FBvpO=)HcR0!#KJd~wEX{%65Vu~T^pGc2ksyfaY#l*`}Nq?6ilFK&; zmaF6&DP%EYB8F=W$x5w$v{&0dpli8B)P~^cOD>-apSQWsDU;D3MCi{jEi$AwLls($ zFt8q(+9ihNi?gJ8ab_BsDLOJ2XNyLWJu|<(iyKKpV>THk%Un6?ZQltz>I~GD?mB_H zy0fdAlUxdOn4X~9IzyVgLbZizN#PZGKH>MBHqo7~N+oJRzbV`!-n7Y*tvW4kH@GXc zJ~A%73Y0JVqM`=UlVsofO)qU(MJeI#+uZX6F_=D3E!**EJ!tk5r_C@?mmS6Zz@_|V z-3i>5IF!2B!YFU!udFCi=P??LwiXL|6k;iw*`r@RL6!~DR_LVJ5nKO+)O)%x6iCKH zW1IqLJ1B{UZj7LjY+3`2G2k*RvZTVG2r^-v;wa4(I-v0Gg hRIn7j%UHS8u2*maH?_ER4CdiBR>|dI&BGlJ$)AeW+w1@U literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$kotlin$2.class b/buildSrc/build/classes/kotlin/main/Deps$kotlin$2.class new file mode 100644 index 0000000000000000000000000000000000000000..94a41a47c03cbf9ebec4467fe5cf531eae7be25d GIT binary patch literal 1051 zcmZ`%ZBG+H5PtUh%2A+Hly`gqwME-22*yAqAqcTat;UijhELnxS+>3InY(QhzwulA z1sW4cG%<}I{ZYo*wqS|cTxWJ>o_*$J=jX4l-vMmlF~h_&=UuSY@{}v&+GY%l;Zh$7A}Y17%N@JFZJKSpwxQLAgO;I|G#sl}=$=bNM(X8N%vR1PoK9E3+i7 zXhBG!_83CxOqFoyVy2ov3Nt1mxXutSmMh2m<%2^y7V7i@eem?fj9)m4+gx#CGTPk` zJsHy?NoK8YLYpB5)*_d^!LZaji<`YO(@0K|O7_kcj68d8{`e3z;)cd-GK?3v^yK@t z*9oXHP+7X{81CuHuIX8&6PU&H7@gLsD~dYOc4S>RL9V3;f8g2l3{xc`opPsLbNpjo zbIFq`d3Ekqxi7RmbS}Q`NF~}%QFcWj$iM$*>iyKS z8OAE2A-U@K#BWx-j$e0wp~h&NF|S*pDTR~!vA;X98SOixbb+>pNHjD%goaX68fc6FW3b4R=wAvU+0T<7(oB$s9wQW_R1fH-3x1 zKw~0_CWiRvk20QZ3)b6ach2pb?_BnL|MB@NfGs>^$UG5m{56*c!js%t+f0Blyr^|` z;7Db5`mQMz#T0kU8h2YZ-yV;>?kOvfTKVR|NGnxp9p2}r!&TdC1fEpw?VW9gh5s`q z5M@{yi~oZ)fjC24s=n?DhM9a}EX(s&M_2*n_}x89o<6bwuctt81>@Y;~g(e~M)j~6k9A;98;R-{tT5lZg*7x>Ftynbn0eJd+&d)@^Z60u9 zGTeTIejE#rESar=iO`HNur9gmGQ-l@NiubIk}|SWB(i5G3r2}OO?`V8H$}WfV%BL}l=?T)-hif8~EtDmNU+e~i-_thzicC!^QSZ4e z;T`gpL!MksTij`K+9$F{&c&BK6-ZZ9RbTp&{JXzK&ycPvCA>X{`@WzdX7-ikXrESx zdOy}S!$d>26%TqI@uwQP=UL)FhRNnfyv@H@QKHIY)EI3v=EGKKO3~~tt-}O)Hpp5g zNxdVs{t4;#q%aiej1Qb~xc95quqPav8;Xo-G z(&Xr7m@&Q{ImOivVUUu{UBqW89zK&_V7xj-;Un%2K{1rcoubP_z#KNoj^YlT_vtfe x3AP6E9v+Z`oheKwp3d9io151cj^w`9F84!RYOZp1@_)RD-_Eu-s85*Rnx9&U#jNj)+WQu z{~2QlGb{|n|G^qVlp!ir&ua^YiEM5t%d2`zG&JS-(>+L@L>!3(EQ~TNmOZ~|w}h_y zTvE|oDNpl@1}dJebX}KdvRpa7C!Lf0)nqoV)RneA*;vifFOD&Wus)Ij2~VE-{*Cg zJejiB;BJlk(%1v%?3=FAvLi~WCj&|T?W?gfBuh#Of5+uPAZU)MUDa^CfYye3Kk^)g zk*aJeuDd?*C#qi8Z-_lKwCp32D&nUhB7Gww1$9Vu*s9`UkV}J&r=xCTq6lHP>LFw4Ba#t zqsyT)-27;Qlw|66e3Ihk8T|_D?HO{P@bCf@!78~Ebol}>g*CFnctGc4`dhRF>wWnM sPe?u^-mR8m zU<@y-9XD{KGTZ&GDODgm#T~QCyG@&Kj>g{flod!<`R3m6R47;5yw6RCtCm?0JgHin zTbm3E|7VOL%y4ZaehF&~QHH2geYYbRrn9+`EH9dEVFi@qqI;M;i8vAo7#L?*sk&av zY>S}jaY;pUrQCp@HBfVdTF-HaCd-xWxzc{0KbNLY(mcLk6!WEgF^&m_aBwJnhMDRm zViH-jER_tl7(&@xgV5PZu8~9r(+NZ{!w|33>igTZon1PXEz*1do;(-%xd^z;15Qjv zw;!TE$MljWvpF!K%@70YkjpMIES(<56Q{=sBRxS|`t*3gD6nUVA0MJd+|Za3!+4o1 zR~>cTo==s5%F@Nha7R}*rNzo7F^kDDI;}CJC@PdKlqH3q?*xS3ac%k!sj5_>*6TKf zx6hjnc`{Yk;!cBmQrko4;;WttWLH#FU;2{#+kbUuNLG{*-j2h4UyzWgU1d40Pjf@P zAG$WfSY5Uh4|*Q)C+cp`v&5d%$>xW=jel5CpvoiE7>zULbt|M&IK54?Fh-trvX*J5 z-Vs^*g5*a!Fyv{C4xCZCKx0EB8oEA&hB7G)G)91FnB++gE`^XDR%1yM!>8@tS+>2~C3n|GzwulA z1sW4cG%>`F{wU*YDOw|5?q+soo_*%!=Eu)3-vDgkF~ihT`@~=KlyWP|JrR!Wt(9V6 z3@>Y46*xi`I(@ewWMF%eJB1o|TNd9LjlJnfGZ0Gpg@fU#Sgv(=pBEf1+l5Bp3EAG+ z-C@LpV4VKEq7y ziYXFHv@E0ub{Rt1T$9k*YOa|?2Ga>dFvAe9)*FX=^~ydS%O(wb0G_;@?sGff77sWv z8E!vBzl>>-CbKm#q0JBj>ypdbWLP>sjVI1e6GnQ1RQmjM!6>q4iSO^DM%>Vt62o|z zOC{gAs^?Q>pt5xFG2GRaP3b9RlbFTi7@gJ`QWUkNWlK}oe!d$JzM?Gp0jZjhcD?7e zZ10e_9P(sp%H&RydqUeo=i;lL41{Y}WncJ${Cj@}&XBB1X?qoi`@T(sOzlh4Q9dmU z^?s}@hOvfdOCIz*;!iYG&ok`<+ERx3A#d{^Rurl72sK7~jCtJ(O(~q-qa_$4&jwk` zq^WmA);}Zpfes9LlF@-PN*8Efh(tp-hR{$ZrGdr>a1I6XBnOv5NDuN9hcwqnLl2aq znkGXxb;js==nU6C>L4YV`yHR9xPHdJ!gzg#+$Y?>07bA#?gU-F0L-C8b{O|aKBUi} xCDfhs#qMnOIW_NZd7p-x3pL}0`qYjs}%CF=Hrf!_%FWc<_-V= literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$roomRuntime$2.class b/buildSrc/build/classes/kotlin/main/Deps$roomRuntime$2.class new file mode 100644 index 0000000000000000000000000000000000000000..61b773d17ae63ed88c39f21626db55b0f7ba9034 GIT binary patch literal 1048 zcmZ`%ZEq4m5PtS}?G+2fYTs+MRiRprV)a9dO`6(95=0{niRq_>JL$r)YwixB-}+np z1sW5ZXkv&T{ZYnQpo*yynBAFq_L-T7`SJ71Hvrps#E^dCyz$pPr8+OWG7ueSy$}Oq zcu{Vvz!lPJ^*WZ2f#XT;T4mm;+kAIC_qr<^fl$)7jz+h9vE1T4Zn<1Gt!m&2+1%aR zWmxz>V+>)2m9hLkSYwDXM1}0Bw!<)!$&OWdUT-;#fNK059u-d@4%38zNrttu@|sr5 z3F;mf)HIh;1$;O_MFo|v>k`c>m$s*b{WhnS+0kax8|t%D$Q5$=IHnlF!Kv`6X8E#) z#1SnDDS|zQP$pX=aHf>4C6LC9i3qMS#7mXx@qXptkgmlBNj(5hUugTx3AoJzPE1Cp z7oz`*X_F$iK5(Jk5Cdyd$lhXD>Yv5U{+Vf{rszoZ&lZe4duo1vA2s5J#uOMPi(D%C zuA{m>bp~on_a4I?-Pu*GQ6_;|Oi$2lgCR*-N7{~T2*=O01HvCDo8(WHg>)+2PTld2 zdEKQ*x~v-9t#MCie-vCCEmcYOgfA$*|3_|yL`h1=J8-%0JEUXsP&QoU)4I^?r^;rS zsEVfKLDwUGv#PpY!#NVV*!+mMc8L{v>O4Y&(H3J~k3uSiQ~R_66BOAbZ<$V-9g&UC zNPM6RLyl~85RB3T+7=?w(9IDvlul}(F$SE4MUlkdQ3$C)o&1RA3Z2k`QdZNX>7}k1 z-3XoI`bV9lB6Gj3mGcc^ZG=1fdcZ2j3+uUwA7e+`y_fH&4KP+`<~Ae60Jp?IZpRk<8@< literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps$swipeRefreshLayout$2.class b/buildSrc/build/classes/kotlin/main/Deps$swipeRefreshLayout$2.class new file mode 100644 index 0000000000000000000000000000000000000000..3623a5edb83c5f956b628b507fcc44313069c0bb GIT binary patch literal 1090 zcmZ`%TTc@~6#iy=rBqrf3gzYn)E1>T(Fds{1R*x5)lkyJ@HB0QcG~SM+1*xoc@$wpA}}z? zuu`_{R<1h-rftdQ`;0drdpID|8_=^$pnRr~$*ptq zxXp9dPp1v6WE8+4ccR4W`y@8Kjmgyr-YTZ+zRUZTE64cByES{f+Bj=|PBR)kUettS{ zoKOHn8ox2-PRalWEH9@R6`0U z({;&z$7<3G#mZ8NO21bZ_5rV(ge1yVgPS#OORbN>ZOkj-YYIc2&c)9NH-Ay=^raCaSWfxZAghKT@^&c0=q*oh&)xt^LP}9915m#%R%z z)UD8z{PAttk_kfANn0XGy(6&p1<{XmVaU)K^uQnm&_WT3c3mI2`VukiXpA|=kR>GQ z1^E#7^5jM|*GNJSl&qR2L6JIRaLspyo1e6ilFa?F&yrpLCcnXWdxrF9JRCX&kS91o z!9#~R6iD~u0iBQOZ_pBKc=8dRkbF*_Nos%o5WW%?yl)Xp7us?Ow{Tk@cMicE+{Fr+ L9IQIH=OFwWh1>Qa literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Deps.class b/buildSrc/build/classes/kotlin/main/Deps.class new file mode 100644 index 0000000000000000000000000000000000000000..8c35a619823e21428feac6df4c02b79ef0ff45b1 GIT binary patch literal 5692 zcmbVQ`Fk5z6+I)bBTsDEjvyCQ}(R6HjqGmdcD}6A4D?(^h6gNoiQR zr9D!3*+eECPfqt4s6eHT0D>B7Ja4Fip`n`WNi&h<>lc&lnUY+Kx*9A&Xwi4r(p6~S zcV^DSg@($A{9ewdF=mPEv?*Wh{WiYmP#!R_%%0K;4Grep+(2q}&dhki4Tkr-egn;R z^lAU#u`SGJG?lhIaaD{Ppv%ApJEn~vJ(splTWKp9wS*_M zmZ8TAh=ENuV~d7W;(UD08n;fTEpaAdUQA`Z6K^7MqA0*Xht1!rp($-eFGdqqdNOXE z_q?)>%yAE7V7txf;#Wt_bnKRR`PBoC+dz*UyMwW()8_Q7mGsU^#tu1d1H0_lJsOrV zL!5s+Y012JCKHn4Ud+Hgo3&rV$~>z-8B3?)F%PlPOLSlZ2W;+JnD2BdH9MY7X5zEn z_sM*Z7Z3vnZN?#)FZ$&Mi8E)OH>rGiAOk}-=MJv?v`BeRmR$M6bQw5e$3!&L&WKcY z&Lb#~!V&2+FlI*`qmmg-o1P%4)K8azaXaP&xBmWkGM+i0p=?Y0q=8A?6+}5s@^B50 zO`PZ-8yMtpf0Tz^Mb*2Dtw8;>wNHfg@+X0;Daw!c%#CbeDLK8 zU#9RCK6tajS1Np!557j>s};W12X9gMI)$(I!CMu+LE&va_$GyKRQP5eyj|g26yD*3 zZ&i4w!ngV0VTEs3c$W{}qwsEp_xj*F6~05^yL|9H3f~>7T)0-bS8l8xjXMwJa;LML zX_+Uyy$^;F?KEXS&T z<$WxC_u#!c?#Cq!Yn`e&b8a?#I-88zC3wggbyea0l=M{A5mxxi{Ne=bxQ6f+_rU)j zeqXyApbEc%EBH_lAH;`wnX8EwGAbwg0Bfv0S+8GB_@g==#K*Wyik4qV$@&D7WV1YO zMf#+UtN0W%ph)g&NX}@#jNZNPvi79v$<$F4w#8WQC-Tac0%To$oMR`WYb$p+RaC2EWOpbQyLG%R0CcIz_vKV$}P;pb5$@uH3w@FRDDJf}*&{m1zQS_CNKOF939vlcXd_iX6zsHy0%A!{z=E{__MuIRx-v0Fm8$MXEWSUPJ1$(JQo-7sf5*E z=(~BS2U0O!gbk5Y)J#mW%{3WuLjF)I!cJ-|J3D2i9gi`bOj_xIgeio@COJ5f%BG{% z5L+20)_yo-O=YJCFJ!EwU}w+Oa$Y}K^m26b_9|yf(7=Y6Jv}e&zw$}iD%xh*R2TW! zIv4raA{Y7C5*PW{^cMNp$QJq7s22IykQVvacozBCRu=i#E*AON5El8^@D=&k;1&7U z&K3FCzTM(mDGLPi*ob;mLsp8v@u`T)wXw2Y<(Uc)>ZpCX{)@BB4r z8HA-u!n-W>SnembvP7{}eqw7%6kF#fw!TEMRzI`lkM;MfJn zzUrwWd!zfT4`CR*IlP_VP5yXDq6+2aK} zBEjy~?ybGu`?`Z2gF(DW**BTUx3Uhu?G(y}@pkp^9k|zhGKVpRD7}cCf+k?$^eOBU zXcCwfxJ%%S8cYc20^~` zCXf=?EwD>qPGCgfh`>7qjtYzkqy?%4Dg=bUI)SwU8G+3Ln*_1~VS()e=L8N53<;bU R7!Wupa6zC`phMu|{{VGC!9@T7 literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/META-INF/buildSrc.kotlin_module b/buildSrc/build/classes/kotlin/main/META-INF/buildSrc.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..a49347afef10a9b5f95305e1058ba36adec7d6dd GIT binary patch literal 16 RcmZQzU|?ooU|@t|0RRA102TlM literal 0 HcmV?d00001 diff --git a/buildSrc/build/classes/kotlin/main/Versions.class b/buildSrc/build/classes/kotlin/main/Versions.class new file mode 100644 index 0000000000000000000000000000000000000000..def4094d500eb839ded149ad4aa54bb3ea37a8b0 GIT binary patch literal 2084 zcmZXUTXWk)6vzLP6I)U2#JMyiZK2Q-NK-0b;-(i;ATcSJx^9VsX$iNrym6Gsl4n;= zr!zd{sULzzo_J;Y&>5IvGU1I6#c)_Va5?BQ;dosQ)Actt%|K}%YZxtACF_=fjD~A< zUvvxmJZKB%c(TAe&ktCjmMAp*pfPY=nvm@Z)^Yh0chGe_nqRTXR>{D)hV+3SxS>WK zt)hVm4P&g|ull_{3pC_PR>dmbWNv?t70U*uXb(LWaN#hQLLE|J7s=bKh7sErJd{^y z(olX&!+2ltT`st1b9ov)*&a=Z}DBhA z=b?u%{&y)Dn~Bc3T2wo@M(VC$-5&SI8|7+6<>~_pi=v|y9Pc!WinU_kIz=sfzekp3 z$_mZ@h?K7MRi4V$9c$GBwyE0iZTQHI;R*6&tw`iw_6yS#Ab;84= zwTl)d?GEMCb#{k)2;GJ*=wJ-N1L5yFD$ufZS1tbud0cZmC!kJh>3S=R&#-P{1RJzs zu;)+)&H7mxDHpXyb9=o}-K6fCO=lU-oT?8Gw(y7ttiu9EmU{0nMTMxTU!I2Ta0oS| zveOPo>XbC?*W;sEQ=ivOJ%4;;>W1n}P&;G%^HQHbJ}T=)Z6jmoC%>ijyuLM&PhHfD zBTr9WZY#w+J|bx}DW#KACMg+7X)Gz3NohPOWs_1aDNQ7$$)uD|N>fQ`Iw{R0rP-u( zAt}wpq?6y%bd~fD6&~oQ+XKh#G=*(K$3_+pusKG(7M0*xZCD5DGF9m%2$&bNm^+}W zd1-6l1x}CGyhBGiZI`dVc`&HHs(y!zChK%Z8iQV&i)}_W>KXEF=CMjIn%#O~=?w zgk6ZSxd@w&v4se`6l0eo?42095@GMf*wqMoKgJd#?86vaim>GvyAfeGW6X-MVvLm{ zY$e7j5w;p*wFU}_~QgJD}++Wb2y~Z~WmtWyq~yl ZiJZhei5ZCni7OKKC2mMumbfjk{Xf$werNyy literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/buildSrcjar-classes.txt b/buildSrc/build/kotlin/buildSrcjar-classes.txt new file mode 100644 index 00000000..f0bc2a6c --- /dev/null +++ b/buildSrc/build/kotlin/buildSrcjar-classes.txt @@ -0,0 +1 @@ +D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\BuildPlugins$android$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\BuildPlugins$kotlin$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\BuildPlugins.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\ConfigData.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$acra$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$appCompat$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$cardView$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$core$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$coroutineAndroid$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$coroutineCore$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$desugaring$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$fragment$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$gson$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$jsoup$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$kotlin$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$material$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$preferences$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$recyclerView$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$roomCompiler$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$roomRuntime$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps$swipeRefreshLayout$2.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Deps.class;D:\Workspace\Android\fast-messenger\buildSrc\build\classes\kotlin\main\Versions.class \ No newline at end of file diff --git a/buildSrc/build/kotlin/compileKotlin/build-history.bin b/buildSrc/build/kotlin/compileKotlin/build-history.bin new file mode 100644 index 0000000000000000000000000000000000000000..639c6ac5e19f8e1af11e6c49187bf0dc2a29bf8e GIT binary patch literal 2790 zcmb_e%Wl&^6rGerN}7P$((* zY*ygcCR=^Hzw_c=Z};W?!QilWushgh^&_Dp8K{UgLoJ3v3+0H2wfZ6y%7q6BPgNZR zBV=0Tj^^mOb{qxc5D7@EB1P2+v_NK;Mm!c;a=$Mk=_xB~D;DqLzUCAD+Q(jVy0FSk z%A>MnNF9u0si2*rpk-G?V~=a8JS%xUD-Bt0NFI*_gvyLNo2WQ;~ocer+wvC!@z(QT5bG>rxiL(>5#;k1Z#Fr+DlntLOm zuwBd3-1WsPf9y$x%gOq&>Yg{zVk&gMw2`V81vWs7ri&ODQH8Xg*KS3HIon&G9TPRA zw?K7JT0#O)Uy-rl%VCOEBy7F|;69PcHFz&<4TI1vW#dcX(CH#$n)}Ye<$@#d&-VRa zcMbonTgw1lmt7?R&^dzcI?<8in}aJ0uwZeG_+xr2De)14a*cSV>;~e?MEo|0eLx+^ ztwQllR>37QG~8ty#5+Hjk|rCz@mZxl1}z|^Q=h{UU~`3d7DrY}mqW9ZE}_wqG&uy2 z(xwSlgZ2hVpVLV~kOm5EqA#}q(4o-CrUHsv#FxYdZ8~w9AFUTGXypawKtDGtp-K)3-Uu=JbQrwA=Mn7x9KUNS8n zuMBg!Jxm=z+$tLI1;d!v;%>-$qVjb_jvU$i#d4qkgXOp8ffHuJQIB zY@H#V{fbrYbMI&S3~}fm1?G5rZiDtG6R);-4|86&(gU0ELe#-fVW*|1@{ANOpjD6v2e%4$?wU&cwYi50P|5~telyJFX7lg^1dkJN2f>Lni9 c?EljN0|5v?00Izz00bZa0SG_<0uX?}4@`|%ZU6uP literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..385497456abd391d72b187b2f97bd5c83a4a9f73 GIT binary patch literal 8 LcmZQz0E34B0OxRT5Z)0T|5<_Ey4Nzcs$u;$s*pZ#6?86}*_z=ADRlrT^ zkfd(PrgO)ndzmJ!^5w4Q^Dn;t?aAm6SPW`>0+Cel_&}=hF(}P-0irl$dUnL}GnSTc zT1dqb`0;4;Ve%|Im+D&QEP`-P#7gowoHAYPWS}*O1XOrg@-#kGQTfY zmgoC2%UNNcA1g#1E8P%X`EVp-1t`wa322@O>rLvzR3wEil*!`a6}ypT6S^sqv7;An z_jX>sK4|vQZXLgiOvYsj-$&<2hW4eH@?^paR&S3jIq+@t4#|PDMYS^D##SHyXFyeO zrG^LHE$*)hZlOM5ZG%n;j6s(PQ(PprHf^V#$4FbPXYasDqAXhL2 zWsX?T){gLDN6&corKKf0TerLEUEn?;)*>A z{fxQvD!_fhTz=(6Jj7hR4{Yx-7jJ{w1?IvIK*OqJ24{7!9?TFcvJPB8hWhRHK@4^A zK7b(}hdOYA7b2{-EcAd2HBlX)g_}VRz(O_P0xQ%S(FQ8S%K;s9KnnGd37}SP?Kkir z0hFV=(PI(MF7?6G}jqK0Oe@HSD_(* zau%L@X)O{!5kNV!vD&G01GTP(5kL_@-Cl!60QFB&Jp!oV%|!s^JhBL&*1glVwXgS} zP^B9vx`FDy9}_?g*Lb>tq8q3?&pHr54R0<2C<3TE4-XMQ_0RII5}!0sX41W*cfN&J!Ea>hBqAS>=@CHv7XbBZOk->`#uEl0kN^P!1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBo5PGHZ+ z<1~NW9e0=j0RjXF5FkK+009C72oNAZfB=E2z>$q}*xqVUfdByl1PBlyK!5-N0t5&U IAkc}x4~--Tl>h($ literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..aa6c39cb76658b76553e37675ab735b0d4341719 GIT binary patch literal 4096 zcmbR3vzt$xfq{Vqh~Yp0!dd~O8i4pe5P(EjK?D$30x=^LgZLl-l3NUBLFAxJqNsB~ z^SOa4TYmiiF9D=M_NfBtXW#$-*8|d~Kye^73PwXoSH4jlP mu`G6|__WLI+RVrA`alREfB*srAbGqN}dNFf8c=g^nX4p;=wP~%Y@(zU*NZlni;dPA1Iv$_Haiw;GQYGi#I zTx$z9TE^+Xk#2lw$F=oTxjKaa%O>RNGzl!l9?2pZhY}xdud+$(%BPN=e!wiUZu6mU ens@%_=YgLy`dv}J=r(8c-!dAx#3RE+^xFei4nI8r literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..f8bc2b3a2748e0c2a557d9bfb14bb15a138fda75 GIT binary patch literal 32768 zcmeIuu?d4v6a~-^l0DK$nk;y13=Qy3SI%BJ^-p(=)1AEsoONRY=_d{>=*EW#2@g? zIkR>gOd}Gc3WPS%Ie?@8yZ?nIJM*|Gb+$=e`3 z3MMmiSR`36Hs3b{pElYZ`6x4qWg?NhmjvI5iNGW^E4pL!}fl7T$dHqv1sy3Qrl zp+*id{OsppkdlXJTM&z7x=iE&L~ctV0Thm*wpb=ete$*Yv`k*YhzL*cxphtVJD{G6 zp#vK-r1@Xxj&Gtb#g`EDBanh}EtMOot2B&mPQgS0^8)pwkT>{uiRZJ$A%rJ0KD?l4 z1R{;><2u6=5Ma@tLTnptsJc$&1JGlO;|V*5=w@inprF9$`A90*K^vgE1CwE}auMU- zq+$9OA3|~;%|mZUgDBB1H4ushEa6~FIiN8Ec|>&3bAsQ2n$`gxgB2m%F)X;Kb=wS~ zQqq=L=DUivTcTy?8mRJaDWp8oO17P>4It&X(px zg>h|kEsa%BY8rb84w#1fELpl9;<`X&6>ML-=W22HOZ=+D?5HSHJ^^l-p4P_a@RJ$n zX(vjDB=~B6Wm}yvjNe_bbpebNRvn-*Ot23L)hHvIbu^)wbxc)Xv;8x!uK*ALGQgW_ zP9L3Q_ED5C2~A9Sq1h7Ybs=Xcxa~@0{Sx8p#}+aZz?BHH(UpjsMVj-wn?>|J>}HX2 zZQvGKOP9cI7QtfZ|DHvz++L*Ku5fBtaW7IW#$Ac5RU&qqVz&|h?(V}C#rnGs?k`6lcwBTNr&c#o6su+W55W2$NdN!< literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..dcca28da6c5a4930d03da1a783855221e96f99dd GIT binary patch literal 32768 zcmeIuK@ET~5Jb@p*g;K?Rl{*F_`pNmprrNC3(39_@RNCQ#2H3_009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+Kq-NHy}eq0OPzL>009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF t5FkKcTOe0qeEDpL1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C&6_{n)1wa4* literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..88c71f0983612ab2add50b080e397cfb30cbc224 GIT binary patch literal 4096 zcmeIuElYz@7{>AA77T;2rTGDbAt**+RxQ4OSgZy?WKo!Lt_Z^q;47H5Sj1uw#FtIM zq+r%EFc<{|Z~wQ?h1u?X!#Th6#(BI4>DFu#{rmH>E?e?Ip5y1GSx56{`5}uu%I_JH z({foh<(52=5AsbGa@jpqIWFhq61I8w3f6E9U%O^)+{ay<#UuRcn4RJ=c5xA3u#E3` zabwn>PiYk^IEcgecx^U;8@PaDSV#ZACibq(HgN~HaSDkcDiVkUB7sOC5{LvMfk+?{ Nhy)^mNZ=nQ@D2ah!QcP@ literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..b8eb05d7efb626197dd0ea7d685e2936dd5f2f91 GIT binary patch literal 4096 zcmeH`%TB{E5Jg$AKv2Z{4MIr%g8TtAOBSe$?uTR&42d1hI4b>noVcNxh$TyBQDyGf z&Yg4J{kb)TE>mzYduer*zg2Ci4PTB61tuq}bCp~O`OCUW8_vk=qhTn^GlL zqBDFzC1*m6P|2=e$cNpJ8d5*$t8q-ny)wEkN4>Dk>!7bgPN)65$fvsi ztp3WS^Ug}<5f0zx5b7=eZZ=jE?%hoqiNCyq8^L+=O~E&4l4}?$@a+CYtTr4&BkHq)$ literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..d4c0665aa159f0149ddb4236e2ccaefb6b7141c6 GIT binary patch literal 15183 zcmeI3%TB{E5JmGT`2k?h4iQ!1Q3+A0Y`ih?G+0UP$aepqcG(n(CS_6Kvxu^@UbI*xgE%9uu@YHs znj>Vj=7ZJHkFb+9fM8$qJwd6oDd>rr!)lh-W QUd>HFT=8FB@rV7`H}o?0V*mgE literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..84136b910b970d6660077eb8c9d2e77c6b18c5cf GIT binary patch literal 32768 zcmeI*OGp%P9Ki7{J4ElGqNNg}mMjXlgXJZtL#19y*}xWYLpwwsvgs*hEy&WsQYld_ zRIt{?ORx}u)Wrfr0%6GxTV0kY@)FdcG&ZxTqk`+dghO*)))OCfB*srAW%vmSzLz{ zj-*P(u+RGf6Eb4wo|WsoKPeL;fB*srAb^1C0%=*Fb}Wy4QoT?5LjVB;5OAl!sJzeo zTC(_xJG-ChdacY6kB*#~*}^LXyeCjyTo*RAZt~t_OoRXeMg`ImxUZ$A&1k$+ad9cU zy*WDQRDJ3qfB*tk3#^cJ*`oU1t5(+`KLQAtC(tGLZSAX!a=%|`-h^bbLtsdXEbDFE zW=Ab*I42O7=f#2Xr>mXofXWCUfB*srm@n{6Qm%UPENFgaG9rM0Y663@o(+v3?I^de zVL7lXcz0*H$4?*ECofVjqu-~$=PLqs3go3&c+Eh&oi(Y2K)C`7<+&aFny4%Hc#iY8 zz+t(5j%!u^MqqkffxKKNr~c&obpw4Ga8Z07Yuat6$3G^0{BHPh&*?s_s$V7ZWk1yP zSe3sZiL0k3N6gBfl|+pOr91oeBZ*L1AS36o@AaYP9QPer0 z`P@L2({}&=F9D=M_NfAC#jXGU>jCMjoBsc|1=5puLEHgkj)Kt;7!85Z5Eu=C(GVC7 cfzc2c4S~@R7!85Z5Eu=C(GVC70TMz008&03U;qFB literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..e07ca8fbf77afe77852560a1d9664f22267adbaa GIT binary patch literal 4096 zcmeIuu?>JQ3r5S}P&S=K(Hwb${Bhk*bIFPo4+62pPmWm2%AQg(2qxJ_2$jT~9p8fhKE znaY6^zkmZL{|t%)Rq!7;bL7U6qGzOqznPKLn(qEIn)VX8#;DKu z;s)!*++SRe`Qi=6lORc1lwPCBo$GY4MZ+Q6Ok+;_?6(>b|Gt}dty#;pJmOl8_}y~h z$a6p%bAGmF$$4w}#MN=f`oXq5Yoq0zoVS*1w;tRC*(D&4foyB?xFI`+JYmQ#$i;a3 zb{(#%K^ooFINA>SYc!=RpgDQ=+!kry9tNR*GmgV#OWau;0n+ZpyMrKPoBmy;Z0-h; zrtnhA`z+No^}TF>)!1hw7e1%Ej5zWno4og9W*@(Ez&@7aR9I#qv&^OSTMxbgV>R5G zGwwO_HD}DTHx@i`+ch1mOVIV~eY*ko(IlYP2--JyGQDWp+^Aens z;DQN0FTv*|_<{*8O7KMqzGQ;0NbqF|o-x7KB>1WXUpK*X51u&yGQCG2IoRMSF5wsfE6)$Wvk+#DMW=r#NiOh zgNWt%HH+zn5@LE;qec(|W+SYM@jaOmbj|5f1J%*>Su*TXk-te3dO^I;#VG};_Rco2 zw_V_L@|M?gp`EK$%UVAHiX;sn9FzpXVpi z&LgrKtv=vvn{mj`EFmpud_$8v8mPK7IP2Z-g^bGwd!Ji*Cf@eF4P;tC=GxEip$&3AlF4a$vFVXlIm%4 z)4*GXEZLvd-ZSvFAojqP0J5;4`|sZ_k3c=c+hN9{#ilrs7i;f7~Jn zBt&<7<|3klT<*QS21q~Oi z{)0s;Vjbd6uzd1=q7in{V*rAo8sIW8ty>IEXw8c~-GcY68C- z9>YzR$g_}VA@3pcxyr+2eE z@+{<8$g_}VIbZ@TE_^nN3vnO3D&8;3g|Mg)iweto-pP|JDtrXb!ut8%AJd}b(weC% zxx83Wa*6fxGF$&I>gV_E%P=>t5X@qj#j>(3++{5PNX}7q85gC;zhp)3Usgrjsfvh; XMec_xa^JT_@$&4mR@8pzGWNd#+&m^B literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..a0ba4d7a6ae4dae1fd65d5df57ae991a10d7f513 GIT binary patch literal 32768 zcmeI%p$)=N5C-6vG+_=*gJF@%BCDC86Ci6ykd+OJ9TPrl3L zzx(W^O{$VdfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfWWE*POHZ$h zOM3MXm=ltOBC4MnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON IfM5s!0Evnd3;+NC literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..405e092a6f23ec8e2e4457a4ca09ee92146bdad5 GIT binary patch literal 4096 zcmeIuF%H5o425AX1P5S4WI%`w2^KFVaVsmWQ`zDEgfnz~mY%%*!*@?-dN;4JaTdB* z@ur0)j(%JvLTnbN&sUf7^h`0fvKrOam+`L6CY=*^KGpu%l}fUS6|t-mBX-*rdx?iO b`-cuV2tWV=5P$##AOHafKmY;|fB*!3J~&uz literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..385497456abd391d72b187b2f97bd5c83a4a9f73 GIT binary patch literal 8 LcmZQz0E34B0O{eKIP2-~ zE!)Z7vK%W&V#IEg$^g7zHATbN+N-D7yFA)+Owvr>W6bpXQlbI!%d#Sq- kb1w;*Z#<3pzZ6D*{9lrJdidAr;rER^$z8T%u6Ans1H_v#U;qFB literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..4b8fb0da37185ad367559af82aa6b78c2c0a96e8 GIT binary patch literal 32768 zcmeIuF%5t~5Cp(W-T^MKfB_mr5h_Y*f(lGf;{y?#gYUli*?N=BPLwDi1PBlyK!5-N z0t5&UAV7cs0Rqhh_FP=<>uEl0kN^P!1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBo5PGHT) z<1~NW9e0=j0RjXF5FkK+009C72oNAZfB=E2z>$q}*xqVUfdByl1PBlyK!5-N0t5&U IAkc}x57hz(l>h($ literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab new file mode 100644 index 00000000..8ade2aaa --- /dev/null +++ b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab @@ -0,0 +1,2 @@ +18 +15 \ No newline at end of file diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab new file mode 100644 index 0000000000000000000000000000000000000000..14f567c2d3a9c31a81f66cc6840dba04fd0dc93d GIT binary patch literal 4096 zcmbR3vzw2ffq{V;h~Yp0!kPi38i4pe5P(ErYHWaPMkoe}g8)d*8O(ynL77BR=YZyW z16Ae$X^@>6Q2U6|JgR6k1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLx5li F0069=672v0 literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..405e092a6f23ec8e2e4457a4ca09ee92146bdad5 GIT binary patch literal 4096 zcmeIuF%H5o425AX1P5S4WI%`w2^KFVaVsmWQ`zDEgfnz~mY%%*!*@?-dN;4JaTdB* z@ur0)j(%JvLTnbN&sUf7^h`0fvKrOam+`L6CY=*^KGpu%l}fUS6|t-mBX-*rdx?iO b`-cuV2tWV=5P$##AOHafKmY;|fB*!3J~&uz literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..385497456abd391d72b187b2f97bd5c83a4a9f73 GIT binary patch literal 8 LcmZQz0E34B0OJQ5CgzSnTZJ)1{w-FN=iyrqG1a5NXst~=_8#7uca3@!*~JXZRxyq!c(~ z)wC`tw;4r%009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7dXAAu`skF9-u+O-lOK!5;& GoB}^Y%LkSK literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab new file mode 100644 index 0000000000000000000000000000000000000000..2409dc13bab06fed5ed2fb2dc76a003c8fe3b656 GIT binary patch literal 4096 zcmeH@;SGW?6oj9k2r7sS#V_`74fb#bCvXP`GA89Np8d%HWtq9{#5gc^{7V;z6v$qgacLcoNUz sMQp`R* literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..c54fd0d994e56194f26ab957b17021b591efabe2 GIT binary patch literal 8 LcmZQz00SWa02%-j literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..09407efabbe5467ec2b0cdc5cce0a25e55419604 GIT binary patch literal 8 McmZQz00Bk;000^Q5&!@I literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..b655db4fe2d4d2c2c88b0eb4e6a1067b16cb5031 GIT binary patch literal 1437 zcmeH`O%8%U3`XZDTtMBsGZKS8Bt#P2%%;v1oB%Cphx-dR(6C{_qUrAC>ubJ)$q+nB z@z)d3vZ6M5m_Z4DZCJ*px#DE2*u z&X?k>PSZmm+j8utb!MtVlR|`j8*}qm1WR#1@<=YAPPnVd7U8P-aHbixCHwK8o3sBr MusK_kv-MW}3z<_Z@c;k- literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..504f86b425199f0368c180c4160388677b7a66ad GIT binary patch literal 32768 zcmeIut8PL;6hP5SfdVb%@z+Qs5?NVUS&6KytVC8;vajO{Q0pW+XC|3sk~Qpy>2NoP z&XYRUQ=MvjaIRUs*StRJxjt)AU$v}Dt?Ij8>Ze}ox7Ky7xB9D1{nxg}Pj{_ldq3U{ z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U rAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&Uc%Z-yq~Htq literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab new file mode 100644 index 0000000000000000000000000000000000000000..f93e681ca64431772f998505685b4337a59a40cf GIT binary patch literal 4096 zcmeIxziSgw00;21q85=7ibxPCMMW}6a0((NNQVri6bI=f0hdx7ia2Bt2_mJ4NXJl@ zAPzx_bPx%)*7&Q2q7aKn2aygU8H$7=Ql$3zIaF|P=pS$oj?cZz!MpGGz1$g^?|Ii1 zMdQ&wBlY{fwL6N+Zi5j&`TNeoo+#R79$)c@jeoniFN%)+nPbOe;B^Sy-fmhaUi!_? z5Yqgy6hc2AGQ-=bZo?@8?IK?lE^0UDTXISMG z);P>LW>{wz8~pf0em-K0(_G~^*Eq;F``F>;g8W=z4=T#PXo+He1l>1ra=g0DMkrS-2#LFymh*LblY0lWU3eU01ENkrH9M|nzoy%L3sd%7!4)LPs5>#37;rC%al|h`R4k_j<(tq2W0=UiaMl`@HYD&-Yu+VZkB)LM9lfz&osOn89>4Hp8-F%U z2lZL&qdw~M+xn=F`qoWr)JJ{PM}5@Cqf4_*I-j2y9Af)GbCEM&cVyVQd?`=w#m&2V z^iU7=@JegG+nyxTwiN8xG{K3U(}j&L+8^@9e%ep}r*iDkfd511r}NW3x}MIn<>jv< zzNhn0PI;kzeYc!)$|;}f{GOFlPC4bTR?7S3lv7Um$cIA*ftk&hg%PKN8=ynXsDe801FapO5o8lT-Kx=-}nt((^9zR`W7^V9k1 j{9&y$zTyPp1mXnZ1mXnZ1mXnZ1mXnZ1mXn#!wLKYon3sw literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..51b37254257dd55ed68c473c39535bf86d6cc7fd GIT binary patch literal 8 McmZQz00HIz003S9Q~&?~ literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..d668d29e3549857164aea4d670feb76be744c537 GIT binary patch literal 8 McmZQz00HI;007*Q0q-u&Eb)8E_0a`WTk^3T`h zufOS+?P|UJo}Nw6PS{Vf@i{5z?(Ok1iQ)FUyZ@!Qd31 zvw}C~5#xLhhwRzc7f9?&6x3q0&$q{gT>a5w@su>iF}{z;TlLY3NrM$gye1x-GAgF@ zrr}B9nUX_!%68POr=N(6x!ZzXbyTizN|;YoXDQ@N{dS(7APCq-5*h8FqE-+SjvQ%< z3!}`6FwAlPX%>C|oiQLzg`3|MxE4@m%m(4jsOhvRTw8Ojlme0NM)Z5`0~<+`-}I@T zU0d3wG+l|QXWQ+Lk|225G_sE$E#ez*MON~4^yx(*M&8oQK76Wdq zI+ZI9>eJQhU6~61oCHF=SK<3owDO;|Te%JHHLJC8#}X=MsJmy}mf@uPNhZ8@#(l}3T^~*8)CI1^g z@0|rzf6i0RdDj>2dvwj-GN5-O7VvpgZ6zvohuN@^2uGB1;pOW)PbV1o-^0P1SBr&m zJF!Ugx1VY=Rg)SPde!z6tJDHv&(`>D1loG;@VBQxf~Rn-zSecAhk$^_D*vNIkpKdb GAn^~Afw{2& literal 0 HcmV?d00001 diff --git a/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i b/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..347e9244eb572ffe15f2dbed0a5b13b58ed7d1fe GIT binary patch literal 32768 zcmeHQe@q)?81BT7;;%4bq%kUtCCU=rI^~ZVh`SiK)Hzwlm=evBj%9}77FZ-ohG65e zr7W|#9Xi&{s8!~yi%JDI>kL?!+X@S=&NO2(u(1*`V&-#ylw{2=y}RCB@5g(8 zP`>Zp_x+yd`QCf)>v4COYE4-t18F*ow=6K3Y_FF+FLc~`@CaY2 z85im&mAwan4)x7FB2_%0aTv_AV@)mRJPVCS_Qq784Ybdne`SO(doK)cyHJqL*PiUu zrGN)@<3xPCL0za)qiKi9p@w~nQ(LOb!Uw%8e|xK3U8o36LIDTX9|O;A8%ngb_UQuP zA@^(DTEm@bykP(c_FTG4D2{gI%dutMJB0d)wJ%2faBaNPBG#YFuLf})>q{rO_Dj`Y z552~&^lz6c9>pOA_$UxT-Z=)pD&b>GHl#o*1%kNVF#hJsSSmZU?GFIZri$(|wc#Q> z(kkFby^B@Mej;sD`J>r@`_cXn z-Hp(d@jt4i9>Id|Lwo+++9Gw_3CxFM_{d;#+(PvCop!yO+)r&%K#vLpL2A=8d(Uc( zn*()W;L?-7YYjKy6{mn5-}Ab6?`JO$(nbnsUI8=m`NEM=Ms6Zj)XC}Qf<iI8k{!{9=5Z$AJLYE0zu^0FHI+U z(g>kR*IDGxx`m%jNDV$0dfu|@4#VC5>jm%1x;)wMTakLcq>AUo_qmT(y!3!n@#Kor zj(HlJ9Gbt+lsy2d-#(D`-_K+0@zl9|x74^Bf%l%VDg0E|R)zWQ|8U7gsZcqgU&+-_ zlq;Sa<9*ap=j7T?{pwI40vOdr`K?0HR3XE^Xo?&b>Zi256M4Ag`!$~`J+9Q_g%EJ! zy)%OEGnE=gBAyq=e_s67uM=&fd{%+C<&-Zc6<-HiZ=C_n-VdINU-Et*I(FuC7;asj ztOK=;r9cSv;P$`F1L?B1;e7hy>c{Ch=X8aX*}oq1WIgju#_L=FdDqkWYD8wboZ-Vb zznv}!E#)+z9i)H`6^J13mzTzM$c!kdS%DB+Z-0K_J~d-BGB!Wf1vwAjOV5cJISCBN zJ%GHgf1089cqGle1@-#Z&wH7qZr)7~*7rYz=a%tyFqol>t+$tZ7aNSW>gg6D@9o3q zbo<

L;lV#2(mD^quZ#k1$d^?Miigu3&CJ%@lUtrjHxBt5Ljf0CZ#&+Z&NN#; z*70V$w>i@|X#DFH2qHgv!qK$vyS+XtwGs*hkoR?)e_Wer($^HT zQrXddQs9OPATP6>WhtNcVPIGC?A^8-#-L78KqdvOY`u-OZjdSbd|37ZQGRsMx%m!_ z{SwA?uBM`0oB6^nhJDw_Ue5QgI&ofMnzQ!vjYoFcRA3gcTTCmx+C)#Nl~Q09b-1gu zoO7Mf#;!x(e}nh`gY*M+@A?oR3MZlnZZ=Z zeD#knd;Zni^F7BD;Ad$eU%bErzD&T$%+gTK(#gck+JQ{Z+R)y{%#iFIy@92kgM+7{ zhK&M0(&LpJeJ)k?^s)wnu)q0xv|>c4l*xG!lrE8Eiagmj+hUjqO+Zlp zFxT4T5=c(-8bKSc)9S;o>T#D2Nf31?e>HdJAD!MnxEvg(9`LJS*LIE#x0S}QsaeZd z?V8;H&j3X8WD-W&gM?aH-pJPJNYAIR=~iV>cYk)g_RSRzmMn&mvE!S%qV>YTtk=XQ zOHE&{5-(wV5ltHb2f~=4Mv*EE)Z1%`_u5&7HS^|8i}nYlLjr~0qS}qXOix0tAcvYZ z3vtbg;K=VQ#(_W2L@&N*vU2$Y!5KkQL+VnW9+=V3;%ux^q|611psIw6cYNr!Fy>to4q+xb>^j!}79JW_@3_0=Z7%{Ml=!4~ypLtzGti0l;-ZxKHt)^U@0{RirXUq)C7 z0Mx7i)X!JSzo53TakMnE{s+^tsPagU!|~c`)O6@S!!hMFs+WA%Axg;tQBo!)XwCFp zIS9=-V-kaA(OKnE6{pwcFIy$< zFf>PeoF1(B{qP0WPw^|x@8PX%-{NN=O0wd$Aj!SWq5HmV;je=8UTQDUAedO$g5_5oF4xG8 z`r$0H>$>J4X8edWK=kFQDJ?-IChGk5&scAVERj676;S*6jTuBrC z2Mv#hS^|=0a8<*MDx2d`Hg__s@=T0540Rb@_)}}jx!Sy8W>TT!R&m7Vlbp3VW_{t` z#E3F_=Io@@rSj-=reJQZ29~z1Qb-yaC)S)pngnj-Z6B41Jjd$H?TNVgvkrAaG6~ET z)Q`f4ct%Lr&!wC#d$YBop##GE80XQn`X1WJsatj-t$XLugI(CxtsXjp-#HQFzufgS zPze(-4>PRWwF_0q5nCon%Xzt8oDu0&4k;33Ndg+DnB*csfua)`Rin@TJWs9*f}V49 z905D^%U=bn$DptjC1&eTYwEK)2U`$+w}fNHyfN!99+|~7Eti$Q4s;ik!?Q4S@`ZoN ztfsoLNpS z1;IVazZL&kq{RmA-GU)ryx@g?@dD*PJpUohX-XOn3qoj*D)Dq~r8zRm#flO{Z>3We zdd1)7BIL^Gf5Gi`+>-&zq#L?3NuXgj+e5qdLrf5UM~z_dq)Nc#T8NQLhuZT87bq}P(~{XHf{@%X2V}g1M;kte&jLluJVKGy zNH*;<3V%gJH)BP$WgETf8_u#7YPCSpC_m`oNE~Xtc6~;(yYvmG?(U%nZL@Q#vK&U= zi-wqsEcj67oetG9L#&zrS(z}c-2@y?-DvYeKbbd*5AnuWD7aj)$d(c$%e~QJ6n2wBfH4|6&uIVh5@+GVM!P*bC^#rv6dmsKMXU*HBg#lsPmDjUeWLQJv7R|8Q>Zl?z{&6gw~FO1yu*TJG6D3%{x9D*v94|HAPTFb^a+V5e+%jeBxlbFD5aegoGIQ{9-E8RpAkFDcaQSjWc z-{lIqcy;MSqkX--QNF{yUYt6fN>Lws&NEa@N}@z;P<#;%U6JH1a)OvxGXoPH6S>_T z;on#8=9^gs>CmJ!Z{SYE1Kf#_fGbzf#@g7-L`ct3?~m)&NI^>$l^>0V`9VD%qqe{U ztsC+F#iaF{W^pMbRd|i|qxTiissDdX$ghtI(rPbqx z%nlPSqbV1WmJ8u?Hy%xM?IP8jT9Urck!9P`qb$-}jGh(X@@Xyvp z;7!5!?@MZ2du954H8xXyrM&A#;AGfX#+O{UO*a}W;b$cpcKmLMP{^HsU`*LkNLgq` zFA)743S!1I0Ds11%0Yj6df#lZy*a2}C9F82%up;r6g>J$q)?&sP~}QnzJB5Y+%jiR zDF=B_7miZOPkwxLX&CZV1dX5YC;mRt6!kj~9=_oukEoPIPCmAVtS{J#0rC8ddiR`b zA=|wv&F$JbAg|N+eRQpS2Hp0}NPP7ig=XNrAPJ-}w(v}{o1k$7C*ep?zBFsoU)%vR1) z$1uO-|0b@uAm(eDL(JsaNK4c5ZIQLoH_g}X<~?lm_;Uw<`whvGuNZb z59&U)xi$pCb^5u}n}XJyn$CkFtFUu#kK?f8pN0~;SVc+`q&_*Zv_7Ht&ndaFn`J4X5`-6yeUVf;Xrr9(m)wY2&JlxU`TZ9tc>8#Kvn&up$=A3mRR7j ztv_D)nTMFWS9Fx1 zeon#i&g!M2usF(t<1xfHDhGI~e10GCL)y;X#HzLxGK^}ckv<{2h-Pv~7{dF8y$G3= z-&jSMyL)y;?iJQU8r> zk~M2qJb)|#psyHzA!}L}J{~OzvbdnXfM6)>^Y|%tGW@1tq z(9Ss!1GIBmfvuNy*Kb%T*v7h8cyF^qT`~E&GDV&V-C5N5fPG8R^`0av|sz|j5upqRyM^GYRd;=&X-iYxO8TJ zPOk=H2Fn8=yNQk)iOtXhbL(2A()fZNjB%y3uW`|w@hh{zZlv$5VAGmqj@eSxD^m?? z4b+o^q#g#pUg;w{eYguzeoodr>EOlqV}TSRh<*7Vi~4HsdBS^SA`E;cL3D)^8@V5R zcp@IIkr0F+a1;##6B;U~?pk>q3$Y65mfRp+oJ>?}RFWXKn7E{y@C2hP1(F16a&6Cf zB2Lg3aty?#b5Jhz+Q?HOmMi_H+pQgn`|t}N#BFab<=iS6ipi6O7W890Z=IGP#hP(_@KojtD@{72fLg*H=g86h;xm#MPCu~pp!akgcW4ewh6$PTi zad`?&j_7%BE5(h#m$%d43kH=DiF+(A!1oppFL|aIwj4F^a@0Z2ywlVk%udqWj7BbUEHUa+3{fW))UlF*pdAh*+krcU&hMP^{r z$4^4pOgIM#sgNX#*UB=+dc7p-5YlzO?gWa6jM~SKn&5`2t7Id-2!__e*<|Z_aB%K& zL`SC$qCO%3ltg)j>pk@|eG27jVQPpBt25-&2s|Ef*wHr|80^{fpW*V`54GJi+YaTg z$3cEHo(2r_amAPPg!Y|ll?E&jvOi>uioY}dvgsiMCeg={WFcQ-;-903b09_k^#D^v&^nm8m3>=|i=`Ee z-W;1V&Q_w21O6FUZxH-PB8zp9B4JRJiG{y)BhjE~_|Z-Vm$IBCjwAP?gOy6h7FVnf z4#sQEIgvSBs1KOARxuDcn9LsZLS=&g9#cP|RkC4W$b>80_C=K$QJVFo;|-Y^T`4`C z5@+SI_|F+87TE9h|MGNMRb-OWC^{vxE*z$(@qsgwB4w9psu^qfmTM%bIO|o2iR9H= zBX%dHCDz2WQ)gw9QHLM=bHA)F4da*JS@!DvfDcG$rK~UO1j@hm$#f{POx(H!Ow2^wDMAYJEfXD8;{}G)_qqtsa~D)$mTLKU zMht};^1dSI=NCp|tr%QAQ?hz&{z+B$ESpozr||Q|255X6!!T&Q&>z!uN!vkeQylfu zSK703p%Ig%Cc-_c&xJejUquzn$)oewSKzbr&(B^OC!Zt#cCf zF04(jF}E{elST ziJxVH%K%97$vD)&cMUKP8-Yw+et7j-DSGrNxC4NBs2Iw;&*zd#7kbr*0IvwzXPvRY z#pg10(?sG)7>B>6QeJ}J^Xw%~W~HYaL7z6`4>J@E@?hs!dW&BBrn}h$LlXAcNKpPZ z64DXYz0?B1x(US5L#(iIrCZ73hK%{7!Ns5;^A@{m)fK)>gKkHGlY>pAjJcO}uI)kM z`|u>yBzZ!~gVUpaD9F&$sii>H1h{D*N&f@XW?LTag~j z_Td(U;4w%HukP))W$Ax7iC@USL^7!)$eaKt0gPFPtMq-ZJAFwmwy8Y{BgFU!*zmi@ znMjmr5m(SlwAE*d>wQurO7Oqj)cZTZ-OQfYEr_oFCu8AB%STTH@Z|vT#s5oxZR~BF z9L=na`2SB5{yerl=H+6>OGrXBY(P!=)@sn7eV`Hl0;GoKVZQJGP{^YlUP7`s_5;uB7O z4V6)^3|!|poINzeTG)5?1#aVM8cNw++YHY7H)m5m;I!K2g z!_Ac*s9Fqw1yd}eq7C=Zf2+^zj_UY|Fh|I{l`~H<9DmQ2|QyhIP12t<7 zYt`eAUcH;oS{yzSP?#LP0YWjzY|@tvj#|{fMq`-2^)QZk}R|wpV-zI!m04Y)2DpT(-oYOm>&uRbxGX;kM(w+WsRr z48DAAH&3ZZB5F*@k|mVtgC8@XX`;r#C2nCtsZPr-L+#@H4wI(JWIh71PmME=5f@~j zOpkxldJIWG4iT4&Bes@abkK;SL;U4AI5Z0*mXw!Fj%V=`Mm>XV+fJ-bvi#C$1^p1d zNpKP_o$k@eRKK)UCg=P!)f-(*=c2R`4@Ne!_{szol++j--(=!2QuSkyHx7L0S}nEr z@Pi3kMB^(>17W>TZcS=CYl&x;s|o4y6<-OJ;wG$lC;^A@GtyC-VcNY^Zo!6h(Rs^J zYInYaqO5AMVibZV(e$H&f5e8ayv3g@B-`KakTG{M+Uup;qqXEsXG7x{4NeS2deC_V z<7Rv}#bL%gH483YnPuV9l31GWJg2^@}8$2P6P#gcKRw zBcxN#t*oYw2{D0PS(+>0IW{JBe9>-UKtaR05yD5!o+F#ysG0Ma=B2Wi27 zNwdapo{c3LVkIPnk5-{3F>>iJJu~C{lmeyAS>sulxTO~=q~?YbTUc&;elK>&#=4N6 zm6`d_w`;-JVK~*H^+R}FBk5dh!_LOiQ@iD} zKtl!xDtUU+7Mw|4Da4x$m6^JAuPpJOLFxzg>gk2*H58@Ew9+)^{dUOJy#a;h^Tju{ z(kv;E{aT;xJHIbmzW#KmuUqy$`0#R3#hMumWZ=hQjUdITHu(5JQu4x_x=y5iLtMxa zrOGhK@x)NlPzz9nM5)&|4VvSzipffdldhZg47iB8hTfpQy-UGr5o4j?!L4>bWMXJ% zsj@51&hK;Lv|i3AbqX6f3MP~eDn2|x-tL$c`tco>jG=M$<9k-Jck}?tMnw_p;e`i9 z*qRhRzfq1O7MIVO7pTd}oOAVK*k?N=`-L?j^qu_-iM!w<>e(fj8dA)h?pDl)oY#2!Y1#cteHcnjYRE6Tmq@JXIdvv?#54s zp_{|_)Z{b!J14QUtOk=+OeIJQwHh(Ae|{vjh+?@6KiQ)sTTba95qOWaiBKSJ`)7|yS&|jmpA4+Xo`f;V_3%Y>l0|~KmxAD zARG1YoPcBPlWjoazB2x%H{YQZo$|$3;KBvhlMqpi4~GT6XOUO{eGqXONWe8D(SZb< z)SAGz0Z72%8r1CU7K9J}qt3i=qKePz{5^Pmar#)ZzN^ z88U0BtoToTR8V~Xlx3ocBlWzcXO2(9R@NCt6UDv;5kC)lCbc0bLDp<0TdC)VF2gs* zSG^+)D=)aaNWp!S(;6;Q)tYSs_{2@cDRzwDgv-`5OJd2EwM?=cllRdJxtxU6z&a<< zePbY;GS*S@ZmsNjofDa0N#B&4moHAkg$};)X6|9?`F8I;&7lusA`U3BVUpT@gIUyU z`l}>d^@a-%LzdJ>2@bjkTV=0*H~v%njB`EFC;Hs8>jEV~H~5v>Ac__FFC+(*8Limjar$M>ZiA@{O&Tl`5tNnyYkI$FqNRr#|P0&`vnOD#iS3%YZC zPMpNaIr?2CYPI2r%vRVt_xRgKUSl#)*qk9&xqac!CZ97cYG`xGI)YyOrMcL6>Wm%` zMNGAZ!4J9V=sa?+@Ae^{5hw2bIf_3f{i|^vGp*jgZnjb+Q&q*ct~2#I4CwGzZN2Df zFY3#(h4OcPDj0sY%J1FTT(m+K2NmZk;v{d!4to0y#n^;Z?Vo9$Qfi&3xbojhd*h~& zpeCO;oXvuzWjwemFP2+zK)>Wi_Pn3`8fPr(c*s0XSpAJEIt;1<%kx75Sd7Jy$4|r_ z8=i&!MGRGxbj0`%Xs3R?t6*LNI#V?!Q61=?7Ey|tcUXp~i4SQRSL+ZpId$y}H2- zW@{Zog=$lOs@n=PNax?W{C*l_{_K=70GR(8^^EQHOstHo|B+eziSlnrZrJcIqLa}0 z-~mW7Q5QuGj$|@cdfrl&R8tyj(**R&^>4RKmW;KY&DZamhe?jLWH}62jD_RW^Pz)? z44u}OuA!8mQaM|D4eyR8t+eY?xsHm! z@nvTYuRFC`)vQkmM&4_(Iw&8CPthKrVQoDPVfA2jo;`i+gkkc_*=w-sU`!i+-b*f{ zz-!gx5MV?Q`@a#&$9X^hw5UVIi zxVi(g9>2AR4lCYFK56!xtY(T{Gj&SvewnD!Skb~I&iV(O0@MIg%rdqEkqDXOZ zbE0-;`VgyT22Zj01JGkGj50h}ZNpOt@8)2Py|+!MY|?|uzb&Vdp2H%(&Lo=d6MBWxhPERw^47*3YN2Y$$I~Vp2hdC&h0R1V$Y(^ z>_$X?V*VT95%%TFPyk_A0O7xeJrf6;f9%z*Y*6@-yfFGD-`1cNTkWRI7s=7dP4>XB znVI8?BZaY$VhGb_{s%RZ6!-t9!$`Y*XU~411q4X=TkfF%Z5y z4|`|C46~X}aPT8hMT*OG%!ZFcSe=ladruz?0^bSc;_RjCCJt=%RC3!m`ESNOIlk_T z0XC2yV4jD)Lq|BRwHiG7pmdsC9$pFM8EsG91)(bAU9Z+`r(O&<$vWX>sjVmmiJO3% zG!A+uDObvIBOo#!3O^E|Q4qIDAWr>r(#v5=_yDPjwLbM}!?e8B`$KQA(d*T@kR)DI z0vm@2RK)^5(1dRy^4oVBt+1ruK_#MPS8SbUH)h;+Udb@I^idLN8O8#_S1hN8S}bUY z*iu1P8fy~8b)G!7Z?Ow#6&*o!Qbq|wmX+dz2F}qkDIjJv^dh=ga{rWLH@}s9Cb>+C zxB|pmx;4DhcN^cY{e2tmNj0lU=plb=vCaMMhc5gpesLHDP2lf8@n#yY255 z4*a|79x=Rqdb%i*6MKM8$mw9E@>h9*XX#D(Exo_tb^R;~+RdLXtQ$K|U3E0zg6%mO zKj3Pm%NfH(01ESjlL)w>ZzhdIF2Z4WmALVXN6!O9!58`_cjN}Y4!f~|ie5Tkpeo|PnmP{p}k z-xFChg)8cQ`2aDmvfvDv-Y|LAuz8N~>phd%7rjtx@N>9^{<{Nmi?$bwtwKMnaNC_! zW|VK%r=3b?Mt&vrbVdI=Tr*BAvfuqt2SIsK0HniHPAD!)CaQ51H!NFB%;HVbV2}~r zT!o>Ans&u8s@KYHI=bgH6~zZ(_?i=63_+255jVeKWVG0vaGKD`(?0 z#o}fScWl470n6ZHxezYOE>xAlfe-Ej??^m%ns(tSZ5O7W;|b*Fcp|pooC98@93#XW zP+XEGQB_{?D7rHhv)no4m3zMncXHZbLsUIR{?|KBK)Plv{6_@@%NFX-bPdg@ykP%1 zU2|}JN4650W^g2!D6O}q>Xm-B$9@Slzwdy?yS@yACYn?t^9@<|<$^ihB6$-k8(KD^ zO6jlD$Z5*8Q9D|EQk72oYn_h0+&Yy`r$xD~EvCc(4YmB(0C>bYo*b|LP_3Hr{n&wxBUkJHzAP zVzvH{RN`53TL=PiS~P)vUb?&S)?CZ)?VK$kB32J!2>YY?3_M<;3OmqZVki=v*#muw zSMoVQb19)dX0_68OmtsTE&b5gUw4(QRiSx!^0E%EY+i-uB*#3#SpszaWGtocr+4#I zB2I>dq5!{Grkglis#S2-JcnGGdGWlQ6M@Tvg#fyH$}<)k_{c0g&yu?d?V(n*1zpp+ zfh3*&!QVknZ+7;|w(rj8@P~1$feWFv4O%T+HyQ<&h%f0bvy_VWM07ohQK8|tPNacS zR+xn164vn_`tw3~3D^p8>JPegwZHsoH{(%#@`qWxC|+5ge@2ZN!|mGnk;sN^pOW>) zN*`1rN$mbb@AQJhD4ifh#Mn1}aQCzs=;aOB9HWTzk0wfkE8eM=eOhq1<3)$4$z70H zk3Twyo~BOd0p*F9)yXKzt59ha#G{dkez@kD!T6+EC{(&)0eAeF9Y5Hx*gAv@{z&{# zw8KBa6a5D;!1-K|`#XF00hX7FyqPE9u5}cJSDvo-a`&g{73qvIR_Q?PI{ykOb=A>T zOZ;p?vJ3sX)qQs`3D98b*kLn}i4dR;Gj!gi4pktNT}A=c8|(Ye4JLnKAE3cR0Ss`g zLSM6PU~mRx%ros?Ci)4p@ko)PPQMkIv-9LuA1%<2Zw2+u7*N)q5fA1ux~KoPysho7 zPQEn}^~{jn75vj=vq--!uXRidCcrP>$8s0I@@CuaZ~&IKSeMuXu)JGzsZN~>`hf}hJ-rueh+@a-6VI{Z#wL#6y8b^J6>Q+3pL zvQ9NyG7oU!e6Aac&R3EgnA+bm9C>5@EW;BNzh!tD_chn$5|08+EiSXi9JYdI>wa+M%?o=7Sle3JhbLV>@ z%A)K{$g;!Z{ghU(t&p5BJw{(5dU>xg$A z5U5;%)Ec73Srz}B5vwn9LY~{<(x9DH>}`ZcOxpaL;%}E={pZ1r2%s42PZ74YH!?P| zH?lS`a`-REf5gMW&+#xuuEq%v5B~$?CP4sXN#{EFf0s&62c3~g#+HVX-fw%Hr!5@( z-qN}Hnt<>ZO4+rLJrMm z_?FdZMpL>tIs?6_c!ITB<|WsI6LO;;DFj&(Y>+rq``8tJ=#PH@v13KYse9TK*R}{Q z*bg9dplw){hD(E zrMk82%FYs+m>cu*M&bgEoeyf6Ebr+$|3`U7g-u{Hm+&Jq0Rlf$NfZkZ3riVj zC46~JM)(?5c-LimpOicI(oN10RCO1q!iec{uEsHgK?BTg>Wg!)&uuX!f1Z6iSW6H1 z`5%f4(xV5TwU`8;`1uUMZv$*^WZ-6CX=MNJZL`LoK3IV^w)RS!p%iYa@^ixL4hm^2 zQrNFi;I0d^S$x0;TR3A@|EKMPovB_9$T2|iU7AB{(!=fHhRF*T+X%heEZ5y~_wSsQ zcx$XVt~J`BzD(Su&Wr6){g%I)@_ze@LF!{RD{amU_c28kBCX97_iU|JO{;TWcKkAR z<7ZzHS1SPu0rqzKp?a53CGtX8Bnp>H;kt=^h9k;u8aZ;#BNoLlHBe2xm0L)(1fLZmO-4T&Ua(ZC5lQ;lp@Y=hhz7w{s=v zXfKt5)-dGr#!3KGB1qiS{>|ePUPuN(Z`dT+b7ex9bcCS0tvLvbNzfn|glbf#=``u& z{@YQcM65R+S*nM`iR&ULZd5PmiYWk&f=UvOZw3~oZDZaMp|42k>-0XGf89t5g7CQV z%(~1McZIv`)$yuyI73w>C7s)7fdxJ%6EUS&l;!YFPo2n=MdkR7TSrHhyDSUl&>17i z)68vT<>sR+Zpj1jp(aMaQ*;D#I}zk{>~I?JKYNPY+FklkMZ=h8AU1UNW9KD0Re2MF zH}``GD+_UF9w`WH9iExxr~nb>(2gcm8KjrYtwqV#uRYqE4TY~PHIV>u7B&h?-->H! zkoXjpk=^V?!Q0{L<$K`1i0AtqI4^)|36m%)AMpj(&;}6)ZVa(>Mx$PG|4YZH9xVZp zQpfnJR!@IYoq7kk=JZxSuyQU|%Z`n3BAoH)YW>g3xjX#l=h*+5;=f6@v9Wrt|Cj+Z z|3i>}lMLOTi}ohBw57NP=&i-CZ)WMn;;R`aFZu6ict7v!^iidy zHlD*Y=-P_Y+PTyuhvB*vV5*z@ZH-S}L}2A*1ftq3O*Pi#yHk!MAAMqi?m787Kh;Va zH-&vcTj;SyeWa$mY*FjFYk%aVGuJxVUxnbSmGzfHUUJF(?U0{I)(c&m|1*@>0UUDQ z7QM3D@&U{O!vg_AFeS1mi4W2<$@5kk_-pK1ze5R6V62<)Dm~^9s_IuBn5w*_u*sQY zGoCsN0U112Twoa&d&@_ueKjh~Y3oE9-oo)4RjU?^Pv^EOK3gLcg9l5i(8}qOnT7MxpEdEdN=nh=^T90e&aFK zIU}-|f>3{F5>a|z2jf(1+#8SOf$~J&4VHDva9)_i9N88lt4tF-7|jT{Zy8ChZ8q_) z{c;RJAX1K#n7nPtvwc3YB9>QVb;MFn6GjM`p#7I7qs>2%a|l)fn*0k7(B#F*)=K=t zu_Pc7ZtP~%PO$2JXq8k7YCLMH<%k5k5U)O?{K|T$>~qz-i;T5%uqVum@09aI$tZ zv-(Gg;vWqlalx!#3Z_2Qqa5%F0TfC_aOhD2A98~IZmWZ&8-uDsEGd2Kyx!=%5crBB zR;RmW+jk~cjwSPNhuK$lyo&hv@d5`lj^WNppSq~Ld%)04R zQil3R5wq|WK(Z>o=W3%+)%V=Pw|Z@Krbe|ja~C4FmI-jV0!;qm;EGkTYo#h@dBJrt zB|o$d1VP%iWis2=#$_qe05eoOO+7K?{je`fx67#WD)ZKm>6{Z+NvO8Zh0JG%yxk4l z_ZQ%_Oi>MVdEn+W{^5|Te>-FncXKcAjAw@&i$y`LNqtjR4*gq`-DRJryvk`RV6~Cg zV^-G@nN>n+C0gshf%)m>+OJsYGZS+GPN0yv>H4~PQ-MrX(dvk;fwGzq3X_Dt$ezlB zKWmB4o;jyjfpa;1z;lI|{amP4YjYxK>_D{N7|SLw{AWiyFyv)HYcI@U{vPtQb%moi zBPMhmLzwb`4qH!UlOt5mbBFEskcXQQ^_cnhkVgj$c`3*&@dKurb_g60A(o$FMc7Id zLn{+5PEGlRvBn%J+lgd(h@3^C@~yF=~nT_cUaxaJov04w26vV=w-y z02#FWt^oN16(H|GHS{-YO@X=0HVwfRYGYfs#LpF=+}H@#-xZ*j|MtfL>P~@Q0f+?v zhzb9677i|Ewnhp@#`Z=Irc!!tK%e5jstn|83bbg&Ei;nE0yVU&o6l`x3$l-6vCsbE zvl+IUamo_Z;eS-wIBUKjE|S?{_-2dCp_TdWp?ACd1;HwE=c1zBPU$C`pINiWcV#E@ z7<~4(kLFBpJtzHpoUL?mbJ!PB&(dt2f^p2M-t5R*x1uVo!`aWA5$1eTIrZBu<0rDN z#O-BP%j+k$B{Bswfj6J3M3D6Y#aL|{ef2nFcvLryvPqM@c1KPMTwgJDZ9JbU)PH~E zGl%Texf#9Fpa3)}a*M)s4j0(QVjIjG!Yx~dpk6fy`W$@7?0tekx9`^UN?Qo9N@wU| z>|@-j%kBN9t3|~e7X;XiM`*xqlujf`k!#2jh3#^Dum6q&9AIfmnJTrKk59RR;dY{U zdb4(p0c3F4E&PEL1J&YD3ox3dsQS8Ea5ZqxXjfeC+AWGnk4JOzq_dwLxZN)_1tK%E zHBP7rO@cIj)@W8R*|SDZ#eN@f^89Y|o-SE#JX%8O zt_5uC;?|ibHgBK2SmvN=?v187yGx^UB_s@=L;1G)#+?Kd6s+)lsj^`k);?yT$c&2s zKJJqZ7ajOCnOko0xJd}T{Jm%0+jQ|EF81}(r|w|xC2py(F~MG7`cuM@v>KXd%bG8jQcvux6zFocigotS7 zi2^L4?+FCZX(6A4Y17;W(1EhCmGyy-TYV5Za186xc0lmIOXx4%^_NO8FJ5p1O=IBP z?r-D#zvEYGcRF~g=ug9EvuQ@JBtQF!3WyQGM)(;KN4_?rCXRgdMw}?O@N`Vig$QDR z{%DC@dM_r3B$*yPrN_!Vs9L&pv}~axfH8`W80II{1Vhn&a?T| zLWt0I9cPd33Ii%G#E(*%XNx2O*=-TQ!nC?x+HpjT#H`*`dmUautP>$*LV%$qmc=+M z2RQ<3P?(N#uMh95UP9bhQKnBCdqSwV0h`%32fYVHXX+_L@x|kB1Tp|jUrg=)Yjhxa-~deV}!Xb(2kvC4M0r*HIIb};D_({Diom4|1xiTF zu4}(0%h?`Jk{}CS&Aaf^Px7e@kTGyEIt-XOdb9lvU&`6y1GhbIHqgcy&F#KB4!FgO zF*JyI(1e~Pf?-3PqGK<_6h;(rG9$s_Ar8s$k9y43dEr!4=2j`wjA2dpR6W=Vcu9$z zJd8{nLPu+2gT~673m%JNyYf7_6M3h!^qBG+a@UB5EF+=ykWX1ES+sIgI11ePD)h>C zJT(Mul;7<8j!*6KQ!UGnyJ^zr<0O~T={E~zwm*87OroAhu|Wp!@o06w29K0ze{31d zPHvmshQHnm@g(Rt?`e*kk!8XhK5+Yqce%Rfs8UNy;=R{L|CO4?c85U#7l_$Jk zjW6KFklPyBc3DcFvX2UP-|#34C&Nqv)k=vT8)zk(V%(AbkvBhEF~y$MAo=ByNFRe% zN?LuHh=8D>ry|8>QZ;sn3^}RSe7*@wGdinBZ)-|=(nt}8`wJKMQ*Cp~HP#9*8SjkX zJ6m!7>=wQ41k5j0yRKb09i6o^o87O)##ul1nts>GV-JriCz{21e7bqCvVd*_)6}m- zAg;aKLtoF*M2#c3;@_)WbFw>aCsaN~_6X&T`Rwo|u9BBu7;Za2c$`vMvpc`w)vKXl z)&3ihjf$Im)Y(UL#5IQtWJszW+Of9w2*$F&OfUKFPFFu``WL^db3+*>KERZ}7Ft(T z;tnn!uSTvn+);R(F~tj5LBo8fqk78G%1@43&03WJSvKYYD~S|!ONTDIx*(%hNt!s` znnEW_{i-Gm`i@m}eSm`5L|>`=pdp3rQkSG3SB3+5%wVGW z#!)|Yi?2CA&WUn7gjr-f+?4dRJ_;{%H}o`qD?=hD2H9Ztr&^7Z-C&~l2)vdUww>`A z^hc8wuTM)u$X}0?r9^$h9EtLnc~}qI#?kAvD=+WmTIf|6f>&k~Ct1d=%`q2R`MiI7*oid))im4qY0R4NzvA$lm>hn0PTp(ECa;s03gshLEz zM|0!~9S5f(cZtSVwRU__97T>&lmC@T+d; zfv$NtwEf7SLpnKHD%3aVRMVuW`*d=aZBhriKKc*uDi+|-nzSg`nuwL zZ=VV#xA7bxvIbmT_#yb;9}0Rk^HJ3(NxRg|E?r9lj^&%VASsOJGZZp~0WPZeRkiH5dwP48{jBffumD8EM~LFqa9M zln;SYuuwpE*tb~mKvhNrd%4@zSI?KYZ`FWGPZzX+g@dgCYQlDA%E9&prGW-Oz1U#v zVP?=fJfr&d(T>q!+f(me2E^(Qkjv>hw@*IE>``Ng_8QMG;Z{L?Rp5xP-Ps$Z0>||k)ju! zi>d#RA2U+QyRwDfv8f%_V*9$2PSQkUy!jWEcgGNB-jMLb`p6d;{zp|R?3kb{Y`Sa8 zdXZ{UwYpxQdRY8ebsIST^}zJ?0Jf1ln+mIDeu@A7RbcGBC##1*4viKikxM8myxZQ9 zq|0djws2wjt$Ttg1~U|?5?gSGkM)>1;@dds0khW$n1(`#hX_213wxjuBtLk8(QZ>; z_wR>l+8>T@7raG~XXtv*3S!h+mj_qhSngnTQXK9aevEC>=At9z6RKIBohwkSEoicy z&yJg@S?k^+w2P=o>NU-q=aP~mrhe232bb!?JVo@&yeFEZr|v)Q6?JHA%-l0Sx)xJq zZDSTcEV(+CbXvPE$iavms?JNlk5X{hyE3G=6%sN*CU< zAr_Gx#L?d+&lXOxVM-ltZ^wc!%52AiE9zk9NFTmMy7O~n((MUcaPmQQ2}jMjiC7As znvL1@bE(}PYayhpMJLCJP9EGP_m-=)F=D|Ly)`1<$lhs@gQ@uc+v?QMz2)*etJZhj zUgjBWTIK$#Ij*}~_Sz@!vSrU^oyoi8ep0@F!My_ZLr?g1>Ni+$-RWs{ohT%|SZVfQ zrAZzaUr6?bWc+BnB{DZ{&Mns$iqkuHHAFTSnRC$;8VwxAesInlYu~om%@i>-Yn$Wo=h2 z>N|er=;T-pq5DbI;@m>fLcE>4okbT;dd5thF+F0MhnJ4$3n8|>%tDc!)k2$vx`n2z zzVp5_VTVd#bkcKRp~A={!i@XSAz*<31Og0i9YHj_kU`dl?Fb@}Vh~u;s0k$D+K>(; zLN)>0xkF&>U=zxKB+7v;Xr~aNn}mMY3&JFCU@?bc66$&hbc4`O*+3X14Lo-P*&s++ ziL4*nUVnuCtHAS|(0BeL>&CYE8lk%hSngwN#YWeTz7ZCo-IO1u9erCYx*6zO5D{kl z2d?o0I{|$|BDxXio4^o88~`3w1u+6?-vPRI^i4Pj?e)M_-!Sc1x8$H3g}(U#VN?)s zF9fPl$Xg-M%|Tyzjxa|SxJ?Lb4(2*^bVJZr{2~l_1+2`$hM=$iMK=O{#U;XswMtMU zkk?~0Pz5M@((Bg literal 0 HcmV?d00001 diff --git a/buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties b/buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties new file mode 100644 index 00000000..806216fc --- /dev/null +++ b/buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties @@ -0,0 +1 @@ +implementation-classpath=D\:/Workspace/Android/fast-messenger/buildSrc/build/classes/java/main;D\:/Workspace/Android/fast-messenger/buildSrc/build/classes/groovy/main;D\:/Workspace/Android/fast-messenger/buildSrc/build/classes/kotlin/main;D\:/Workspace/Android/fast-messenger/buildSrc/build/resources/main diff --git a/arrayutils/consumer-rules.pro b/buildSrc/build/reports/plugin-development/validation-report.txt similarity index 100% rename from arrayutils/consumer-rules.pro rename to buildSrc/build/reports/plugin-development/validation-report.txt diff --git a/buildSrc/build/source-roots/buildSrc/source-roots.txt b/buildSrc/build/source-roots/buildSrc/source-roots.txt new file mode 100644 index 00000000..5bca968b --- /dev/null +++ b/buildSrc/build/source-roots/buildSrc/source-roots.txt @@ -0,0 +1,8 @@ +src\main\resources +src\main\java +src\main\groovy +src\main\kotlin +src\test\resources +src\test\java +src\test\groovy +src\test\kotlin diff --git a/buildSrc/build/tmp/jar/MANIFEST.MF b/buildSrc/build/tmp/jar/MANIFEST.MF new file mode 100644 index 00000000..59499bce --- /dev/null +++ b/buildSrc/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/buildSrc/src/main/kotlin/ConfigData.kt b/buildSrc/src/main/kotlin/ConfigData.kt new file mode 100644 index 00000000..e0ae2e07 --- /dev/null +++ b/buildSrc/src/main/kotlin/ConfigData.kt @@ -0,0 +1,10 @@ +object ConfigData { + + const val compileSdkVersion = 30 + const val buildToolsVersion = "30.0.3" + const val minSdkVersion = 23 + const val targetSdkVersion = 30 + const val versionCode = 1 + const val versionName = "1.0" + +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt new file mode 100644 index 00000000..22ded1ac --- /dev/null +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -0,0 +1,31 @@ +object BuildPlugins { + val android by lazy { "com.android.tools.build:gradle:${Versions.gradlePlugin}" } + val kotlin by lazy { "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}" } +} + +object Deps { + val kotlin by lazy { "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlin}" } + + val desugaring by lazy { "com.android.tools:desugar_jdk_libs:${Versions.desugaring}" } + + val appCompat by lazy { "androidx.appcompat:appcompat:${Versions.appCompat}" } + val material by lazy { "com.google.android.material:material:${Versions.material}" } + val core by lazy { "androidx.core:core-ktx:${Versions.core}" } + val preferences by lazy { "androidx.preference:preference-ktx:${Versions.preferences}" } + val swipeRefreshLayout by lazy { "androidx.swiperefreshlayout:swiperefreshlayout:${Versions.swipeRefreshLayout}" } + val recyclerView by lazy { "androidx.recyclerview:recyclerview:${Versions.recyclerView}" } + val cardView by lazy { "androidx.cardview:cardview:${Versions.cardView}" } + val fragment by lazy { "androidx.fragment:fragment-ktx:${Versions.fragment}" } + + val coroutineCore by lazy { "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}" } + val coroutineAndroid by lazy { "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutines}" } + + val roomRuntime by lazy { "androidx.room:room-runtime:${Versions.room}" } + val roomCompiler by lazy { "androidx.room:room-compiler:${Versions.room}" } + + val gson by lazy { "com.google.code.gson:gson:${Versions.gson}" } + + val jsoup by lazy { "org.jsoup:jsoup:${Versions.jsoup}" } + + val acra by lazy { "ch.acra:acra:${Versions.acra}" } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt new file mode 100644 index 00000000..b4d09b60 --- /dev/null +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -0,0 +1,34 @@ +object Versions { + + const val desugaring = "1.1.5" + const val gradlePlugin = "4.2.1" + const val kotlin = "1.5.0" + + const val appCompat = "1.4.0-alpha02" + const val material = "1.4.0-rc01" + const val core = "1.6.0-rc01" + const val preferences = "1.1.1" + const val swipeRefreshLayout = "1.2.0-alpha01" + const val recyclerView = "1.2.1" + const val cardView = "1.0.0" + const val fragment = "1.3.5" + + const val coroutines = "1.4.3" + + const val room = "2.2.0" + + const val gson = "2.8.6" + + const val jsoup = "1.13.1" + + const val acra = "4.11.1" + + const val viewBinding = "1.0.2" + + + + const val lifecycle = "2.3.1" + + const val retrofit = "2.9.0" + +} \ No newline at end of file diff --git a/concurrent/.gitignore b/concurrent/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/concurrent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/concurrent/build.gradle b/concurrent/build.gradle deleted file mode 100644 index 4894f436..00000000 --- a/concurrent/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" -} \ No newline at end of file diff --git a/concurrent/consumer-rules.pro b/concurrent/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/concurrent/proguard-rules.pro b/concurrent/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/concurrent/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/concurrent/src/main/AndroidManifest.xml b/concurrent/src/main/AndroidManifest.xml deleted file mode 100644 index 7284f3dc..00000000 --- a/concurrent/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/extensions/.gitignore b/extensions/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/extensions/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/extensions/build.gradle b/extensions/build.gradle deleted file mode 100644 index 30501495..00000000 --- a/extensions/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.3.2' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0' - testImplementation 'junit:junit:4.+' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' -} \ No newline at end of file diff --git a/extensions/consumer-rules.pro b/extensions/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/extensions/proguard-rules.pro b/extensions/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/extensions/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/extensions/src/main/AndroidManifest.xml b/extensions/src/main/AndroidManifest.xml deleted file mode 100644 index 9ea04e84..00000000 --- a/extensions/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/mvp/.gitignore b/mvp/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/mvp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/mvp/build.gradle b/mvp/build.gradle deleted file mode 100644 index d7c22f7a..00000000 --- a/mvp/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" -} \ No newline at end of file diff --git a/mvp/consumer-rules.pro b/mvp/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/mvp/proguard-rules.pro b/mvp/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/mvp/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/mvp/src/main/AndroidManifest.xml b/mvp/src/main/AndroidManifest.xml deleted file mode 100644 index 8f358f5f..00000000 --- a/mvp/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpBase.kt b/mvp/src/main/java/com/meloda/mvp/MvpBase.kt deleted file mode 100644 index a94e7e50..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpBase.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.meloda.mvp - -import android.app.Application -import android.os.Handler - -object MvpBase { - - lateinit var handler: Handler - - fun init(application: Application) { - handler = Handler(application.mainLooper) - } - - fun init(appHandler: Handler) { - handler = appHandler - } - - fun post(runnable: Runnable) { - handler.post(runnable) - } -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpConstants.kt b/mvp/src/main/java/com/meloda/mvp/MvpConstants.kt deleted file mode 100644 index 8354b23a..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpConstants.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.meloda.mvp - -object MvpConstants { - - const val PEER_ID = "_peer_id" - const val ID = "_id" - const val COUNT = "_count" - const val OFFSET = "_offset" - const val FROM_CACHE = "_from_cache" - -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpException.kt b/mvp/src/main/java/com/meloda/mvp/MvpException.kt deleted file mode 100644 index 74c80d05..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpException.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.meloda.mvp - -class MvpException(var errorId: String) : Exception(errorId) \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpFields.kt b/mvp/src/main/java/com/meloda/mvp/MvpFields.kt deleted file mode 100644 index 20366e1a..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpFields.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.meloda.mvp - -import android.util.ArrayMap -import java.util.* - -@Suppress("UNCHECKED_CAST") -class MvpFields { - private val fields = ArrayMap() - - fun put(key: String, value: Any): MvpFields { - fields[key] = value - return this - } - - operator fun get(key: String): T { - return fields[key] as T - } - - fun getNonNull(key: String): Any { - return fields[key]!! - } - - fun getNonNull(`object`: Any): Any { - return Objects.requireNonNull(`object`) - } - - fun getFields(): Map { - return fields - } -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpOnLoadListener.kt b/mvp/src/main/java/com/meloda/mvp/MvpOnLoadListener.kt deleted file mode 100644 index 4e56228f..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpOnLoadListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.meloda.mvp - -interface MvpOnLoadListener { - - fun onSuccess() - - fun onError(t: Throwable) - -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpOnResponseListener.kt b/mvp/src/main/java/com/meloda/mvp/MvpOnResponseListener.kt deleted file mode 100644 index d274eeec..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpOnResponseListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.meloda.mvp - -interface MvpOnResponseListener { - - fun onResponse(response: T) - - fun onError(t: Throwable) - -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpPresenter.kt b/mvp/src/main/java/com/meloda/mvp/MvpPresenter.kt deleted file mode 100644 index 5080f35d..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpPresenter.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.meloda.mvp - -import android.content.Context -import android.os.Bundle - -@Suppress("UNCHECKED_CAST") -abstract class MvpPresenter, V : MvpView>( - protected var viewState: V, - private val repositoryStringClassName: String -) { - - protected var context: Context? = null - - protected fun requireContext(): Context { - if (context == null) throw IllegalStateException("context is null") - - return context!! - } - - enum class ListState { - EMPTY, EMPTY_LOADING, EMPTY_NO_INTERNET, EMPTY_ERROR, FILLED, FILLED_LOADING - } - - protected var tag: String = "" - - lateinit var repository: Repository - - init { - initRepository() - } - - private fun initRepository() { - val clazz = Class.forName(repositoryStringClassName) - - this.repository = clazz.newInstance() as Repository - } - - open fun onCreate(context: Context, bundle: Bundle? = null) { - this.context = context - } - - open fun onCreateView(bundle: Bundle? = null) {} - open fun onViewCreated(bundle: Bundle? = null) {} - - protected fun post(runnable: Runnable) { - MvpBase.post(runnable) - } - - open fun destroy() {} - - fun prepareViews() { - viewState.prepareNoItemsView() - viewState.prepareNoInternetView() - viewState.prepareErrorView() - } - - fun setState(state: ListState) { - when (state) { - ListState.EMPTY -> { - viewState.hideRefreshLayout() - viewState.hideProgressBar() - viewState.showNoItemsView() - viewState.hideNoInternetView() - viewState.hideErrorView() - } - ListState.EMPTY_LOADING -> { - viewState.hideRefreshLayout() - viewState.showProgressBar() - viewState.hideNoItemsView() - viewState.hideNoInternetView() - viewState.hideErrorView() - } - ListState.EMPTY_NO_INTERNET -> { - viewState.hideRefreshLayout() - viewState.hideProgressBar() - viewState.hideNoItemsView() - viewState.showNoInternetView() - viewState.hideErrorView() - } - ListState.EMPTY_ERROR -> { - viewState.hideRefreshLayout() - viewState.hideProgressBar() - viewState.hideNoItemsView() - viewState.hideNoInternetView() - viewState.showErrorView() - } - ListState.FILLED -> { - viewState.hideRefreshLayout() - viewState.hideProgressBar() - viewState.hideNoItemsView() - viewState.hideNoInternetView() - viewState.hideErrorView() - } - ListState.FILLED_LOADING -> { - viewState.showRefreshLayout() - viewState.hideProgressBar() - viewState.hideNoItemsView() - viewState.hideNoInternetView() - viewState.hideErrorView() - } - } - } - -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpRepository.kt b/mvp/src/main/java/com/meloda/mvp/MvpRepository.kt deleted file mode 100644 index 9a207abd..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpRepository.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.meloda.mvp - -@Suppress("UNCHECKED_CAST") -abstract class MvpRepository { - - protected fun sendError( - listener: MvpOnResponseListener, - t: Throwable - ) { - MvpBase.post { listener.onError(t) } - } - - protected fun sendResponseArray( - listener: MvpOnResponseListener>, - response: ArrayList - ) { - listener.let { MvpBase.handler.post { listener.onResponse(response) } } - } - - protected fun sendResponse( - listener: MvpOnResponseListener, - response: Item - ) { - listener.let { - MvpBase.handler.post { listener.onResponse(response) } - } - } -} \ No newline at end of file diff --git a/mvp/src/main/java/com/meloda/mvp/MvpView.kt b/mvp/src/main/java/com/meloda/mvp/MvpView.kt deleted file mode 100644 index 9b15d321..00000000 --- a/mvp/src/main/java/com/meloda/mvp/MvpView.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.meloda.mvp - -interface MvpView { - - fun showErrorSnackbar(t: Throwable) - - fun prepareNoItemsView() - - fun showNoItemsView() - - fun hideNoItemsView() - - fun prepareNoInternetView() - - fun showNoInternetView() - - fun hideNoInternetView() - - fun prepareErrorView() - - fun showErrorView() - - fun hideErrorView() - - fun showProgressBar() - - fun hideProgressBar() - - fun showRefreshLayout() - - fun hideRefreshLayout() - -} \ No newline at end of file diff --git a/netservices/.gitignore b/netservices/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/netservices/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/netservices/build.gradle b/netservices/build.gradle deleted file mode 100644 index 30501495..00000000 --- a/netservices/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.3.2' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0' - testImplementation 'junit:junit:4.+' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' -} \ No newline at end of file diff --git a/netservices/consumer-rules.pro b/netservices/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/netservices/proguard-rules.pro b/netservices/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/netservices/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/netservices/src/main/AndroidManifest.xml b/netservices/src/main/AndroidManifest.xml deleted file mode 100644 index 61783206..00000000 --- a/netservices/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index fccacc97..00000000 --- a/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -include ':extensions' -include ':arrayutils' -include ':concurrent' -include ':netservices' -include ':vksdk' -include ':mvp' - -include ':app' - -rootProject.name = "Fast" \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..f3c2a3ba --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "Fast" +include(":app") \ No newline at end of file diff --git a/vksdk/.gitignore b/vksdk/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/vksdk/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/vksdk/build.gradle b/vksdk/build.gradle deleted file mode 100644 index dbc0c77a..00000000 --- a/vksdk/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - - implementation 'androidx.preference:preference-ktx:1.1.1' - - implementation project(":netservices") - implementation project(":concurrent") - implementation project(":arrayutils") -} \ No newline at end of file diff --git a/vksdk/consumer-rules.pro b/vksdk/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/vksdk/proguard-rules.pro b/vksdk/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/vksdk/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/vksdk/src/main/AndroidManifest.xml b/vksdk/src/main/AndroidManifest.xml deleted file mode 100644 index 689d0552..00000000 --- a/vksdk/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file