├── .abstruse.yml ├── .gitignore ├── LICENSE.txt ├── README.md ├── app ├── build.gradle ├── proguard-project.txt └── src │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── topic_common_qna.png │ ├── ic_launcher-playstore.png │ ├── ic_launcher-web.png │ ├── java │ │ └── com │ │ │ └── tomclaw │ │ │ └── appsend │ │ │ ├── Appteka.java │ │ │ ├── analytics │ │ │ ├── Bananalytics.kt │ │ │ ├── EnvironmentProvider.kt │ │ │ ├── EventFiles.kt │ │ │ └── api │ │ │ │ ├── AnalyticsEvent.kt │ │ │ │ ├── Environment.kt │ │ │ │ ├── SubmitEventsRequest.kt │ │ │ │ └── SubmitEventsResponse.kt │ │ │ ├── categories │ │ │ ├── CategoriesInteractor.kt │ │ │ ├── CategoriesResponse.kt │ │ │ ├── Category.kt │ │ │ ├── CategoryConverter.kt │ │ │ └── CategoryItem.kt │ │ │ ├── core │ │ │ ├── AppInfoProvider.kt │ │ │ ├── Config.kt │ │ │ ├── DeviceIdInterceptor.kt │ │ │ ├── DeviceIdProvider.kt │ │ │ ├── MainExecutor.java │ │ │ ├── MigrationManager.kt │ │ │ ├── PersistentCookieJar.kt │ │ │ ├── PleaseWaitTask.java │ │ │ ├── StandByApi.kt │ │ │ ├── StoreApi.kt │ │ │ ├── StoreService.java │ │ │ ├── StoreServiceHolder.kt │ │ │ ├── Task.java │ │ │ ├── TaskExecutor.java │ │ │ ├── TimeProvider.kt │ │ │ ├── UserAgentInterceptor.kt │ │ │ ├── UserAgentProvider.kt │ │ │ └── WeakObjectTask.java │ │ │ ├── di │ │ │ ├── AppComponent.kt │ │ │ ├── AppModule.kt │ │ │ └── legacy │ │ │ │ ├── LegacyComponent.kt │ │ │ │ ├── LegacyInjector.kt │ │ │ │ └── LegacyModule.kt │ │ │ ├── download │ │ │ ├── DownloadManager.kt │ │ │ ├── DownloadNotifications.kt │ │ │ ├── DownloadService.kt │ │ │ └── di │ │ │ │ ├── DownloadServiceComponent.kt │ │ │ │ └── DownloadServiceModule.kt │ │ │ ├── dto │ │ │ ├── AppEntity.kt │ │ │ ├── AttachmentEntity.kt │ │ │ ├── MessageEntity.kt │ │ │ ├── Screenshot.kt │ │ │ ├── StoreResponse.kt │ │ │ ├── TopicEntity.kt │ │ │ └── UserIcon.kt │ │ │ ├── events │ │ │ ├── EventsInteractor.kt │ │ │ └── EventsResponse.kt │ │ │ ├── main │ │ │ ├── abuse │ │ │ │ ├── AbuseActivity.java │ │ │ │ └── AbuseActivity_.java │ │ │ ├── adapter │ │ │ │ └── files │ │ │ │ │ ├── FileViewHolder.java │ │ │ │ │ ├── FileViewHolderCreator.java │ │ │ │ │ ├── FilesAdapter.java │ │ │ │ │ └── FilesListener.java │ │ │ ├── dto │ │ │ │ ├── AbuseResult.java │ │ │ │ └── ApiResponse.java │ │ │ ├── item │ │ │ │ ├── ApkItem.java │ │ │ │ ├── AppItem.java │ │ │ │ ├── BaseItem.java │ │ │ │ ├── CommonItem.java │ │ │ │ └── StoreItem.java │ │ │ ├── local │ │ │ │ ├── ApkItemViewHolder.java │ │ │ │ ├── ApkItemViewHolderCreator.java │ │ │ │ ├── ApkItemsState.java │ │ │ │ ├── AppItemViewHolder.java │ │ │ │ ├── AppItemViewHolderCreator.java │ │ │ │ ├── AppItemsState.java │ │ │ │ ├── CommonItemClickListener.java │ │ │ │ ├── CommonItemFragment.java │ │ │ │ ├── DistroFragment.java │ │ │ │ ├── InstalledFragment.java │ │ │ │ ├── SelectDistroFragment.java │ │ │ │ ├── SelectDistroFragment_.java │ │ │ │ ├── SelectInstalledFragment.java │ │ │ │ ├── SelectInstalledFragment_.java │ │ │ │ ├── SelectLocalAppActivity.java │ │ │ │ ├── SelectLocalAppActivity_.java │ │ │ │ └── TimeHelper.java │ │ │ ├── settings │ │ │ │ ├── SettingsActivity.java │ │ │ │ ├── SettingsActivity_.java │ │ │ │ └── SettingsFragment.java │ │ │ ├── store │ │ │ │ ├── BaseStoreFragment.java │ │ │ │ ├── FilesActivity.java │ │ │ │ ├── FilesActivity_.java │ │ │ │ ├── ListResponse.java │ │ │ │ ├── LocaleHelper.java │ │ │ │ ├── StoreFileViewHolder.java │ │ │ │ ├── StoreFileViewHolderCreator.java │ │ │ │ ├── StoreItemsState.java │ │ │ │ ├── UploadsFragment.java │ │ │ │ ├── UploadsFragment_.java │ │ │ │ └── search │ │ │ │ │ ├── SearchActivity.java │ │ │ │ │ ├── SearchActivity_.java │ │ │ │ │ ├── SearchFragment.java │ │ │ │ │ └── SearchFragment_.java │ │ │ ├── unlink │ │ │ │ ├── UnlinkActivity.java │ │ │ │ ├── UnlinkActivity_.java │ │ │ │ └── UnlinkResponse.java │ │ │ └── unpublish │ │ │ │ ├── UnpublishActivity.java │ │ │ │ ├── UnpublishActivity_.java │ │ │ │ └── UnpublishResponse.java │ │ │ ├── screen │ │ │ ├── about │ │ │ │ ├── AboutActivity.kt │ │ │ │ ├── AboutPresenter.kt │ │ │ │ ├── AboutResourceProvider.kt │ │ │ │ ├── AboutView.kt │ │ │ │ └── di │ │ │ │ │ ├── AboutComponent.kt │ │ │ │ │ └── AboutModule.kt │ │ │ ├── agreement │ │ │ │ ├── AgreementActivity.kt │ │ │ │ ├── AgreementPresenter.kt │ │ │ │ ├── AgreementView.kt │ │ │ │ └── di │ │ │ │ │ ├── AgreementComponent.kt │ │ │ │ │ └── AgreementModule.kt │ │ │ ├── auth │ │ │ │ ├── request_code │ │ │ │ │ ├── RequestCodeActivity.kt │ │ │ │ │ ├── RequestCodeInteractor.kt │ │ │ │ │ ├── RequestCodePresenter.kt │ │ │ │ │ ├── RequestCodeResourceProvider.kt │ │ │ │ │ ├── RequestCodeView.kt │ │ │ │ │ ├── api │ │ │ │ │ │ └── RequestCodeResponse.kt │ │ │ │ │ └── di │ │ │ │ │ │ ├── RequestCodeComponent.kt │ │ │ │ │ │ └── RequestCodeModule.kt │ │ │ │ └── verify_code │ │ │ │ │ ├── VerifyCodeActivity.kt │ │ │ │ │ ├── VerifyCodeInteractor.kt │ │ │ │ │ ├── VerifyCodePresenter.kt │ │ │ │ │ ├── VerifyCodeResourceProvider.kt │ │ │ │ │ ├── VerifyCodeView.kt │ │ │ │ │ ├── api │ │ │ │ │ └── VerifyCodeResponse.kt │ │ │ │ │ └── di │ │ │ │ │ ├── VerifyCodeComponent.kt │ │ │ │ │ └── VerifyCodeModule.kt │ │ │ ├── chat │ │ │ │ ├── ChatActivity.kt │ │ │ │ ├── ChatInteractor.kt │ │ │ │ ├── ChatPreferencesProvider.kt │ │ │ │ ├── ChatPresenter.kt │ │ │ │ ├── ChatResourceProvider.kt │ │ │ │ ├── ChatView.kt │ │ │ │ ├── MessageConverter.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ ├── MsgAttachment.kt │ │ │ │ │ ├── incoming │ │ │ │ │ │ ├── IncomingMsgItem.kt │ │ │ │ │ │ ├── IncomingMsgItemBlueprint.kt │ │ │ │ │ │ ├── IncomingMsgItemPresenter.kt │ │ │ │ │ │ └── IncomingMsgItemView.kt │ │ │ │ │ └── outgoing │ │ │ │ │ │ ├── OutgoingMsgItem.kt │ │ │ │ │ │ ├── OutgoingMsgItemBlueprint.kt │ │ │ │ │ │ ├── OutgoingMsgItemPresenter.kt │ │ │ │ │ │ └── OutgoingMsgItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── HistoryResponse.kt │ │ │ │ │ ├── MsgTranslateResponse.kt │ │ │ │ │ ├── ReadTopicResponse.kt │ │ │ │ │ ├── ReportMessageResponse.kt │ │ │ │ │ ├── SendMessageResponse.kt │ │ │ │ │ ├── TopicInfoResponse.kt │ │ │ │ │ └── TranslationEntity.kt │ │ │ │ └── di │ │ │ │ │ ├── ChatComponent.kt │ │ │ │ │ └── ChatModule.kt │ │ │ ├── details │ │ │ │ ├── DetailsActivity.kt │ │ │ │ ├── DetailsConverter.kt │ │ │ │ ├── DetailsInteractor.kt │ │ │ │ ├── DetailsPreferencesProvider.kt │ │ │ │ ├── DetailsPresenter.kt │ │ │ │ ├── DetailsResourceProvider.kt │ │ │ │ ├── DetailsView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ ├── controls │ │ │ │ │ │ ├── ControlsItem.kt │ │ │ │ │ │ ├── ControlsItemBlueprint.kt │ │ │ │ │ │ ├── ControlsItemPresenter.kt │ │ │ │ │ │ └── ControlsItemView.kt │ │ │ │ │ ├── description │ │ │ │ │ │ ├── DescriptionItem.kt │ │ │ │ │ │ ├── DescriptionItemBlueprint.kt │ │ │ │ │ │ ├── DescriptionItemPresenter.kt │ │ │ │ │ │ ├── DescriptionItemView.kt │ │ │ │ │ │ └── DescriptionResourceProvider.kt │ │ │ │ │ ├── discuss │ │ │ │ │ │ ├── DiscussItem.kt │ │ │ │ │ │ ├── DiscussItemBlueprint.kt │ │ │ │ │ │ ├── DiscussItemPresenter.kt │ │ │ │ │ │ └── DiscussItemView.kt │ │ │ │ │ ├── header │ │ │ │ │ │ ├── HeaderItem.kt │ │ │ │ │ │ ├── HeaderItemBlueprint.kt │ │ │ │ │ │ ├── HeaderItemPresenter.kt │ │ │ │ │ │ └── HeaderItemView.kt │ │ │ │ │ ├── permissions │ │ │ │ │ │ ├── PermissionsItem.kt │ │ │ │ │ │ ├── PermissionsItemBlueprint.kt │ │ │ │ │ │ ├── PermissionsItemPresenter.kt │ │ │ │ │ │ ├── PermissionsItemView.kt │ │ │ │ │ │ └── PermissionsResourceProvider.kt │ │ │ │ │ ├── play │ │ │ │ │ │ ├── PlayItem.kt │ │ │ │ │ │ ├── PlayItemBlueprint.kt │ │ │ │ │ │ ├── PlayItemPresenter.kt │ │ │ │ │ │ ├── PlayItemView.kt │ │ │ │ │ │ └── PlayResourceProvider.kt │ │ │ │ │ ├── rating │ │ │ │ │ │ ├── RatingItem.kt │ │ │ │ │ │ ├── RatingItemBlueprint.kt │ │ │ │ │ │ ├── RatingItemPresenter.kt │ │ │ │ │ │ └── RatingItemView.kt │ │ │ │ │ ├── scores │ │ │ │ │ │ ├── ScoresItem.kt │ │ │ │ │ │ ├── ScoresItemBlueprint.kt │ │ │ │ │ │ ├── ScoresItemPresenter.kt │ │ │ │ │ │ └── ScoresItemView.kt │ │ │ │ │ ├── screenshot │ │ │ │ │ │ ├── ScreenshotItem.kt │ │ │ │ │ │ ├── ScreenshotItemBlueprint.kt │ │ │ │ │ │ ├── ScreenshotItemPresenter.kt │ │ │ │ │ │ └── ScreenshotItemView.kt │ │ │ │ │ ├── screenshots │ │ │ │ │ │ ├── ScreenshotItemListener.kt │ │ │ │ │ │ ├── ScreenshotsItem.kt │ │ │ │ │ │ ├── ScreenshotsItemBlueprint.kt │ │ │ │ │ │ ├── ScreenshotsItemPresenter.kt │ │ │ │ │ │ └── ScreenshotsItemView.kt │ │ │ │ │ ├── status │ │ │ │ │ │ ├── StatusItem.kt │ │ │ │ │ │ ├── StatusItemBlueprint.kt │ │ │ │ │ │ ├── StatusItemPresenter.kt │ │ │ │ │ │ └── StatusItemView.kt │ │ │ │ │ ├── user_rate │ │ │ │ │ │ ├── UserRateItem.kt │ │ │ │ │ │ ├── UserRateItemBlueprint.kt │ │ │ │ │ │ ├── UserRateItemPresenter.kt │ │ │ │ │ │ └── UserRateItemView.kt │ │ │ │ │ ├── user_review │ │ │ │ │ │ ├── UserReviewItem.kt │ │ │ │ │ │ ├── UserReviewItemBlueprint.kt │ │ │ │ │ │ ├── UserReviewItemPresenter.kt │ │ │ │ │ │ └── UserReviewItemView.kt │ │ │ │ │ └── whats_new │ │ │ │ │ │ ├── WhatsNewItem.kt │ │ │ │ │ │ ├── WhatsNewItemBlueprint.kt │ │ │ │ │ │ ├── WhatsNewItemPresenter.kt │ │ │ │ │ │ └── WhatsNewItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── AppInfo.kt │ │ │ │ │ ├── AppVersion.kt │ │ │ │ │ ├── CreateTopicResponse.kt │ │ │ │ │ ├── DeletionResponse.kt │ │ │ │ │ ├── Details.kt │ │ │ │ │ ├── MarkFavoriteResponse.kt │ │ │ │ │ ├── Meta.kt │ │ │ │ │ ├── ModerationDecisionResponse.kt │ │ │ │ │ ├── RatingEntity.kt │ │ │ │ │ ├── Scores.kt │ │ │ │ │ └── TranslationResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── DetailsComponent.kt │ │ │ │ │ └── DetailsModule.kt │ │ │ ├── distro │ │ │ │ ├── ApkConverter.kt │ │ │ │ ├── DistroActivity.kt │ │ │ │ ├── DistroAppEntity.kt │ │ │ │ ├── DistroInfoProvider.kt │ │ │ │ ├── DistroInteractor.kt │ │ │ │ ├── DistroPreferencesProvider.kt │ │ │ │ ├── DistroPresenter.kt │ │ │ │ ├── DistroResourceProvider.kt │ │ │ │ ├── DistroView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── apk │ │ │ │ │ │ ├── ApkItem.kt │ │ │ │ │ │ ├── ApkItemBlueprint.kt │ │ │ │ │ │ ├── ApkItemPresenter.kt │ │ │ │ │ │ └── ApkItemView.kt │ │ │ │ └── di │ │ │ │ │ ├── DistroComponent.kt │ │ │ │ │ └── DistroModule.kt │ │ │ ├── downloads │ │ │ │ ├── AppConverter.kt │ │ │ │ ├── AppsResourceProvider.kt │ │ │ │ ├── DownloadsActivity.kt │ │ │ │ ├── DownloadsInteractor.kt │ │ │ │ ├── DownloadsPresenter.kt │ │ │ │ ├── DownloadsView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── app │ │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ │ ├── AppItemBlueprint.kt │ │ │ │ │ │ ├── AppItemPresenter.kt │ │ │ │ │ │ └── AppItemView.kt │ │ │ │ ├── api │ │ │ │ │ └── DownloadsResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── DownloadsComponent.kt │ │ │ │ │ └── DownloadsModule.kt │ │ │ ├── favorite │ │ │ │ ├── AppConverter.kt │ │ │ │ ├── AppsResourceProvider.kt │ │ │ │ ├── FavoriteActivity.kt │ │ │ │ ├── FavoriteInteractor.kt │ │ │ │ ├── FavoritePresenter.kt │ │ │ │ ├── FavoriteView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── app │ │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ │ ├── AppItemBlueprint.kt │ │ │ │ │ │ ├── AppItemPresenter.kt │ │ │ │ │ │ └── AppItemView.kt │ │ │ │ ├── api │ │ │ │ │ └── FavoriteResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── FavoriteComponent.kt │ │ │ │ │ └── FavoriteModule.kt │ │ │ ├── feed │ │ │ │ ├── FeedActivity.kt │ │ │ │ ├── FeedConverter.kt │ │ │ │ ├── FeedFragment.kt │ │ │ │ ├── FeedInteractor.kt │ │ │ │ ├── FeedPreferencesProvider.kt │ │ │ │ ├── FeedPresenter.kt │ │ │ │ ├── FeedResourceProvider.kt │ │ │ │ ├── FeedView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── FeedItem.kt │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ ├── ScreenshotsAdapter.kt │ │ │ │ │ ├── favorite │ │ │ │ │ │ ├── FavoriteItem.kt │ │ │ │ │ │ ├── FavoriteItemBlueprint.kt │ │ │ │ │ │ ├── FavoriteItemPresenter.kt │ │ │ │ │ │ └── FavoriteItemView.kt │ │ │ │ │ ├── subscribe │ │ │ │ │ │ ├── SubscribeItem.kt │ │ │ │ │ │ ├── SubscribeItemBlueprint.kt │ │ │ │ │ │ ├── SubscribeItemPresenter.kt │ │ │ │ │ │ └── SubscribeItemView.kt │ │ │ │ │ ├── text │ │ │ │ │ │ ├── TextItem.kt │ │ │ │ │ │ ├── TextItemBlueprint.kt │ │ │ │ │ │ ├── TextItemPresenter.kt │ │ │ │ │ │ └── TextItemView.kt │ │ │ │ │ ├── unauthorized │ │ │ │ │ │ ├── UnauthorizedItem.kt │ │ │ │ │ │ ├── UnauthorizedItemBlueprint.kt │ │ │ │ │ │ ├── UnauthorizedItemPresenter.kt │ │ │ │ │ │ └── UnauthorizedItemView.kt │ │ │ │ │ └── upload │ │ │ │ │ │ ├── UploadItem.kt │ │ │ │ │ │ ├── UploadItemBlueprint.kt │ │ │ │ │ │ ├── UploadItemPresenter.kt │ │ │ │ │ │ └── UploadItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── DeletePostResponse.kt │ │ │ │ │ ├── FavoritePayload.kt │ │ │ │ │ ├── FeedResponse.kt │ │ │ │ │ ├── PostDeserializer.kt │ │ │ │ │ ├── PostEntity.kt │ │ │ │ │ ├── PostPayload.kt │ │ │ │ │ ├── ReadResponse.kt │ │ │ │ │ ├── SubscribePayload.kt │ │ │ │ │ ├── TextPayload.kt │ │ │ │ │ ├── UnsupportedPayload.kt │ │ │ │ │ └── UploadPayload.kt │ │ │ │ └── di │ │ │ │ │ ├── FeedComponent.kt │ │ │ │ │ └── FeedModule.kt │ │ │ ├── gallery │ │ │ │ ├── GalleryActivity.kt │ │ │ │ ├── GalleryInteractor.kt │ │ │ │ ├── GalleryItem.kt │ │ │ │ ├── GalleryPresenter.kt │ │ │ │ ├── GalleryResourceProvider.kt │ │ │ │ ├── GalleryView.kt │ │ │ │ ├── StreamsProvider.kt │ │ │ │ ├── adapter │ │ │ │ │ └── image │ │ │ │ │ │ ├── ImageItem.kt │ │ │ │ │ │ ├── ImageItemBlueprint.kt │ │ │ │ │ │ ├── ImageItemPresenter.kt │ │ │ │ │ │ └── ImageItemView.kt │ │ │ │ └── di │ │ │ │ │ ├── GalleryComponent.kt │ │ │ │ │ └── GalleryModule.kt │ │ │ ├── home │ │ │ │ ├── HomeActivity.kt │ │ │ │ ├── HomeFragment.kt │ │ │ │ ├── HomeInteractor.kt │ │ │ │ ├── HomePresenter.kt │ │ │ │ ├── HomeView.kt │ │ │ │ ├── api │ │ │ │ │ ├── ModerationData.kt │ │ │ │ │ ├── StartupResponse.kt │ │ │ │ │ └── StatusResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── HomeComponent.kt │ │ │ │ │ └── HomeModule.kt │ │ │ ├── installed │ │ │ │ ├── AppConverter.kt │ │ │ │ ├── AppsResourceProvider.kt │ │ │ │ ├── InstalledActivity.kt │ │ │ │ ├── InstalledAppEntity.kt │ │ │ │ ├── InstalledInfoProvider.kt │ │ │ │ ├── InstalledInteractor.kt │ │ │ │ ├── InstalledPreferencesProvider.kt │ │ │ │ ├── InstalledPresenter.kt │ │ │ │ ├── InstalledView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── app │ │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ │ ├── AppItemBlueprint.kt │ │ │ │ │ │ ├── AppItemPresenter.kt │ │ │ │ │ │ └── AppItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── CheckUpdatesRequest.kt │ │ │ │ │ ├── CheckUpdatesResponse.kt │ │ │ │ │ └── UpdateEntity.kt │ │ │ │ └── di │ │ │ │ │ ├── InstalledComponent.kt │ │ │ │ │ └── InstalledModule.kt │ │ │ ├── moderation │ │ │ │ ├── AppConverter.kt │ │ │ │ ├── AppsResourceProvider.kt │ │ │ │ ├── ModerationActivity.kt │ │ │ │ ├── ModerationInteractor.kt │ │ │ │ ├── ModerationPresenter.kt │ │ │ │ ├── ModerationView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── app │ │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ │ ├── AppItemBlueprint.kt │ │ │ │ │ │ ├── AppItemPresenter.kt │ │ │ │ │ │ └── AppItemView.kt │ │ │ │ ├── api │ │ │ │ │ └── ModerationResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── ModerationComponent.kt │ │ │ │ │ └── ModerationModule.kt │ │ │ ├── permissions │ │ │ │ ├── PermissionInfoProvider.kt │ │ │ │ ├── PermissionsActivity.kt │ │ │ │ ├── PermissionsConverter.kt │ │ │ │ ├── PermissionsPresenter.kt │ │ │ │ ├── PermissionsResourceProvider.kt │ │ │ │ ├── PermissionsView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── safe │ │ │ │ │ │ ├── SafePermissionItem.kt │ │ │ │ │ │ ├── SafePermissionItemBlueprint.kt │ │ │ │ │ │ ├── SafePermissionItemPresenter.kt │ │ │ │ │ │ └── SafePermissionItemView.kt │ │ │ │ │ └── unsafe │ │ │ │ │ │ ├── UnsafePermissionItem.kt │ │ │ │ │ │ ├── UnsafePermissionItemBlueprint.kt │ │ │ │ │ │ ├── UnsafePermissionItemPresenter.kt │ │ │ │ │ │ └── UnsafePermissionItemView.kt │ │ │ │ └── di │ │ │ │ │ ├── PermissionsComponent.kt │ │ │ │ │ └── PermissionsModule.kt │ │ │ ├── post │ │ │ │ ├── ImageCompressor.kt │ │ │ │ ├── PostActivity.kt │ │ │ │ ├── PostConverter.kt │ │ │ │ ├── PostInteractor.kt │ │ │ │ ├── PostPreferencesProvider.kt │ │ │ │ ├── PostPresenter.kt │ │ │ │ ├── PostView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ ├── append │ │ │ │ │ │ ├── AppendItem.kt │ │ │ │ │ │ ├── AppendItemBlueprint.kt │ │ │ │ │ │ ├── AppendItemPresenter.kt │ │ │ │ │ │ └── AppendItemView.kt │ │ │ │ │ ├── image │ │ │ │ │ │ ├── ImageItem.kt │ │ │ │ │ │ ├── ImageItemBlueprint.kt │ │ │ │ │ │ ├── ImageItemPresenter.kt │ │ │ │ │ │ └── ImageItemView.kt │ │ │ │ │ ├── ribbon │ │ │ │ │ │ ├── RibbonItem.kt │ │ │ │ │ │ ├── RibbonItemBlueprint.kt │ │ │ │ │ │ ├── RibbonItemPresenter.kt │ │ │ │ │ │ └── RibbonItemView.kt │ │ │ │ │ ├── submit │ │ │ │ │ │ ├── SubmitItem.kt │ │ │ │ │ │ ├── SubmitItemBlueprint.kt │ │ │ │ │ │ ├── SubmitItemPresenter.kt │ │ │ │ │ │ └── SubmitItemView.kt │ │ │ │ │ └── text │ │ │ │ │ │ ├── TextItem.kt │ │ │ │ │ │ ├── TextItemBlueprint.kt │ │ │ │ │ │ ├── TextItemPresenter.kt │ │ │ │ │ │ └── TextItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── FeedConfigResponse.kt │ │ │ │ │ └── FeedPostResponse.kt │ │ │ │ ├── di │ │ │ │ │ ├── PostComponent.kt │ │ │ │ │ └── PostModule.kt │ │ │ │ └── dto │ │ │ │ │ ├── FeedConfig.kt │ │ │ │ │ └── PostImage.kt │ │ │ ├── profile │ │ │ │ ├── ProfileActivity.kt │ │ │ │ ├── ProfileConverter.kt │ │ │ │ ├── ProfileFragment.kt │ │ │ │ ├── ProfileInteractor.kt │ │ │ │ ├── ProfilePresenter.kt │ │ │ │ ├── ProfileView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ ├── app │ │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ │ ├── AppItemBlueprint.kt │ │ │ │ │ │ ├── AppItemPresenter.kt │ │ │ │ │ │ └── AppItemView.kt │ │ │ │ │ ├── downloads │ │ │ │ │ │ ├── DownloadsItem.kt │ │ │ │ │ │ ├── DownloadsItemBlueprint.kt │ │ │ │ │ │ ├── DownloadsItemPresenter.kt │ │ │ │ │ │ └── DownloadsItemView.kt │ │ │ │ │ ├── favorites │ │ │ │ │ │ ├── FavoritesItem.kt │ │ │ │ │ │ ├── FavoritesItemBlueprint.kt │ │ │ │ │ │ ├── FavoritesItemPresenter.kt │ │ │ │ │ │ └── FavoritesItemView.kt │ │ │ │ │ ├── feed │ │ │ │ │ │ ├── FeedItem.kt │ │ │ │ │ │ ├── FeedItemBlueprint.kt │ │ │ │ │ │ ├── FeedItemPresenter.kt │ │ │ │ │ │ └── FeedItemView.kt │ │ │ │ │ ├── header │ │ │ │ │ │ ├── HeaderItem.kt │ │ │ │ │ │ ├── HeaderItemBlueprint.kt │ │ │ │ │ │ ├── HeaderItemPresenter.kt │ │ │ │ │ │ ├── HeaderItemView.kt │ │ │ │ │ │ └── HeaderResourceProvider.kt │ │ │ │ │ ├── placeholder │ │ │ │ │ │ ├── PlaceholderItem.kt │ │ │ │ │ │ ├── PlaceholderItemBlueprint.kt │ │ │ │ │ │ ├── PlaceholderItemPresenter.kt │ │ │ │ │ │ └── PlaceholderItemView.kt │ │ │ │ │ ├── review │ │ │ │ │ │ ├── ReviewItem.kt │ │ │ │ │ │ ├── ReviewItemBlueprint.kt │ │ │ │ │ │ ├── ReviewItemPresenter.kt │ │ │ │ │ │ └── ReviewItemView.kt │ │ │ │ │ ├── reviews │ │ │ │ │ │ ├── ReviewItemListener.kt │ │ │ │ │ │ ├── ReviewsItem.kt │ │ │ │ │ │ ├── ReviewsItemBlueprint.kt │ │ │ │ │ │ ├── ReviewsItemPresenter.kt │ │ │ │ │ │ └── ReviewsItemView.kt │ │ │ │ │ ├── unauthorized │ │ │ │ │ │ ├── UnauthorizedItem.kt │ │ │ │ │ │ ├── UnauthorizedItemBlueprint.kt │ │ │ │ │ │ ├── UnauthorizedItemPresenter.kt │ │ │ │ │ │ └── UnauthorizedItemView.kt │ │ │ │ │ └── uploads │ │ │ │ │ │ ├── AppItemListener.kt │ │ │ │ │ │ ├── UploadsItem.kt │ │ │ │ │ │ ├── UploadsItemBlueprint.kt │ │ │ │ │ │ ├── UploadsItemPresenter.kt │ │ │ │ │ │ └── UploadsItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── EliminateUserResponse.kt │ │ │ │ │ ├── Profile.kt │ │ │ │ │ ├── ProfileResponse.kt │ │ │ │ │ ├── SetUserNameResponse.kt │ │ │ │ │ ├── SubscribeResponse.kt │ │ │ │ │ ├── UnsubscribeResponse.kt │ │ │ │ │ └── UserAppsResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── ProfileComponent.kt │ │ │ │ │ └── ProfileModule.kt │ │ │ ├── rate │ │ │ │ ├── RateActivity.kt │ │ │ │ ├── RateInteractor.kt │ │ │ │ ├── RatePresenter.kt │ │ │ │ ├── RateView.kt │ │ │ │ ├── api │ │ │ │ │ └── SubmitReviewResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── RateComponent.kt │ │ │ │ │ └── RateModule.kt │ │ │ ├── ratings │ │ │ │ ├── RatingConverter.kt │ │ │ │ ├── RatingsActivity.kt │ │ │ │ ├── RatingsInteractor.kt │ │ │ │ ├── RatingsPreferencesProvider.kt │ │ │ │ ├── RatingsPresenter.kt │ │ │ │ ├── RatingsView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── rating │ │ │ │ │ │ ├── RatingItem.kt │ │ │ │ │ │ ├── RatingItemBlueprint.kt │ │ │ │ │ │ ├── RatingItemPresenter.kt │ │ │ │ │ │ └── RatingItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── DeleteRatingResponse.kt │ │ │ │ │ └── RatingsResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── RatingsComponent.kt │ │ │ │ │ └── RatingsModule.kt │ │ │ ├── reviews │ │ │ │ ├── ReviewConverter.kt │ │ │ │ ├── ReviewsActivity.kt │ │ │ │ ├── ReviewsInteractor.kt │ │ │ │ ├── ReviewsPreferencesProvider.kt │ │ │ │ ├── ReviewsPresenter.kt │ │ │ │ ├── ReviewsView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── review │ │ │ │ │ │ ├── ReviewItem.kt │ │ │ │ │ │ ├── ReviewItemBlueprint.kt │ │ │ │ │ │ ├── ReviewItemPresenter.kt │ │ │ │ │ │ └── ReviewItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── ReviewEntity.kt │ │ │ │ │ └── ReviewsResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── ReviewsComponent.kt │ │ │ │ │ └── ReviewsModule.kt │ │ │ ├── store │ │ │ │ ├── AppConverter.kt │ │ │ │ ├── AppsResourceProvider.kt │ │ │ │ ├── StoreFragment.kt │ │ │ │ ├── StoreInteractor.kt │ │ │ │ ├── StorePreferencesProvider.kt │ │ │ │ ├── StorePresenter.kt │ │ │ │ ├── StoreView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── app │ │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ │ ├── AppItemBlueprint.kt │ │ │ │ │ │ ├── AppItemPresenter.kt │ │ │ │ │ │ └── AppItemView.kt │ │ │ │ ├── api │ │ │ │ │ └── AppsListResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── StoreComponent.kt │ │ │ │ │ └── StoreModule.kt │ │ │ ├── subscriptions │ │ │ │ ├── SubscriptionsActivity.kt │ │ │ │ ├── SubscriptionsAdapter.kt │ │ │ │ ├── SubscriptionsPresenter.kt │ │ │ │ ├── SubscriptionsView.kt │ │ │ │ └── di │ │ │ │ │ ├── SubscriptionsComponent.kt │ │ │ │ │ └── SubscriptionsModule.kt │ │ │ ├── topics │ │ │ │ ├── TopicConverter.kt │ │ │ │ ├── TopicsFragment.kt │ │ │ │ ├── TopicsInteractor.kt │ │ │ │ ├── TopicsPreferencesProvider.kt │ │ │ │ ├── TopicsPresenter.kt │ │ │ │ ├── TopicsResourceProvider.kt │ │ │ │ ├── TopicsView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ └── topic │ │ │ │ │ │ ├── TopicItem.kt │ │ │ │ │ │ ├── TopicItemBlueprint.kt │ │ │ │ │ │ ├── TopicItemPresenter.kt │ │ │ │ │ │ └── TopicItemView.kt │ │ │ │ ├── api │ │ │ │ │ ├── PinTopicResponse.kt │ │ │ │ │ └── TopicsResponse.kt │ │ │ │ └── di │ │ │ │ │ ├── TopicsComponent.kt │ │ │ │ │ └── TopicsModule.kt │ │ │ ├── upload │ │ │ │ ├── UploadActivity.kt │ │ │ │ ├── UploadConverter.kt │ │ │ │ ├── UploadInteractor.kt │ │ │ │ ├── UploadPreferencesProvider.kt │ │ │ │ ├── UploadPresenter.kt │ │ │ │ ├── UploadResourceProvider.kt │ │ │ │ ├── UploadView.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── ItemListener.kt │ │ │ │ │ ├── category │ │ │ │ │ │ ├── SelectCategoryItem.kt │ │ │ │ │ │ ├── SelectCategoryItemBlueprint.kt │ │ │ │ │ │ ├── SelectCategoryItemPresenter.kt │ │ │ │ │ │ └── SelectCategoryItemView.kt │ │ │ │ │ ├── description │ │ │ │ │ │ ├── DescriptionItem.kt │ │ │ │ │ │ ├── DescriptionItemBlueprint.kt │ │ │ │ │ │ ├── DescriptionItemPresenter.kt │ │ │ │ │ │ └── DescriptionItemView.kt │ │ │ │ │ ├── exclusive │ │ │ │ │ │ ├── ExclusiveItem.kt │ │ │ │ │ │ ├── ExclusiveItemBlueprint.kt │ │ │ │ │ │ ├── ExclusiveItemPresenter.kt │ │ │ │ │ │ └── ExclusiveItemView.kt │ │ │ │ │ ├── notice │ │ │ │ │ │ ├── NoticeItem.kt │ │ │ │ │ │ ├── NoticeItemBlueprint.kt │ │ │ │ │ │ ├── NoticeItemPresenter.kt │ │ │ │ │ │ └── NoticeItemView.kt │ │ │ │ │ ├── open_source │ │ │ │ │ │ ├── OpenSourceItem.kt │ │ │ │ │ │ ├── OpenSourceItemBlueprint.kt │ │ │ │ │ │ ├── OpenSourceItemPresenter.kt │ │ │ │ │ │ └── OpenSourceItemView.kt │ │ │ │ │ ├── other_versions │ │ │ │ │ │ ├── OtherVersionsItem.kt │ │ │ │ │ │ ├── OtherVersionsItemBlueprint.kt │ │ │ │ │ │ ├── OtherVersionsItemPresenter.kt │ │ │ │ │ │ └── OtherVersionsItemView.kt │ │ │ │ │ ├── screen_append │ │ │ │ │ │ ├── ScreenAppendItem.kt │ │ │ │ │ │ ├── ScreenAppendItemBlueprint.kt │ │ │ │ │ │ ├── ScreenAppendItemPresenter.kt │ │ │ │ │ │ └── ScreenAppendItemView.kt │ │ │ │ │ ├── screen_image │ │ │ │ │ │ ├── ScreenImageItem.kt │ │ │ │ │ │ ├── ScreenImageItemBlueprint.kt │ │ │ │ │ │ ├── ScreenImageItemPresenter.kt │ │ │ │ │ │ └── ScreenImageItemView.kt │ │ │ │ │ ├── screenshots │ │ │ │ │ │ ├── ScreenshotsItem.kt │ │ │ │ │ │ ├── ScreenshotsItemBlueprint.kt │ │ │ │ │ │ ├── ScreenshotsItemPresenter.kt │ │ │ │ │ │ └── ScreenshotsItemView.kt │ │ │ │ │ ├── select_app │ │ │ │ │ │ ├── SelectAppItem.kt │ │ │ │ │ │ ├── SelectAppItemBlueprint.kt │ │ │ │ │ │ ├── SelectAppItemPresenter.kt │ │ │ │ │ │ └── SelectAppItemView.kt │ │ │ │ │ ├── selected_app │ │ │ │ │ │ ├── SelectedAppItem.kt │ │ │ │ │ │ ├── SelectedAppItemBlueprint.kt │ │ │ │ │ │ ├── SelectedAppItemPresenter.kt │ │ │ │ │ │ ├── SelectedAppItemView.kt │ │ │ │ │ │ └── SelectedAppResourceProvider.kt │ │ │ │ │ ├── submit │ │ │ │ │ │ ├── SubmitItem.kt │ │ │ │ │ │ ├── SubmitItemBlueprint.kt │ │ │ │ │ │ ├── SubmitItemPresenter.kt │ │ │ │ │ │ └── SubmitItemView.kt │ │ │ │ │ └── whats_new │ │ │ │ │ │ ├── WhatsNewItem.kt │ │ │ │ │ │ ├── WhatsNewItemBlueprint.kt │ │ │ │ │ │ ├── WhatsNewItemPresenter.kt │ │ │ │ │ │ └── WhatsNewItemView.kt │ │ │ │ ├── api │ │ │ │ │ └── CheckExistResponse.kt │ │ │ │ ├── di │ │ │ │ │ ├── UploadComponent.kt │ │ │ │ │ └── UploadModule.kt │ │ │ │ └── dto │ │ │ │ │ └── UploadScreenshot.kt │ │ │ └── users │ │ │ │ ├── UserConverter.kt │ │ │ │ ├── UsersFragment.kt │ │ │ │ ├── UsersInteractor.kt │ │ │ │ ├── UsersPresenter.kt │ │ │ │ ├── UsersView.kt │ │ │ │ ├── adapter │ │ │ │ ├── ItemListener.kt │ │ │ │ ├── UserItem.kt │ │ │ │ ├── UsersResourceProvider.kt │ │ │ │ ├── publisher │ │ │ │ │ ├── PublisherItem.kt │ │ │ │ │ ├── PublisherItemBlueprint.kt │ │ │ │ │ ├── PublisherItemPresenter.kt │ │ │ │ │ └── PublisherItemView.kt │ │ │ │ └── subscriber │ │ │ │ │ ├── SubscriberItem.kt │ │ │ │ │ ├── SubscriberItemBlueprint.kt │ │ │ │ │ ├── SubscriberItemPresenter.kt │ │ │ │ │ └── SubscriberItemView.kt │ │ │ │ ├── api │ │ │ │ ├── PublisherEntity.kt │ │ │ │ ├── PublishersResponse.kt │ │ │ │ ├── SubscriberEntity.kt │ │ │ │ ├── SubscribersResponse.kt │ │ │ │ └── UserEntity.kt │ │ │ │ └── di │ │ │ │ ├── SubscribersComponent.kt │ │ │ │ └── SubscribersModule.kt │ │ │ ├── upload │ │ │ ├── SetMetaResponse.kt │ │ │ ├── UploadInfo.kt │ │ │ ├── UploadManager.kt │ │ │ ├── UploadNotifications.kt │ │ │ ├── UploadPackage.kt │ │ │ ├── UploadResponse.kt │ │ │ ├── UploadScreenshotsResponse.kt │ │ │ ├── UploadService.kt │ │ │ ├── UploadState.kt │ │ │ └── di │ │ │ │ ├── UploadServiceComponent.kt │ │ │ │ └── UploadServiceModule.kt │ │ │ ├── user │ │ │ ├── SessionCredentials.kt │ │ │ ├── SessionStorage.kt │ │ │ └── api │ │ │ │ ├── UserBrief.kt │ │ │ │ └── UserProfile.kt │ │ │ ├── util │ │ │ ├── Analytics.kt │ │ │ ├── ApkIconLoader.kt │ │ │ ├── AppIconLoader.kt │ │ │ ├── Arrays.kt │ │ │ ├── Bitmaps.kt │ │ │ ├── BubbleColorDrawable.kt │ │ │ ├── Collections.kt │ │ │ ├── Colors.kt │ │ │ ├── Debouncer.java │ │ │ ├── Drawables.kt │ │ │ ├── Exceptions.kt │ │ │ ├── FileHelper.java │ │ │ ├── Intents.kt │ │ │ ├── Logger.kt │ │ │ ├── Metrics.kt │ │ │ ├── MultipartStream.kt │ │ │ ├── NotificationIconHolder.kt │ │ │ ├── PackageHelper.java │ │ │ ├── PackageInfos.kt │ │ │ ├── PackageObserver.kt │ │ │ ├── Parcelables.kt │ │ │ ├── Parcels.kt │ │ │ ├── PerActivity.java │ │ │ ├── PerFragment.java │ │ │ ├── PerService.java │ │ │ ├── Pictures.kt │ │ │ ├── SchedulersFactory.java │ │ │ ├── Streams.kt │ │ │ ├── Strings.kt │ │ │ ├── Themes.kt │ │ │ ├── Unobfuscatable.java │ │ │ ├── Views.kt │ │ │ ├── ZipParcelable.kt │ │ │ └── states │ │ │ │ ├── State.java │ │ │ │ └── StateHolder.java │ │ │ └── view │ │ │ ├── UserIconView.kt │ │ │ └── ZoomImageView.kt │ └── res │ │ ├── color │ │ ├── green_text_btn_ripple_color.xml │ │ └── red_text_btn_ripple_color.xml │ │ ├── drawable-hdpi │ │ ├── ic_star_black_18dp.png │ │ └── ic_star_grey600_18dp.png │ │ ├── drawable-nodpi │ │ └── app_placeholder.png │ │ ├── drawable-xhdpi │ │ ├── ic_star_black_18dp.png │ │ └── ic_star_grey600_18dp.png │ │ ├── drawable-xxhdpi │ │ ├── discuss_background_dark.png │ │ ├── discuss_background_light.png │ │ ├── ic_star_black_18dp.png │ │ └── ic_star_grey600_18dp.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_star_black_18dp.png │ │ └── ic_star_grey600_18dp.png │ │ ├── drawable │ │ ├── account.xml │ │ ├── append_image_back.xml │ │ ├── append_image_ripple.xml │ │ ├── chat.xml │ │ ├── check_all.xml │ │ ├── check_circle.xml │ │ ├── clock.xml │ │ ├── cloud.xml │ │ ├── compose_background_dark.xml │ │ ├── compose_background_light.xml │ │ ├── compose_gradient_dark.xml │ │ ├── compose_gradient_light.xml │ │ ├── discuss.xml │ │ ├── discuss_back_dark_repeat.xml │ │ ├── discuss_back_light_repeat.xml │ │ ├── edit_text_border.xml │ │ ├── feed.xml │ │ ├── ic_account.xml │ │ ├── ic_account_circle.xml │ │ ├── ic_account_circle_outline.xml │ │ ├── ic_account_minus.xml │ │ ├── ic_account_plus.xml │ │ ├── ic_alert.xml │ │ ├── ic_alert_circle.xml │ │ ├── ic_apps.xml │ │ ├── ic_archive_outline.xml │ │ ├── ic_arrow_back.xml │ │ ├── ic_arrow_forward.xml │ │ ├── ic_baseline_add_24.xml │ │ ├── ic_block.xml │ │ ├── ic_bluetooth.xml │ │ ├── ic_category.xml │ │ ├── ic_close.xml │ │ ├── ic_cloud.xml │ │ ├── ic_cloud_outline.xml │ │ ├── ic_cloud_upload.xml │ │ ├── ic_content_copy.xml │ │ ├── ic_creation.xml │ │ ├── ic_crown.xml │ │ ├── ic_delete.xml │ │ ├── ic_delete_forever.xml │ │ ├── ic_discuss.xml │ │ ├── ic_discuss_outline.xml │ │ ├── ic_dots_vertical.xml │ │ ├── ic_download.xml │ │ ├── ic_download_box_outline.xml │ │ ├── ic_download_circle.xml │ │ ├── ic_download_smooth.xml │ │ ├── ic_edit.xml │ │ ├── ic_email.xml │ │ ├── ic_error.xml │ │ ├── ic_favorite.xml │ │ ├── ic_favorite_outline.xml │ │ ├── ic_floppy.xml │ │ ├── ic_google_play.xml │ │ ├── ic_image_plus.xml │ │ ├── ic_inbox_full.xml │ │ ├── ic_inbox_full_outline.xml │ │ ├── ic_info.xml │ │ ├── ic_install.xml │ │ ├── ic_internet.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── ic_location.xml │ │ ├── ic_lock_open.xml │ │ ├── ic_moderators.xml │ │ ├── ic_new.xml │ │ ├── ic_new_box.xml │ │ ├── ic_open_source.xml │ │ ├── ic_pencil.xml │ │ ├── ic_permissions.xml │ │ ├── ic_phone.xml │ │ ├── ic_pill.xml │ │ ├── ic_pill_fail.xml │ │ ├── ic_pill_ok.xml │ │ ├── ic_pin.xml │ │ ├── ic_pin_off.xml │ │ ├── ic_reply.xml │ │ ├── ic_rocket.xml │ │ ├── ic_run.xml │ │ ├── ic_search.xml │ │ ├── ic_send.xml │ │ ├── ic_settings.xml │ │ ├── ic_share.xml │ │ ├── ic_share_variant.xml │ │ ├── ic_shortcut_apps.xml │ │ ├── ic_shortcut_discuss.xml │ │ ├── ic_shortcut_install.xml │ │ ├── ic_shortcut_store.xml │ │ ├── ic_sms.xml │ │ ├── ic_star_14.xml │ │ ├── ic_star_smooth.xml │ │ ├── ic_storage.xml │ │ ├── ic_store.xml │ │ ├── ic_topic_common_qna.xml │ │ ├── ic_translate.xml │ │ ├── ic_translate_off.xml │ │ ├── ic_user_messages.xml │ │ ├── ic_warning.xml │ │ ├── login.xml │ │ ├── newspaper.xml │ │ ├── no_content.xml │ │ ├── numeric.xml │ │ ├── online_indicator.xml │ │ ├── outline_feed_block.xml │ │ ├── outline_feed_ripple.xml │ │ ├── radial_gradient.xml │ │ ├── rating_bar_small.xml │ │ ├── rating_detail_element.xml │ │ ├── round_grey_back.xml │ │ ├── round_grey_ripple.xml │ │ ├── round_name_back.xml │ │ ├── round_name_ripple.xml │ │ ├── round_white_back.xml │ │ ├── round_white_ripple.xml │ │ ├── rounded_transparent_back.xml │ │ ├── rounded_transparent_ripple.xml │ │ ├── rounded_white_back.xml │ │ ├── rounded_white_ripple.xml │ │ ├── service_background_dark.xml │ │ ├── service_background_light.xml │ │ ├── shadow.xml │ │ ├── shadow_inverted.xml │ │ ├── unread_badge.xml │ │ └── user_icon_back.xml │ │ ├── layout │ │ ├── about_activity.xml │ │ ├── abuse_activity.xml │ │ ├── activity_search.xml │ │ ├── agreement_activity.xml │ │ ├── apk_item.xml │ │ ├── chat_activity.xml │ │ ├── chat_item_date.xml │ │ ├── chat_item_inc_text.xml │ │ ├── chat_item_out_text.xml │ │ ├── details_activity.xml │ │ ├── details_block_controls.xml │ │ ├── details_block_description.xml │ │ ├── details_block_discuss.xml │ │ ├── details_block_header.xml │ │ ├── details_block_permissions.xml │ │ ├── details_block_play.xml │ │ ├── details_block_rating.xml │ │ ├── details_block_review.xml │ │ ├── details_block_scores.xml │ │ ├── details_block_screenshot_item.xml │ │ ├── details_block_screenshots.xml │ │ ├── details_block_status.xml │ │ ├── details_block_user_rate.xml │ │ ├── details_block_whats_new.xml │ │ ├── details_play_item_divider.xml │ │ ├── distro_activity.xml │ │ ├── distro_item.xml │ │ ├── downloads_activity.xml │ │ ├── empty_view.xml │ │ ├── error_view.xml │ │ ├── favorite_activity.xml │ │ ├── feed_activity.xml │ │ ├── feed_block_unauthorized.xml │ │ ├── feed_fragment.xml │ │ ├── feed_item_favorite.xml │ │ ├── feed_item_subscribe.xml │ │ ├── feed_item_text.xml │ │ ├── feed_item_upload.xml │ │ ├── feed_screenshot_item.xml │ │ ├── gallery_activity.xml │ │ ├── gallery_image_item.xml │ │ ├── home_activity.xml │ │ ├── icon_toolbar.xml │ │ ├── installed_activity.xml │ │ ├── installed_item.xml │ │ ├── local_apps.xml │ │ ├── local_apps_fragment.xml │ │ ├── moderation_activity.xml │ │ ├── permission_safe.xml │ │ ├── permission_unsafe.xml │ │ ├── permissions_activity.xml │ │ ├── post_activity.xml │ │ ├── post_block_append_item.xml │ │ ├── post_block_image_item.xml │ │ ├── post_block_ribbon.xml │ │ ├── post_block_submit.xml │ │ ├── post_block_text.xml │ │ ├── profile_activity.xml │ │ ├── profile_app_item.xml │ │ ├── profile_block_downloads.xml │ │ ├── profile_block_favorites.xml │ │ ├── profile_block_feed.xml │ │ ├── profile_block_header.xml │ │ ├── profile_block_placeholder.xml │ │ ├── profile_block_ratings.xml │ │ ├── profile_block_unauthorized.xml │ │ ├── profile_block_uploads.xml │ │ ├── profile_edit_name_dialog.xml │ │ ├── profile_fragment.xml │ │ ├── profile_review_item.xml │ │ ├── progress_overlay.xml │ │ ├── progress_view.xml │ │ ├── publisher_item.xml │ │ ├── rate_activity.xml │ │ ├── rating_item.xml │ │ ├── ratings_activity.xml │ │ ├── request_code_activity.xml │ │ ├── review_item.xml │ │ ├── reviews_activity.xml │ │ ├── search_fragment.xml │ │ ├── settings_activity.xml │ │ ├── store_fragment.xml │ │ ├── store_item.xml │ │ ├── subscriber_item.xml │ │ ├── subscribers_fragment.xml │ │ ├── subscriptions_activity.xml │ │ ├── tabs_toolbar.xml │ │ ├── time_delivery_out_block.xml │ │ ├── time_inc_block.xml │ │ ├── toolbar.xml │ │ ├── topic_item.xml │ │ ├── topics_fragment.xml │ │ ├── unlink_activity.xml │ │ ├── update_block.xml │ │ ├── upload_activity.xml │ │ ├── upload_block_description.xml │ │ ├── upload_block_exclusive.xml │ │ ├── upload_block_notice.xml │ │ ├── upload_block_open_source.xml │ │ ├── upload_block_other_versions.xml │ │ ├── upload_block_screenshot_append_item.xml │ │ ├── upload_block_screenshot_image_item.xml │ │ ├── upload_block_screenshots.xml │ │ ├── upload_block_select_app.xml │ │ ├── upload_block_select_category.xml │ │ ├── upload_block_selected_app.xml │ │ ├── upload_block_submit.xml │ │ ├── upload_block_whats_new.xml │ │ ├── upload_progress.xml │ │ ├── uploader.xml │ │ ├── uploads_fragment.xml │ │ ├── user_files_activity.xml │ │ ├── user_icon_l.xml │ │ ├── user_icon_m.xml │ │ ├── user_icon_s.xml │ │ ├── user_icon_xl.xml │ │ ├── user_icon_xs.xml │ │ └── verify_code_activity.xml │ │ ├── menu │ │ ├── abuse_menu.xml │ │ ├── bottom_navigation_menu.xml │ │ ├── chat_menu.xml │ │ ├── details_menu.xml │ │ ├── distro_app_menu.xml │ │ ├── distro_menu.xml │ │ ├── gallery_menu.xml │ │ ├── home_menu.xml │ │ ├── installed_app_menu.xml │ │ ├── installed_menu.xml │ │ ├── profile_menu.xml │ │ ├── rating_menu.xml │ │ ├── review_menu.xml │ │ ├── store_menu.xml │ │ ├── unlink_menu.xml │ │ └── user_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-fa │ │ └── strings.xml │ │ ├── values-hi │ │ └── strings.xml │ │ ├── values-ku │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-vi │ │ └── strings.xml │ │ ├── values-zh │ │ └── strings.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── attr.xml │ │ ├── defaults.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── pref_keys.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── values.xml │ │ ├── xml-v25 │ │ └── shortcuts.xml │ │ └── xml │ │ ├── backup_descriptor.xml │ │ ├── preferences.xml │ │ └── provider_paths.xml │ └── test │ └── kotlin │ └── com │ └── tomclaw │ └── appsend │ └── test │ ├── MergeStringsTest.kt │ └── TotalPercentTest.kt ├── art ├── app.jpg ├── chat.jpg ├── main.jpg ├── profile.jpg ├── topics.jpg └── upload.jpg ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── graphics ├── App Shortcut icons.sketch ├── appsend.sketch ├── appteka-logo.sketch ├── doodle.sketch └── web_hi_res_512.png ├── import-summary.txt ├── preference-fragment ├── LICENSE ├── README.md ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── github │ │ └── machinarius │ │ └── preferencefragment │ │ ├── PreferenceFragment.java │ │ └── PreferenceManagerCompat.java │ └── res │ ├── layout │ └── preference_list_fragment.xml │ └── values │ ├── dimens.xml │ └── strings.xml ├── settings.gradle └── tomclaw.keystore /.abstruse.yml: -------------------------------------------------------------------------------- 1 | image: theimpulson/gitlab-ci-android:android-33 2 | 3 | cache: 4 | - ~/.android 5 | - ~/.gradle 6 | 7 | branches: 8 | test: 9 | - master 10 | 11 | before_install: 12 | - chmod +x gradlew 13 | 14 | script: 15 | - ./gradlew assembleRelease --no-daemon -PstoreFile=$STORE_FILE -PstorePassword=$STORE_PASSWORD -PkeyAlias=$KEY_ALIAS -PkeyPassword=$KEY_PASSWORD "-Dorg.gradle.jvmargs=-Xmx1g -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError" 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | *.zip 3 | *.apk 4 | *.iml 5 | .DS_store 6 | 7 | # IDE folders # 8 | gen/ 9 | bin/ 10 | out/ 11 | local.properties 12 | proguard_logs/ 13 | projectFilesBackup/ 14 | .idea/* 15 | !.idea/codeStyleSettings.xml 16 | !.idea/encodings.xml 17 | !.idea/inspectionProfiles/ 18 | .kotlin/ 19 | 20 | # Gradle files 21 | .gradle/ 22 | *build/ 23 | app/release/ 24 | 25 | # Local configuration file (sdk path, etc) 26 | local.properties 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Appteka [![Appteka](https://img.shields.io/badge/dynamic/json?color=32A304&label=Appteka&query=%24.newer.ver_name&url=https%3A%2F%2Fappteka.store%2F%2Fapi%2F1%2Fupdate%3Fbuild%3D1)](https://appteka.store) 2 | Appteka is a free Android apps market. Download [Appteka](https://appteka.store) to get access to hundreds of thousands free Android apps made by talented developers all over the world. 3 | 4 | ![Screenshot](art/main.jpg "Main") 5 | ![Screenshot](art/app.jpg "App") 6 | 7 | ![Screenshot](art/upload.jpg "Upload") 8 | ![Screenshot](art/profile.jpg "Profile") 9 | 10 | ![Screenshot](art/topics.jpg "Topics") 11 | ![Screenshot](art/chat.jpg "Chat") 12 | -------------------------------------------------------------------------------- /app/src/main/assets/topic_common_qna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/assets/topic_common_qna.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/analytics/api/AnalyticsEvent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.analytics.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class AnalyticsEvent( 6 | @SerializedName("name") val name: String, 7 | @SerializedName("tags") val tags: Map, 8 | @SerializedName("fields") val fields: Map, 9 | @SerializedName("time") val time: Long 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/analytics/api/Environment.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.analytics.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Environment( 6 | @SerializedName("package_name") val packageName: String, 7 | @SerializedName("app_version") val appVersion: Long, 8 | @SerializedName("device_id") val deviceId: String, 9 | @SerializedName("os_version") val osVersion: Int, 10 | @SerializedName("manufacturer") val manufacturer: String, 11 | @SerializedName("model") val model: String, 12 | @SerializedName("country") val country: String, 13 | @SerializedName("language") val language: String, 14 | ) 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/analytics/api/SubmitEventsRequest.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.analytics.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class SubmitEventsRequest( 6 | @SerializedName("environment") val environment: Environment, 7 | @SerializedName("events") val events: List, 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/analytics/api/SubmitEventsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.analytics.api 2 | 3 | class SubmitEventsResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/categories/CategoriesResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.categories 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class CategoriesResponse( 9 | @SerializedName("categories") 10 | val categories: List 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/categories/Category.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.categories 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class Category( 9 | @SerializedName("id") 10 | val id: Int, 11 | @SerializedName("name") 12 | val name: Map, 13 | @SerializedName("icon") 14 | val icon: String, 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/categories/CategoryConverter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.categories 2 | 3 | import java.util.Locale 4 | 5 | interface CategoryConverter { 6 | 7 | fun convert(category: Category): CategoryItem 8 | 9 | } 10 | 11 | class CategoryConverterImpl(private val locale: Locale) : CategoryConverter { 12 | 13 | override fun convert(category: Category): CategoryItem { 14 | return CategoryItem( 15 | id = category.id, 16 | title = category.name[locale.language] ?: category.name[DEFAULT_LOCALE].orEmpty(), 17 | icon = category.icon 18 | ) 19 | } 20 | 21 | } 22 | 23 | const val DEFAULT_LOCALE = "en" 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/categories/CategoryItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.categories 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class CategoryItem( 9 | @SerializedName("id") 10 | val id: Int, 11 | @SerializedName("title") 12 | val title: String, 13 | @SerializedName("icon") 14 | val icon: String, 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/core/Config.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.core 2 | 3 | const val HOST_URL: String = "https://appteka.store" 4 | const val STAND_BY_HOST_URL: String = "https://tomclaw.com" 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/core/DeviceIdInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.core 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Response 5 | import java.io.IOException 6 | 7 | class DeviceIdInterceptor(private val deviceId: String) : Interceptor { 8 | 9 | @Throws(IOException::class) 10 | override fun intercept(chain: Interceptor.Chain): Response { 11 | return chain.proceed( 12 | chain.request().newBuilder() 13 | .header("X-Device-ID", deviceId) 14 | .build() 15 | ) 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/core/StandByApi.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.core 2 | 3 | import com.tomclaw.appsend.dto.StoreResponse 4 | import com.tomclaw.appsend.screen.home.api.StatusResponse 5 | import io.reactivex.rxjava3.core.Single 6 | import retrofit2.http.GET 7 | import retrofit2.http.Query 8 | 9 | interface StandByApi { 10 | 11 | @GET("status.php") 12 | fun getStatus( 13 | @Query("locale") locale: String, 14 | @Query("build") build: Long, 15 | ): Single> 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/core/UserAgentInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.core 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Response 5 | import java.io.IOException 6 | 7 | class UserAgentInterceptor(private val userAgent: String) : Interceptor { 8 | 9 | @Throws(IOException::class) 10 | override fun intercept(chain: Interceptor.Chain): Response { 11 | return chain.proceed( 12 | chain.request().newBuilder() 13 | .header("User-Agent", userAgent) 14 | .build() 15 | ) 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/core/WeakObjectTask.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.core; 2 | 3 | import java.lang.ref.WeakReference; 4 | 5 | /** 6 | * Created by solkin on 16.05.14. 7 | */ 8 | public abstract class WeakObjectTask extends Task { 9 | 10 | private final WeakReference weakObject; 11 | 12 | public WeakObjectTask(W object) { 13 | this.weakObject = new WeakReference(object); 14 | } 15 | 16 | public W getWeakObject() { 17 | return weakObject.get(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/di/legacy/LegacyComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.di.legacy 2 | 3 | import com.tomclaw.appsend.util.PerActivity 4 | import dagger.Subcomponent 5 | 6 | @PerActivity 7 | @Subcomponent(modules = [LegacyModule::class]) 8 | interface LegacyComponent { 9 | 10 | fun inject(injector: LegacyInjector) 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/di/legacy/LegacyModule.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.di.legacy 2 | 3 | import dagger.Module 4 | 5 | @Module 6 | class LegacyModule -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/download/di/DownloadServiceComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.download.di 2 | 3 | import com.tomclaw.appsend.download.DownloadService 4 | import com.tomclaw.appsend.util.PerService 5 | import dagger.Subcomponent 6 | 7 | @PerService 8 | @Subcomponent(modules = [DownloadServiceModule::class]) 9 | interface DownloadServiceComponent { 10 | 11 | fun inject(service: DownloadService) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/download/di/DownloadServiceModule.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.download.di 2 | 3 | import android.content.Context 4 | import dagger.Module 5 | 6 | @Module 7 | class DownloadServiceModule(context: Context) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/dto/AttachmentEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.dto 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AttachmentEntity( 9 | @SerializedName("preview_url") 10 | val previewUrl: String, 11 | @SerializedName("original_url") 12 | val originalUrl: String, 13 | @SerializedName("size") 14 | val size: Long, 15 | @SerializedName("width") 16 | val width: Int, 17 | @SerializedName("height") 18 | val height: Int 19 | ) : Parcelable 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/dto/Screenshot.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.dto 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class Screenshot( 9 | @SerializedName("scr_id") 10 | val scrId: String, 11 | @SerializedName("original") 12 | val original: String, 13 | @SerializedName("preview") 14 | val preview: String, 15 | @SerializedName("width") 16 | val width: Int, 17 | @SerializedName("height") 18 | val height: Int, 19 | ) : Parcelable 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/dto/StoreResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class StoreResponse( 6 | @SerializedName("status") 7 | val status: Int, 8 | @SerializedName("result") 9 | val result: A, 10 | @SerializedName("description") 11 | val description: String 12 | ) 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/dto/UserIcon.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.dto 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UserIcon( 9 | @SerializedName("icon") 10 | val icon: String, 11 | @SerializedName("label") 12 | val label: Map, 13 | @SerializedName("color") 14 | val color: String, 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/events/EventsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.events 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.MessageEntity 5 | import com.tomclaw.appsend.dto.TopicEntity 6 | 7 | class EventsResponse( 8 | @SerializedName("time") 9 | val time: Long, 10 | @SerializedName("messages") 11 | val messages: List?, 12 | @SerializedName("topics") 13 | val topics: List?, 14 | @SerializedName("inv_topics") 15 | val invalidateTopics: Boolean?, 16 | @SerializedName("deleted") 17 | val deleted: List?, 18 | ) 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/adapter/files/FileViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.adapter.files; 2 | 3 | import android.view.View; 4 | 5 | import androidx.recyclerview.widget.RecyclerView; 6 | 7 | /** 8 | * Created by solkin on 03.08.17. 9 | */ 10 | public abstract class FileViewHolder extends RecyclerView.ViewHolder { 11 | 12 | 13 | public FileViewHolder(View itemView) { 14 | super(itemView); 15 | } 16 | 17 | public abstract void bind(final T item, boolean isLast, final FilesListener listener); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/adapter/files/FileViewHolderCreator.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.adapter.files; 2 | 3 | import android.view.ViewGroup; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | public interface FileViewHolderCreator { 8 | 9 | FileViewHolder create(@NonNull ViewGroup parent); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/adapter/files/FilesListener.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.adapter.files; 2 | 3 | /** 4 | * Created by solkin on 03.08.17. 5 | */ 6 | public interface FilesListener { 7 | 8 | int STATE_LOADED = 0x01; 9 | int STATE_LOADING = 0x02; 10 | int STATE_FAILED = 0x03; 11 | 12 | int onNextPage(); 13 | 14 | void onRetry(); 15 | 16 | void onClick(T item); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/dto/ApiResponse.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.dto; 2 | 3 | import com.tomclaw.appsend.util.Unobfuscatable; 4 | 5 | public class ApiResponse implements Unobfuscatable { 6 | 7 | private final int status; 8 | private final A result; 9 | private String description; 10 | 11 | public ApiResponse(int status, A result) { 12 | this.status = status; 13 | this.result = result; 14 | } 15 | 16 | public int getStatus() { 17 | return status; 18 | } 19 | 20 | public A getResult() { 21 | return result; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/item/BaseItem.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.item; 2 | 3 | 4 | import com.tomclaw.appsend.util.Unobfuscatable; 5 | 6 | /** 7 | * Created by ivsolkin on 09.01.17. 8 | */ 9 | public abstract class BaseItem implements Unobfuscatable { 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/local/CommonItemClickListener.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.local; 2 | 3 | import com.tomclaw.appsend.main.item.CommonItem; 4 | 5 | public interface CommonItemClickListener { 6 | 7 | void onClick(CommonItem item); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/main/local/SelectInstalledFragment.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.main.local; 2 | 3 | import com.tomclaw.appsend.main.item.AppItem; 4 | 5 | public class SelectInstalledFragment extends InstalledFragment { 6 | 7 | @Override 8 | public void onClick(final AppItem item) { 9 | CommonItemClickListener listener = null; 10 | if (getActivity() instanceof CommonItemClickListener) { 11 | listener = (CommonItemClickListener) getActivity(); 12 | } 13 | if (listener != null) { 14 | listener.onClick(item); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/about/AboutResourceProvider.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.about 2 | 3 | import android.content.res.Resources 4 | import com.tomclaw.appsend.R 5 | import com.tomclaw.appsend.core.AppInfoProvider 6 | 7 | interface AboutResourceProvider { 8 | 9 | fun getAppVersion(): String 10 | } 11 | 12 | class AboutResourceProviderImpl( 13 | private val infoProvider: AppInfoProvider, 14 | private val resources: Resources, 15 | ) : AboutResourceProvider { 16 | 17 | override fun getAppVersion(): String { 18 | return resources.getString( 19 | R.string.app_version, 20 | infoProvider.getVersionName(), 21 | infoProvider.getVersionCode() 22 | ) 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/about/di/AboutComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.about.di 2 | 3 | import com.tomclaw.appsend.screen.about.AboutActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [AboutModule::class]) 9 | interface AboutComponent { 10 | 11 | fun inject(activity: AboutActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/agreement/di/AgreementComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.agreement.di 2 | 3 | import com.tomclaw.appsend.screen.agreement.AgreementActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [AgreementModule::class]) 9 | interface AgreementComponent { 10 | 11 | fun inject(activity: AgreementActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/agreement/di/AgreementModule.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.agreement.di 2 | 3 | import android.os.Bundle 4 | import com.tomclaw.appsend.screen.agreement.AgreementPresenter 5 | import com.tomclaw.appsend.screen.agreement.AgreementPresenterImpl 6 | import com.tomclaw.appsend.util.PerActivity 7 | import dagger.Module 8 | import dagger.Provides 9 | 10 | @Module 11 | class AgreementModule( 12 | private val state: Bundle? 13 | ) { 14 | 15 | @Provides 16 | @PerActivity 17 | internal fun providePresenter(): AgreementPresenter = AgreementPresenterImpl(state) 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/auth/request_code/api/RequestCodeResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.auth.request_code.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | class RequestCodeResponse( 6 | @SerializedName("registered") 7 | val registered: Boolean, 8 | @SerializedName("request_id") 9 | val requestId: String, 10 | @SerializedName("code_regex") 11 | val codeRegex: String, 12 | @SerializedName("name_regex") 13 | val nameRegex: String, 14 | ) 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/auth/request_code/di/RequestCodeComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.auth.request_code.di 2 | 3 | import com.tomclaw.appsend.screen.auth.request_code.RequestCodeActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [RequestCodeModule::class]) 9 | interface RequestCodeComponent { 10 | 11 | fun inject(activity: RequestCodeActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/auth/verify_code/api/VerifyCodeResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.auth.verify_code.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.user.api.UserProfile 5 | 6 | class VerifyCodeResponse( 7 | @SerializedName("user_info") 8 | val profile: UserProfile 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/auth/verify_code/di/VerifyCodeComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.auth.verify_code.di 2 | 3 | import com.tomclaw.appsend.screen.auth.verify_code.VerifyCodeActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [VerifyCodeModule::class]) 9 | interface VerifyCodeComponent { 10 | 11 | fun inject(activity: VerifyCodeActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onLoadMore(msgId: Int) 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/adapter/MsgAttachment.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.adapter 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | class MsgAttachment( 8 | val previewUrl: String, 9 | val originalUrl: String, 10 | val size: Long, 11 | val width: Int, 12 | val height: Int 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/HistoryResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.MessageEntity 5 | 6 | data class HistoryResponse( 7 | @SerializedName("messages") 8 | val messages: List 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/MsgTranslateResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class MsgTranslateResponse( 6 | @SerializedName("text") 7 | val text: String, 8 | @SerializedName("lang") 9 | val lang: String, 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/ReadTopicResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | class ReadTopicResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/ReportMessageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | class ReportMessageResponse -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/SendMessageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class SendMessageResponse( 6 | @SerializedName("time") 7 | val time: Long 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/TopicInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.TopicEntity 5 | 6 | data class TopicInfoResponse( 7 | @SerializedName("topic") 8 | val topic: TopicEntity 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/api/TranslationEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.api 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class TranslationEntity( 8 | val msgId: Int, 9 | val original: String, 10 | val translation: String, 11 | val lang: String, 12 | var translated: Boolean, 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/chat/di/ChatComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.chat.di 2 | 3 | import com.tomclaw.appsend.screen.chat.ChatActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [ChatModule::class]) 9 | interface ChatComponent { 10 | 11 | fun inject(activity: ChatActivity) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/controls/ControlsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.controls 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ControlsItem( 9 | override val id: Long, 10 | val appId: String, 11 | val packageName: String, 12 | val versionCode: Int, 13 | val sdkVersion: Int, 14 | val androidVersion: String, 15 | val size: Long, 16 | val link: String, 17 | val expiresIn: Long, 18 | val installedVersionCode: Int, 19 | val downloadState: Int, 20 | ) : Item, Parcelable 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/description/DescriptionItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.description 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class DescriptionItem( 9 | override val id: Long, 10 | val text: String, 11 | val versionName: String, 12 | val versionCode: Int, 13 | val versionsCount: Int, 14 | val uploadDate: Long, 15 | val checksum: String, 16 | val sourceUrl: String?, 17 | val translationState: Int, 18 | ) : Item, Parcelable 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/discuss/DiscussItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.discuss 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class DiscussItem( 9 | override val id: Long, 10 | val msgCount: Int?, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/discuss/DiscussItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.discuss 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.details.adapter.ItemListener 5 | 6 | class DiscussItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: DiscussItemView, item: DiscussItem, position: Int) { 11 | item.msgCount?.let { view.showMsgCount(it) } ?: view.showNoMsgIndicator() 12 | view.setOnDiscussClickListener { 13 | listener.onDiscussClick() 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/header/HeaderItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.header 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.dto.UserIcon 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class HeaderItem( 10 | override val id: Long, 11 | val icon: String?, 12 | val packageName: String, 13 | val label: String, 14 | val userId: Int?, 15 | val userIcon: UserIcon?, 16 | val userName: String?, 17 | val downloadState: Int, 18 | ) : Item, Parcelable 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/permissions/PermissionsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.permissions 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class PermissionsItem( 9 | override val id: Long, 10 | val permissions: List, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/permissions/PermissionsResourceProvider.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.permissions 2 | 3 | import android.content.res.Resources 4 | import com.tomclaw.appsend.R 5 | 6 | interface PermissionsResourceProvider { 7 | 8 | fun formatOtherAccessText(accessCount: Int): String 9 | 10 | } 11 | 12 | class PermissionsResourceProviderImpl( 13 | val resources: Resources, 14 | ) : PermissionsResourceProvider { 15 | 16 | override fun formatOtherAccessText(accessCount: Int): String { 17 | return resources.getQuantityString(R.plurals.other_access, accessCount, accessCount) 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/play/PlayItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.play 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.categories.Category 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class PlayItem( 10 | override val id: Long, 11 | val rating: Float?, 12 | val downloads: Int, 13 | val favorites: Int, 14 | val size: Long, 15 | val exclusive: Boolean, 16 | val openSource: Boolean, 17 | val category: Category?, 18 | val osVersion: String?, 19 | val minSdk: Int?, 20 | ) : Item, Parcelable 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/play/PlayResourceProvider.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.play 2 | 3 | import android.content.res.Resources 4 | import com.tomclaw.appsend.util.FileHelper 5 | 6 | interface PlayResourceProvider { 7 | 8 | fun formatFileSize(size: Long): String 9 | 10 | } 11 | 12 | class PlayResourceProviderImpl(val resources: Resources) : PlayResourceProvider { 13 | 14 | override fun formatFileSize(size: Long): String { 15 | return FileHelper.formatBytes(resources, size) 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/rating/RatingItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.rating 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.dto.UserIcon 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class RatingItem( 10 | override val id: Long, 11 | val score: Int, 12 | val text: String?, 13 | val time: Long, 14 | val userId: Int, 15 | val userName: String, 16 | val userIcon: UserIcon, 17 | ) : Item, Parcelable 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/scores/ScoresItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.scores 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.screen.details.api.Scores 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ScoresItem( 10 | override val id: Long, 11 | val rateCount: Int, 12 | val rating: Float, 13 | val scores: Scores, 14 | ) : Item, Parcelable 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/screenshot/ScreenshotItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.screenshot 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import com.avito.konveyor.blueprint.Item 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ScreenshotItem( 10 | override val id: Long, 11 | val original: Uri, 12 | val preview: Uri, 13 | val width: Int, 14 | val height: Int, 15 | ) : Item, Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/screenshot/ScreenshotItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.screenshot 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.details.adapter.screenshots.ScreenshotItemListener 5 | 6 | class ScreenshotItemPresenter( 7 | private val listener: ScreenshotItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: ScreenshotItemView, item: ScreenshotItem, position: Int) { 11 | with(view) { 12 | setImage(item) 13 | setOnClickListener { listener.onScreenshotClick(position) } 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/screenshots/ScreenshotItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.screenshots 2 | 3 | interface ScreenshotItemListener { 4 | 5 | fun onScreenshotClick(position: Int) 6 | 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/screenshots/ScreenshotsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.screenshots 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | import com.tomclaw.appsend.screen.details.adapter.screenshot.ScreenshotItem 5 | 6 | data class ScreenshotsItem( 7 | override val id: Long, 8 | val items: List, 9 | ) : Item 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/status/StatusItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.status 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class StatusItem( 9 | override val id: Long, 10 | val type: StatusType, 11 | val text: String, 12 | val actionType: StatusAction, 13 | val actionLabel: String?, 14 | ) : Item, Parcelable 15 | 16 | enum class StatusType { 17 | INFO, 18 | WARNING, 19 | ERROR 20 | } 21 | 22 | enum class StatusAction { 23 | NONE, 24 | EDIT_META, 25 | UNPUBLISH 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/user_rate/UserRateItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.user_rate 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UserRateItem( 9 | override val id: Long, 10 | val appId: String, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/user_review/UserReviewItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.user_review 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.dto.UserIcon 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class UserReviewItem( 10 | override val id: Long, 11 | val score: Int, 12 | val text: String?, 13 | val time: Long, 14 | val userId: Int, 15 | val userIcon: UserIcon, 16 | val userName: String?, 17 | ) : Item, Parcelable 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/whats_new/WhatsNewItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.whats_new 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class WhatsNewItem( 9 | override val id: Long, 10 | val text: String, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/adapter/whats_new/WhatsNewItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.adapter.whats_new 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.details.adapter.ItemListener 5 | 6 | class WhatsNewItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: WhatsNewItemView, item: WhatsNewItem, position: Int) { 11 | view.setText(item.text) 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/AppVersion.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AppVersion( 9 | @SerializedName("app_id") 10 | val appId: String, 11 | @SerializedName("downloads") 12 | val downloads: Int?, 13 | @SerializedName("ver_code") 14 | val verCode: Int, 15 | @SerializedName("ver_name") 16 | val verName: String, 17 | @SerializedName("sdk_version") 18 | val sdkVersion: Int, 19 | ) : Parcelable 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/CreateTopicResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.dto.TopicEntity 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class CreateTopicResponse( 10 | @SerializedName("topic") 11 | val topic: TopicEntity, 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/DeletionResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | class DeletionResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/MarkFavoriteResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | class MarkFavoriteResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/ModerationDecisionResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | class ModerationDecisionResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/Scores.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class Scores( 9 | @SerializedName("five") 10 | val five: Int, 11 | @SerializedName("four") 12 | val four: Int, 13 | @SerializedName("three") 14 | val three: Int, 15 | @SerializedName("two") 16 | val two: Int, 17 | @SerializedName("one") 18 | val one: Int, 19 | ) : Parcelable 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/api/TranslationResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class TranslationResponse( 9 | @SerializedName("whats_new") 10 | val whatsNew: String?, 11 | @SerializedName("description") 12 | val description: String?, 13 | @SerializedName("whats_new_lang") 14 | val whatsNewLang: String?, 15 | @SerializedName("description_lang") 16 | val descriptionLang: String?, 17 | ) : Parcelable 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/details/di/DetailsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.details.di 2 | 3 | import com.tomclaw.appsend.screen.details.DetailsActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [DetailsModule::class]) 9 | interface DetailsComponent { 10 | 11 | fun inject(activity: DetailsActivity) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/distro/DistroAppEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.distro 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class DistroAppEntity( 8 | val packageName: String, 9 | val label: String, 10 | val icon: String?, 11 | val verName: String, 12 | val verCode: Long, 13 | val lastModified: Long, 14 | val size: Long, 15 | val path: String, 16 | ) : Parcelable 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/distro/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.distro.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/distro/adapter/apk/ApkItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.distro.adapter.apk 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ApkItem( 9 | override val id: Long, 10 | val icon: String?, 11 | val title: String, 12 | val version: String, 13 | val size: Long, 14 | val lastModified: Long, 15 | val packageName: String, 16 | val path: String, 17 | var isNew: Boolean, 18 | ) : Item, Parcelable 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/distro/di/DistroComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.distro.di 2 | 3 | import com.tomclaw.appsend.screen.distro.DistroActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [DistroModule::class]) 9 | interface DistroComponent { 10 | 11 | fun inject(activity: DistroActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/downloads/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.downloads.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onRetryClick(item: Item) 10 | 11 | fun onLoadMore(item: Item) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/downloads/api/DownloadsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.downloads.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.AppEntity 5 | 6 | class DownloadsResponse( 7 | @SerializedName("entries") 8 | val files: List 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/downloads/di/DownloadsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.downloads.di 2 | 3 | import com.tomclaw.appsend.screen.downloads.DownloadsActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [DownloadsModule::class]) 9 | interface DownloadsComponent { 10 | 11 | fun inject(activity: DownloadsActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/favorite/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.favorite.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onRetryClick(item: Item) 10 | 11 | fun onLoadMore(item: Item) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/favorite/api/FavoriteResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.favorite.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.AppEntity 5 | 6 | class FavoriteResponse( 7 | @SerializedName("entries") 8 | val files: List 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/favorite/di/FavoriteComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.favorite.di 2 | 3 | import com.tomclaw.appsend.screen.favorite.FavoriteActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [FavoriteModule::class]) 9 | interface FavoriteComponent { 10 | 11 | fun inject(activity: FavoriteActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/adapter/FeedItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.adapter 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.user.api.UserBrief 6 | 7 | interface FeedItem : Item, Parcelable { 8 | val user: UserBrief? 9 | val actions: List? 10 | var hasMore: Boolean 11 | var hasProgress: Boolean 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | import com.tomclaw.appsend.dto.Screenshot 5 | import com.tomclaw.appsend.user.api.UserBrief 6 | 7 | interface ItemListener { 8 | 9 | fun onItemClick(item: Item) 10 | 11 | fun onLoadMore(item: Item) 12 | 13 | fun onImageClick(items: List, clicked: Int) 14 | 15 | fun onAppClick(appId: String, title: String?) 16 | 17 | fun onUserClick(user: UserBrief) 18 | 19 | fun onMenuClick(item: FeedItem) 20 | 21 | fun onLoginClick() 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/adapter/subscribe/SubscribeItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.adapter.subscribe 2 | 3 | import com.tomclaw.appsend.screen.feed.adapter.FeedItem 4 | import com.tomclaw.appsend.user.api.UserBrief 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class SubscribeItem( 9 | override val id: Long, 10 | val time: Long, 11 | val publisher: UserBrief, 12 | override val user: UserBrief, 13 | override val actions: List?, 14 | override var hasMore: Boolean = false, 15 | override var hasProgress: Boolean = false, 16 | ) : FeedItem 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/adapter/text/TextItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.adapter.text 2 | 3 | import com.tomclaw.appsend.dto.Screenshot 4 | import com.tomclaw.appsend.screen.feed.adapter.FeedItem 5 | import com.tomclaw.appsend.user.api.UserBrief 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | class TextItem( 10 | override val id: Long, 11 | val time: Long, 12 | val screenshots: List, 13 | val text: String, 14 | override val user: UserBrief, 15 | override val actions: List?, 16 | override var hasMore: Boolean = false, 17 | override var hasProgress: Boolean = false, 18 | ) : FeedItem 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/adapter/unauthorized/UnauthorizedItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.adapter.unauthorized 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.feed.adapter.ItemListener 5 | 6 | class UnauthorizedItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: UnauthorizedItemView, item: UnauthorizedItem, position: Int) { 11 | view.setOnLoginButtonClickListener { listener.onLoginClick() } 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/DeletePostResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | class DeletePostResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/FeedResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.screen.feed.FeedDirection 5 | 6 | data class FeedResponse( 7 | @SerializedName("posts") 8 | val posts: List, 9 | @SerializedName("offset_id") 10 | val offsetId: Int, 11 | @SerializedName("direction") 12 | val direction: FeedDirection, 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/PostPayload.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | interface PostPayload 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/ReadResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | class ReadResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/SubscribePayload.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.user.api.UserBrief 5 | 6 | data class SubscribePayload( 7 | @SerializedName("publisher") 8 | val publisher: UserBrief, 9 | ) : PostPayload 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/TextPayload.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.Screenshot 5 | 6 | data class TextPayload( 7 | @SerializedName("screenshots") 8 | val screenshots: List, 9 | @SerializedName("text") 10 | val text: String, 11 | ): PostPayload 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/api/UnsupportedPayload.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.api 2 | 3 | class UnsupportedPayload : PostPayload 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/feed/di/FeedComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.feed.di 2 | 3 | import com.tomclaw.appsend.screen.feed.FeedFragment 4 | import com.tomclaw.appsend.util.PerFragment 5 | import dagger.Subcomponent 6 | 7 | @PerFragment 8 | @Subcomponent(modules = [FeedModule::class]) 9 | interface FeedComponent { 10 | 11 | fun inject(fragment: FeedFragment) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/gallery/GalleryItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.gallery 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class GalleryItem( 9 | val uri: Uri, 10 | val width: Int, 11 | val height: Int 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/gallery/adapter/image/ImageItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.gallery.adapter.image 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import com.avito.konveyor.blueprint.Item 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ImageItem( 10 | override val id: Long, 11 | val uri: Uri, 12 | ): Parcelable, Item 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/gallery/adapter/image/ImageItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.gallery.adapter.image 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | 5 | class ImageItemPresenter : ItemPresenter { 6 | 7 | override fun bindView(view: ImageItemView, item: ImageItem, position: Int) { 8 | view.setUri(item.uri) 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/gallery/di/GalleryComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.gallery.di 2 | 3 | import com.tomclaw.appsend.screen.gallery.GalleryActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [GalleryModule::class]) 9 | interface GalleryComponent { 10 | 11 | fun inject(activity: GalleryActivity) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/home/HomeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.home 2 | 3 | import android.content.Intent 4 | 5 | interface HomeFragment { 6 | fun handleEvent(data: Intent?) 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/home/api/ModerationData.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.home.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ModerationData( 9 | @SerializedName("moderator") 10 | val moderator: Boolean, 11 | @SerializedName("count") 12 | val count: Int, 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/home/api/StartupResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.home.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.dto.AppEntity 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class StartupResponse( 10 | @SerializedName("update") 11 | val update: AppEntity?, 12 | @SerializedName("unread") 13 | val unread: Int, 14 | @SerializedName("feed") 15 | val feed: Int, 16 | @SerializedName("moderation") 17 | val moderation: ModerationData?, 18 | ) : Parcelable 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/home/api/StatusResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.home.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class StatusResponse( 9 | @SerializedName("block") 10 | val block: Boolean?, 11 | @SerializedName("title") 12 | val title: String?, 13 | @SerializedName("message") 14 | val message: String?, 15 | ) : Parcelable -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/home/di/HomeComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.home.di 2 | 3 | import com.tomclaw.appsend.screen.home.HomeActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [HomeModule::class]) 9 | interface HomeComponent { 10 | 11 | fun inject(activity: HomeActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/installed/InstalledAppEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.installed 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class InstalledAppEntity( 8 | val packageName: String, 9 | val label: String, 10 | val icon: String?, 11 | val verName: String, 12 | val verCode: Long, 13 | val firstInstallTime: Long, 14 | val lastUpdateTime: Long, 15 | val size: Long, 16 | val path: String?, 17 | val isUserApp: Boolean, 18 | ) : Parcelable 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/installed/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.installed.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onUpdateClick(title: String, appId: String) 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/installed/adapter/app/AppItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.installed.adapter.app 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class AppItem( 9 | override val id: Long, 10 | val icon: String?, 11 | val title: String, 12 | val version: String, 13 | val size: Long, 14 | val installTime: Long, 15 | val updateTime: Long, 16 | val packageName: String, 17 | val path: String?, 18 | var updateAppId: String?, 19 | val isUserApp: Boolean, 20 | var isNew: Boolean = false, 21 | ) : Item, Parcelable 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/installed/api/CheckUpdatesRequest.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.installed.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class CheckUpdatesRequest( 6 | @SerializedName(value = "locale") 7 | private val locale: String, 8 | @SerializedName(value = "apps") 9 | private val apps: Map, 10 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/installed/api/CheckUpdatesResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.installed.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class CheckUpdatesResponse( 6 | @SerializedName(value = "entries") 7 | val entries: List?, 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/installed/di/InstalledComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.installed.di 2 | 3 | import com.tomclaw.appsend.screen.installed.InstalledActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [InstalledModule::class]) 9 | interface InstalledComponent { 10 | 11 | fun inject(activity: InstalledActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/moderation/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.moderation.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onRetryClick(item: Item) 10 | 11 | fun onLoadMore(item: Item) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/moderation/api/ModerationResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.moderation.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.AppEntity 5 | 6 | class ModerationResponse( 7 | @SerializedName("entries") 8 | val files: List 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/moderation/di/ModerationComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.moderation.di 2 | 3 | import com.tomclaw.appsend.screen.moderation.ModerationActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [ModerationModule::class]) 9 | interface ModerationComponent { 10 | 11 | fun inject(activity: ModerationActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/permissions/PermissionsResourceProvider.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.permissions 2 | 3 | import android.content.res.Resources 4 | import com.tomclaw.appsend.R 5 | 6 | interface PermissionsResourceProvider { 7 | 8 | fun getUnknownPermissionString(): String 9 | } 10 | 11 | class PermissionsResourceProviderImpl( 12 | private val resources: Resources 13 | ) : PermissionsResourceProvider { 14 | 15 | override fun getUnknownPermissionString(): String { 16 | return resources.getString(R.string.unknown_permission_description) 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/permissions/adapter/safe/SafePermissionItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.permissions.adapter.safe 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class SafePermissionItem( 9 | override val id: Long, 10 | val description: String?, 11 | val permission: String, 12 | ) : Item, Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/permissions/adapter/unsafe/UnsafePermissionItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.permissions.adapter.unsafe 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UnsafePermissionItem( 9 | override val id: Long, 10 | val description: String?, 11 | val permission: String, 12 | ) : Item, Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/permissions/di/PermissionsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.permissions.di 2 | 3 | import com.tomclaw.appsend.screen.permissions.PermissionsActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [PermissionsModule::class]) 9 | interface PermissionsComponent { 10 | 11 | fun inject(activity: PermissionsActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter 2 | 3 | import com.tomclaw.appsend.screen.post.adapter.image.ImageItem 4 | 5 | interface ItemListener { 6 | 7 | fun onTextChanged(text: String) 8 | 9 | fun onSubmitClick() 10 | 11 | fun onScreenAppendClick() 12 | 13 | fun onImageClick(item: ImageItem) 14 | 15 | fun onImageDelete(item: ImageItem) 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/append/AppendItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.append 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AppendItem( 9 | override val id: Long, 10 | ) : Item, Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/append/AppendItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.append 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.post.adapter.ItemListener 5 | 6 | class AppendItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: AppendItemView, item: AppendItem, position: Int) { 11 | with(view) { 12 | setOnClickListener { listener.onScreenAppendClick() } 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/image/ImageItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.image 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import com.avito.konveyor.blueprint.Item 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ImageItem( 10 | override val id: Long, 11 | val original: Uri, 12 | val preview: Uri, 13 | val width: Int, 14 | val height: Int, 15 | val remote: Boolean, 16 | ) : Item, Parcelable 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/image/ImageItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.image 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.post.adapter.ItemListener 5 | 6 | class ImageItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: ImageItemView, item: ImageItem, position: Int) { 11 | with(view) { 12 | setImage(item) 13 | setRemote(item.remote) 14 | setOnClickListener { listener.onImageClick(item) } 15 | setOnDeleteListener { listener.onImageDelete(item) } 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/ribbon/RibbonItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.ribbon 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | data class RibbonItem( 6 | override val id: Long, 7 | val items: List, 8 | ) : Item 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/submit/SubmitItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.submit 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class SubmitItem( 9 | override val id: Long, 10 | ) : Item, Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/submit/SubmitItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.submit 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.post.adapter.ItemListener 5 | 6 | class SubmitItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: SubmitItemView, item: SubmitItem, position: Int) { 11 | with(view) { 12 | setOnClickListener { listener.onSubmitClick() } 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/adapter/text/TextItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.adapter.text 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class TextItem( 9 | override val id: Long, 10 | val text: String, 11 | val errorRequiredField: Boolean, 12 | val maxLength: Int, 13 | ) : Item, Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/api/FeedConfigResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class FeedConfigResponse( 9 | @SerializedName("post_max_length") 10 | val postMaxLength: Int, 11 | @SerializedName("post_max_images") 12 | val postMaxImages: Int, 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/api/FeedPostResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class FeedPostResponse( 9 | @SerializedName("id") 10 | val postId: Int 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/di/PostComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.di 2 | 3 | import com.tomclaw.appsend.screen.post.PostActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [PostModule::class]) 9 | interface PostComponent { 10 | 11 | fun inject(activity: PostActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/dto/FeedConfig.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.dto 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class FeedConfig( 8 | val postMaxLength: Int, 9 | val postMaxImages: Int, 10 | ) : Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/post/dto/PostImage.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.post.dto 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class PostImage( 9 | val scrId: String?, 10 | val original: Uri, 11 | val preview: Uri, 12 | val width: Int, 13 | val height: Int, 14 | ) : Parcelable 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/app/AppItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.app 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AppItem( 9 | override val id: Long, 10 | val appId: String, 11 | val icon: String?, 12 | val title: String, 13 | val rating: Float, 14 | ) : Item, Parcelable 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/app/AppItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.app 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.profile.adapter.uploads.AppItemListener 5 | 6 | class AppItemPresenter( 7 | private val listener: AppItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: AppItemView, item: AppItem, position: Int) { 11 | view.setIcon(item.icon) 12 | view.setTitle(item.title) 13 | view.setRating(item.rating.takeIf { it > 0 }) 14 | view.setOnClickListener { listener.onAppClick(item) } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/downloads/DownloadsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.downloads 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class DownloadsItem( 9 | override val id: Long, 10 | val count: Int, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/downloads/DownloadsItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.downloads 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.profile.adapter.ItemListener 5 | 6 | class DownloadsItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: DownloadsItemView, item: DownloadsItem, position: Int) { 11 | view.setCount(item.count) 12 | view.setOnClickListener { listener.onDownloadsClick() } 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/favorites/FavoritesItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.favorites 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class FavoritesItem( 9 | override val id: Long, 10 | val count: Int, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/favorites/FavoritesItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.favorites 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.profile.adapter.ItemListener 5 | 6 | class FavoritesItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: FavoritesItemView, item: FavoritesItem, position: Int) { 11 | view.setCount(item.count) 12 | view.setOnClickListener { listener.onFavoritesClick() } 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/feed/FeedItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.feed 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class FeedItem( 9 | override val id: Long, 10 | val feedCount: Int, 11 | val subsCount: Int, 12 | val pubsCount: Int, 13 | ) : Item, Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/header/HeaderItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.header 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.dto.UserIcon 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class HeaderItem( 10 | override val id: Long, 11 | val userName: String?, 12 | val userIcon: UserIcon, 13 | val joinTime: Long, 14 | val lastSeen: Long, 15 | val role: Int, 16 | val isRegistered: Boolean, 17 | val isVerified: Boolean, 18 | val isSelf: Boolean, 19 | val isSubscribed: Boolean, 20 | val nameRegex: String?, 21 | ) : Item, Parcelable 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/placeholder/PlaceholderItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.placeholder 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class PlaceholderItem( 9 | override val id: Long, 10 | ) : Item, Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/placeholder/PlaceholderItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.placeholder 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | 5 | class PlaceholderItemPresenter : ItemPresenter { 6 | 7 | override fun bindView(view: PlaceholderItemView, item: PlaceholderItem, position: Int) {} 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/placeholder/PlaceholderItemView.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.placeholder 2 | 3 | import android.view.View 4 | import com.avito.konveyor.adapter.BaseViewHolder 5 | import com.avito.konveyor.blueprint.ItemView 6 | 7 | interface PlaceholderItemView : ItemView 8 | 9 | class PlaceholderItemViewHolder(view: View) : BaseViewHolder(view), PlaceholderItemView { 10 | 11 | override fun onUnbind() {} 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/review/ReviewItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.review 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ReviewItem( 9 | override val id: Long, 10 | val appId: String, 11 | val rateId: Int, 12 | val icon: String?, 13 | val title: String, 14 | val version: String, 15 | val rating: Float, 16 | val text: String?, 17 | val time: Long, 18 | ) : Item, Parcelable 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/reviews/ReviewItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.reviews 2 | 3 | import com.tomclaw.appsend.screen.profile.adapter.review.ReviewItem 4 | 5 | interface ReviewItemListener { 6 | 7 | fun onRatingClick(item: ReviewItem) 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/reviews/ReviewsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.reviews 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.screen.profile.adapter.review.ReviewItem 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ReviewsItem( 10 | override val id: Long, 11 | val count: Int, 12 | val items: List, 13 | ) : Item, Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/unauthorized/UnauthorizedItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.unauthorized 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UnauthorizedItem( 9 | override val id: Long, 10 | ) : Item, Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/unauthorized/UnauthorizedItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.unauthorized 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.profile.adapter.ItemListener 5 | 6 | class UnauthorizedItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: UnauthorizedItemView, item: UnauthorizedItem, position: Int) { 11 | view.setOnLoginButtonClickListener { listener.onLoginClick() } 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/uploads/AppItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.uploads 2 | 3 | import com.tomclaw.appsend.screen.profile.adapter.app.AppItem 4 | 5 | interface AppItemListener { 6 | 7 | fun onAppClick(app: AppItem) 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/adapter/uploads/UploadsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.adapter.uploads 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.screen.profile.adapter.app.AppItem 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class UploadsItem( 10 | override val id: Long, 11 | val userId: Int, 12 | val uploads: Int, 13 | val downloads: Int, 14 | val items: List, 15 | ) : Item, Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/api/EliminateUserResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class EliminateUserResponse( 9 | @SerializedName("files_count") 10 | val filesCount: Int, 11 | @SerializedName("msgs_count") 12 | val msgsCount: Int, 13 | @SerializedName("ratings_count") 14 | val ratingsCount: Int, 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/api/ProfileResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ProfileResponse( 9 | @SerializedName("profile") 10 | val profile: Profile, 11 | @SerializedName("grant_roles") 12 | val grantRoles: List?, 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/api/SetUserNameResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.api 2 | 3 | class SetUserNameResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/api/SubscribeResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.api 2 | 3 | class SubscribeResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/api/UnsubscribeResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.api 2 | 3 | class UnsubscribeResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/api/UserAppsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.dto.AppEntity 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | class UserAppsResponse( 10 | @SerializedName("entries") 11 | val files: List 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/profile/di/ProfileComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.profile.di 2 | 3 | import com.tomclaw.appsend.screen.profile.ProfileFragment 4 | import com.tomclaw.appsend.util.PerFragment 5 | import dagger.Subcomponent 6 | 7 | @PerFragment 8 | @Subcomponent(modules = [ProfileModule::class]) 9 | interface ProfileComponent { 10 | 11 | fun inject(fragment: ProfileFragment) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/rate/api/SubmitReviewResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.rate.api 2 | 3 | class SubmitReviewResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/rate/di/RateComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.rate.di 2 | 3 | import com.tomclaw.appsend.screen.rate.RateActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [RateModule::class]) 9 | interface RateComponent { 10 | 11 | fun inject(activity: RateActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/ratings/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.ratings.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onDeleteClick(item: Item) 10 | 11 | fun onRetryClick(item: Item) 12 | 13 | fun onLoadMore(item: Item) 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/ratings/adapter/rating/RatingItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.ratings.adapter.rating 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.dto.UserIcon 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class RatingItem( 10 | override val id: Long, 11 | val rateId: Int, 12 | val score: Int, 13 | val text: String?, 14 | val time: Long, 15 | val userId: Int, 16 | val userName: String, 17 | val userIcon: UserIcon, 18 | val showRatingMenu: Boolean, 19 | var hasMore: Boolean = false, 20 | var hasError: Boolean = false, 21 | var hasProgress: Boolean = false, 22 | ) : Item, Parcelable 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/ratings/api/DeleteRatingResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.ratings.api 2 | 3 | class DeleteRatingResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/ratings/api/RatingsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.ratings.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.screen.details.api.RatingEntity 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class RatingsResponse( 10 | @SerializedName("entries") 11 | val entries: List, 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/ratings/di/RatingsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.ratings.di 2 | 3 | import com.tomclaw.appsend.screen.ratings.RatingsActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [RatingsModule::class]) 9 | interface RatingsComponent { 10 | 11 | fun inject(activity: RatingsActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/reviews/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.reviews.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onDeleteClick(item: Item) 10 | 11 | fun onRetryClick(item: Item) 12 | 13 | fun onLoadMore(item: Item) 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/reviews/adapter/review/ReviewItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.reviews.adapter.review 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ReviewItem( 9 | override val id: Long, 10 | val appId: String, 11 | val rateId: Int, 12 | val icon: String?, 13 | val title: String, 14 | val version: String, 15 | val rating: Float, 16 | val text: String?, 17 | val time: Long, 18 | val showRatingMenu: Boolean, 19 | var hasMore: Boolean = false, 20 | var hasError: Boolean = false, 21 | var hasProgress: Boolean = false, 22 | ) : Item, Parcelable 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/reviews/api/ReviewEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.reviews.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.dto.AppEntity 6 | import com.tomclaw.appsend.screen.details.api.RatingEntity 7 | import kotlinx.parcelize.Parcelize 8 | 9 | @Parcelize 10 | data class ReviewEntity( 11 | @SerializedName("file") 12 | val file: AppEntity, 13 | @SerializedName("rating") 14 | val rating: RatingEntity, 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/reviews/api/ReviewsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.reviews.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ReviewsResponse( 9 | @SerializedName("entries") 10 | val entries: List, 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/reviews/di/ReviewsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.reviews.di 2 | 3 | import com.tomclaw.appsend.screen.reviews.ReviewsActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [ReviewsModule::class]) 9 | interface ReviewsComponent { 10 | 11 | fun inject(activity: ReviewsActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/store/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.store.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onLoadMore(item: Item) 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/store/api/AppsListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.store.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.AppEntity 5 | 6 | class AppsListResponse( 7 | @SerializedName("entries") 8 | val files: List 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/store/di/StoreComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.store.di 2 | 3 | import com.tomclaw.appsend.screen.store.StoreFragment 4 | import com.tomclaw.appsend.util.PerFragment 5 | import dagger.Subcomponent 6 | 7 | @PerFragment 8 | @Subcomponent(modules = [StoreModule::class]) 9 | interface StoreComponent { 10 | 11 | fun inject(fragment: StoreFragment) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/subscriptions/di/SubscriptionsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.subscriptions.di 2 | 3 | import com.tomclaw.appsend.screen.subscriptions.SubscriptionsActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [SubscriptionsModule::class]) 9 | interface SubscriptionsComponent { 10 | 11 | fun inject(activity: SubscriptionsActivity) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/topics/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.topics.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onItemLongClick(item: Item) 10 | 11 | fun onLoadMore(item: Item) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/topics/adapter/topic/TopicItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.topics.adapter.topic 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.dto.UserIcon 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class TopicItem( 10 | override val id: Long, 11 | val icon: String, 12 | val title: String, 13 | val description: String?, 14 | val packageName: String?, 15 | val isPinned: Boolean, 16 | val hasUnread: Boolean, 17 | val lastMsgId: Int, 18 | val lastMsgText: String, 19 | val lastMsgUserIcon: UserIcon, 20 | var hasMore: Boolean = false, 21 | var hasProgress: Boolean = false, 22 | ) : Item, Parcelable 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/topics/api/PinTopicResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.topics.api 2 | 3 | class PinTopicResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/topics/api/TopicsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.topics.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.tomclaw.appsend.dto.TopicEntity 5 | 6 | class TopicsResponse( 7 | @SerializedName("has_more") 8 | val hasMore: Boolean, 9 | @SerializedName("entries") 10 | val topics: List 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/topics/di/TopicsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.topics.di 2 | 3 | import com.tomclaw.appsend.screen.topics.TopicsFragment 4 | import com.tomclaw.appsend.util.PerFragment 5 | import dagger.Subcomponent 6 | 7 | @PerFragment 8 | @Subcomponent(modules = [TopicsModule::class]) 9 | interface TopicsComponent { 10 | 11 | fun inject(fragment: TopicsFragment) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/category/SelectCategoryItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.category 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.categories.CategoryItem 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class SelectCategoryItem( 10 | override val id: Long, 11 | val category: CategoryItem?, 12 | val errorRequiredField: Boolean, 13 | ) : Item, Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/description/DescriptionItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.description 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class DescriptionItem( 9 | override val id: Long, 10 | val text: String, 11 | val errorRequiredField: Boolean, 12 | ) : Item, Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/exclusive/ExclusiveItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.exclusive 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ExclusiveItem( 9 | override val id: Long, 10 | val value: Boolean, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/exclusive/ExclusiveItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.exclusive 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.upload.adapter.ItemListener 5 | 6 | class ExclusiveItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: ExclusiveItemView, item: ExclusiveItem, position: Int) { 11 | with(view) { 12 | setExclusive(item.value) 13 | setOnExclusiveChangedListener { listener.onExclusiveChanged(it) } 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/notice/NoticeItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.notice 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class NoticeItem( 9 | override val id: Long, 10 | val type: NoticeType, 11 | val text: String, 12 | val clickable: Boolean, 13 | ) : Item, Parcelable 14 | 15 | enum class NoticeType { 16 | INFO, 17 | WARNING, 18 | ERROR 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/open_source/OpenSourceItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.open_source 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class OpenSourceItem( 9 | override val id: Long, 10 | val value: Boolean, 11 | val url: String, 12 | ) : Item, Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/other_versions/OtherVersionsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.other_versions 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class OtherVersionsItem( 9 | override val id: Long, 10 | val versions: List, 11 | ) : Item, Parcelable 12 | 13 | @Parcelize 14 | data class VersionItem( 15 | val versionId: Int, 16 | val appId: String, 17 | val title: String, 18 | val compatible: Boolean, 19 | val newer: Boolean, 20 | ) : Parcelable 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/other_versions/OtherVersionsItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.other_versions 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.upload.adapter.ItemListener 5 | 6 | class OtherVersionsItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: OtherVersionsItemView, item: OtherVersionsItem, position: Int) { 11 | with(view) { 12 | setVersionsCount(item.versions.size) 13 | setOnClickListener { listener.onOtherVersionsClick(item.versions) } 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/screen_append/ScreenAppendItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.screen_append 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ScreenAppendItem( 9 | override val id: Long, 10 | ) : Item, Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/screen_append/ScreenAppendItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.screen_append 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.upload.adapter.ItemListener 5 | 6 | class ScreenAppendItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: ScreenAppendItemView, item: ScreenAppendItem, position: Int) { 11 | with(view) { 12 | setOnClickListener { listener.onScreenAppendClick() } 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/screen_image/ScreenImageItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.screen_image 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import com.avito.konveyor.blueprint.Item 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ScreenImageItem( 10 | override val id: Long, 11 | val original: Uri, 12 | val preview: Uri, 13 | val width: Int, 14 | val height: Int, 15 | val remote: Boolean, 16 | ) : Item, Parcelable 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/screenshots/ScreenshotsItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.screenshots 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | data class ScreenshotsItem( 6 | override val id: Long, 7 | val items: List, 8 | ) : Item 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/select_app/SelectAppItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.select_app 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class SelectAppItem( 9 | override val id: Long 10 | ) : Item, Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/select_app/SelectAppItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.select_app 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.upload.adapter.ItemListener 5 | 6 | class SelectAppItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: SelectAppItemView, item: SelectAppItem, position: Int) { 11 | view.setOnClickListener { listener.onSelectAppClick() } 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/selected_app/SelectedAppItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.selected_app 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.upload.UploadApk 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class SelectedAppItem( 10 | override val id: Long, 11 | val apk: UploadApk 12 | ) : Item, Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/selected_app/SelectedAppResourceProvider.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.selected_app 2 | 3 | import android.content.res.Resources 4 | import com.tomclaw.appsend.util.FileHelper 5 | 6 | interface SelectedAppResourceProvider { 7 | 8 | fun formatFileSize(size: Long): String 9 | 10 | } 11 | 12 | class SelectedAppResourceProviderImpl( 13 | val resources: Resources, 14 | ) : SelectedAppResourceProvider { 15 | 16 | override fun formatFileSize(size: Long): String { 17 | return FileHelper.formatBytes(resources, size) 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/submit/SubmitItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.submit 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class SubmitItem( 9 | override val id: Long, 10 | val editMode: Boolean, 11 | val enabled: Boolean, 12 | ) : Item, Parcelable 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/whats_new/WhatsNewItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.whats_new 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class WhatsNewItem( 9 | override val id: Long, 10 | val text: String, 11 | ) : Item, Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/adapter/whats_new/WhatsNewItemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.adapter.whats_new 2 | 3 | import com.avito.konveyor.blueprint.ItemPresenter 4 | import com.tomclaw.appsend.screen.upload.adapter.ItemListener 5 | 6 | class WhatsNewItemPresenter( 7 | private val listener: ItemListener, 8 | ) : ItemPresenter { 9 | 10 | override fun bindView(view: WhatsNewItemView, item: WhatsNewItem, position: Int) { 11 | with(view) { 12 | setText(item.text) 13 | setOnTextChangedListener { listener.onWhatsNewChanged(it) } 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/di/UploadComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.di 2 | 3 | import com.tomclaw.appsend.screen.upload.UploadActivity 4 | import com.tomclaw.appsend.util.PerActivity 5 | import dagger.Subcomponent 6 | 7 | @PerActivity 8 | @Subcomponent(modules = [UploadModule::class]) 9 | interface UploadComponent { 10 | 11 | fun inject(activity: UploadActivity) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/upload/dto/UploadScreenshot.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.upload.dto 2 | 3 | import android.net.Uri 4 | import android.os.Parcelable 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UploadScreenshot( 9 | val scrId: String?, 10 | val original: Uri, 11 | val preview: Uri, 12 | val width: Int, 13 | val height: Int, 14 | ) : Parcelable 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/adapter/ItemListener.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.adapter 2 | 3 | import com.avito.konveyor.blueprint.Item 4 | 5 | interface ItemListener { 6 | 7 | fun onItemClick(item: Item) 8 | 9 | fun onLoadMore(item: Item) 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/adapter/UserItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.adapter 2 | 3 | import android.os.Parcelable 4 | import com.avito.konveyor.blueprint.Item 5 | import com.tomclaw.appsend.user.api.UserBrief 6 | 7 | interface UserItem : Item, Parcelable { 8 | val user: UserBrief 9 | var hasMore: Boolean 10 | var hasProgress: Boolean 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/adapter/publisher/PublisherItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.adapter.publisher 2 | 3 | import com.tomclaw.appsend.screen.users.adapter.UserItem 4 | import com.tomclaw.appsend.user.api.UserBrief 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class PublisherItem( 9 | override val id: Long, 10 | val time: Long, 11 | override val user: UserBrief, 12 | override var hasMore: Boolean = false, 13 | override var hasProgress: Boolean = false, 14 | ) : UserItem 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/adapter/subscriber/SubscriberItem.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.adapter.subscriber 2 | 3 | import com.tomclaw.appsend.screen.users.adapter.UserItem 4 | import com.tomclaw.appsend.user.api.UserBrief 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class SubscriberItem( 9 | override val id: Long, 10 | val time: Long, 11 | override val user: UserBrief, 12 | override var hasMore: Boolean = false, 13 | override var hasProgress: Boolean = false, 14 | ) : UserItem 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/api/PublisherEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.user.api.UserBrief 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class PublisherEntity( 10 | @SerializedName("id") 11 | val rowId: Int, 12 | @SerializedName("time") 13 | val time: Long, 14 | @SerializedName("user") 15 | val user: UserBrief, 16 | ) : UserEntity, Parcelable -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/api/PublishersResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | class PublishersResponse( 6 | @SerializedName("entries") 7 | val entries: List 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/api/SubscriberEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.api 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.tomclaw.appsend.user.api.UserBrief 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class SubscriberEntity( 10 | @SerializedName("id") 11 | val rowId: Int, 12 | @SerializedName("time") 13 | val time: Long, 14 | @SerializedName("user") 15 | val user: UserBrief, 16 | ) : UserEntity, Parcelable -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/api/SubscribersResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | class SubscribersResponse( 6 | @SerializedName("entries") 7 | val entries: List 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/api/UserEntity.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.api 2 | 3 | interface UserEntity -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/screen/users/di/SubscribersComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.screen.users.di 2 | 3 | import com.tomclaw.appsend.screen.users.UsersFragment 4 | import com.tomclaw.appsend.util.PerFragment 5 | import dagger.Subcomponent 6 | 7 | @PerFragment 8 | @Subcomponent(modules = [SubscribersModule::class]) 9 | interface SubscribersComponent { 10 | 11 | fun inject(fragment: UsersFragment) 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/SetMetaResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload 2 | 3 | class SetMetaResponse 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/UploadInfo.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload 2 | 3 | import android.os.Parcelable 4 | import com.tomclaw.appsend.categories.CategoryItem 5 | import com.tomclaw.appsend.screen.upload.api.CheckExistResponse 6 | import com.tomclaw.appsend.screen.upload.dto.UploadScreenshot 7 | import kotlinx.parcelize.Parcelize 8 | 9 | @Parcelize 10 | data class UploadInfo( 11 | val checkExist: CheckExistResponse, 12 | val screenshots: List, 13 | val category: CategoryItem, 14 | val description: String, 15 | val whatsNew: String, 16 | val exclusive: Boolean, 17 | val openSource: Boolean, 18 | val sourceUrl: String? 19 | ) : Parcelable 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/UploadPackage.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload 2 | 3 | import android.content.pm.PackageInfo 4 | import android.os.Parcelable 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UploadPackage( 9 | val uniqueId: String, 10 | val sha1: String?, 11 | val packageName: String, 12 | ) : Parcelable 13 | 14 | @Parcelize 15 | data class UploadApk( 16 | val path: String, 17 | val version: String, 18 | val size: Long, 19 | val packageInfo: PackageInfo, 20 | ) : Parcelable 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/UploadResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UploadResponse( 9 | @SerializedName("app_id") 10 | val appId: String, 11 | @SerializedName("file_status") 12 | val fileStatus: Int, 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/UploadScreenshotsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class UploadScreenshotsResponse( 9 | @SerializedName("scr_ids") 10 | val scrIds: List, 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/UploadState.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload 2 | 3 | data class UploadState( 4 | val status: UploadStatus, 5 | val percent: Int = 0, 6 | val result: UploadResponse? = null, 7 | ) 8 | 9 | enum class UploadStatus { 10 | IDLE, 11 | AWAIT, 12 | STARTED, 13 | PROGRESS, 14 | COMPLETED, 15 | ERROR, 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/di/UploadServiceComponent.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload.di 2 | 3 | import com.tomclaw.appsend.upload.UploadService 4 | import com.tomclaw.appsend.util.PerService 5 | import dagger.Subcomponent 6 | 7 | @PerService 8 | @Subcomponent(modules = [UploadServiceModule::class]) 9 | interface UploadServiceComponent { 10 | 11 | fun inject(service: UploadService) 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/upload/di/UploadServiceModule.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.upload.di 2 | 3 | import android.content.Context 4 | import dagger.Module 5 | 6 | @Module 7 | class UploadServiceModule(context: Context) -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/user/SessionCredentials.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.user 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class SessionCredentials( 9 | @SerializedName("guid") 10 | val guid: String 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Collections.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import kotlin.math.min 4 | 5 | fun List.trim(max: Int): List { 6 | return subList(0, min(size, max)) 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Drawables.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import android.content.res.Resources 4 | import android.graphics.drawable.BitmapDrawable 5 | import android.graphics.drawable.Drawable 6 | import com.caverock.androidsvg.SVG 7 | 8 | fun svgToDrawable(icon: String, resources: Resources): Drawable { 9 | val picture = SVG.getFromString(icon).renderToPicture() 10 | val bitmap = picture.toBitmap( 11 | bitmapWidth = dpToPx(picture.width, resources), 12 | bitmapHeight = dpToPx(picture.height, resources) 13 | ) 14 | return BitmapDrawable(resources, bitmap) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Logger.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import android.util.Log 4 | 5 | interface Logger { 6 | 7 | fun log(message: String) 8 | 9 | fun log(message: String, ex: Throwable) 10 | 11 | } 12 | 13 | class LoggerImpl : Logger { 14 | 15 | override fun log(message: String) { 16 | Log.d(LOG_TAG, message) 17 | } 18 | 19 | override fun log(message: String, ex: Throwable) { 20 | Log.d(LOG_TAG, message, ex) 21 | } 22 | 23 | } 24 | 25 | private const val LOG_TAG = "appteka" 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Metrics.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import android.content.res.Resources 4 | import android.util.TypedValue 5 | 6 | fun dpToPx(px: Int, resources: Resources) = TypedValue 7 | .applyDimension(TypedValue.COMPLEX_UNIT_DIP, px.toFloat(), resources.displayMetrics) 8 | .toInt() 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/PackageInfos.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import android.content.pm.PackageInfo 4 | import android.os.Build 5 | import com.tomclaw.appsend.Appteka 6 | 7 | fun PackageInfo.versionCodeCompat(): Long { 8 | return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { 9 | longVersionCode 10 | } else { 11 | @Suppress("DEPRECATION") 12 | versionCode.toLong() 13 | } 14 | } 15 | 16 | fun PackageInfo.getLabel(): String { 17 | val packageManager = Appteka.app().packageManager 18 | return applicationInfo.loadLabel(packageManager).toString() 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Parcels.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import android.os.Parcel 4 | import android.os.Parcelable 5 | 6 | object Parcels { 7 | @JvmStatic 8 | fun creator(body: Parcel.() -> T) = object : Parcelable.Creator { 9 | override fun createFromParcel(source: Parcel) = body(source) 10 | 11 | override fun newArray(size: Int) = arrayOfNulls(size) as Array 12 | } 13 | 14 | @JvmStatic 15 | fun Parcel.writeBool(value: Boolean) = writeInt(if (value) 1 else 0) 16 | 17 | @JvmStatic 18 | fun Parcel.readBool(): Boolean = readInt() == 1 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/PerActivity.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Scope; 8 | 9 | @Scope 10 | @Documented 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface PerActivity { 13 | } 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/PerFragment.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Scope; 8 | 9 | @Scope 10 | @Documented 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface PerFragment { 13 | } 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/PerService.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Scope; 8 | 9 | @Scope 10 | @Documented 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface PerService { 13 | } 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Pictures.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.Canvas 5 | import android.graphics.Picture 6 | import android.graphics.Rect 7 | 8 | fun Picture.toBitmap( 9 | config: Bitmap.Config = Bitmap.Config.ARGB_8888, 10 | bitmapWidth: Int = width, 11 | bitmapHeight: Int = height 12 | ): Bitmap { 13 | val bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, config) 14 | val canvas = Canvas(bitmap) 15 | val rect = Rect(0, 0, bitmapWidth, bitmapHeight) 16 | canvas.drawPicture(this, rect) 17 | canvas.setBitmap(null) 18 | return bitmap 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Streams.kt: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util 2 | 3 | import java.io.Closeable 4 | import java.io.IOException 5 | 6 | fun Closeable?.safeClose() { 7 | try { 8 | this?.close() 9 | } catch (ignored: IOException) { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/Unobfuscatable.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util; 2 | 3 | /** 4 | * Created with IntelliJ IDEA. 5 | * User: solkin 6 | * Date: 2/28/14 7 | * Time: 3:09 PM 8 | */ 9 | public interface Unobfuscatable { 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/tomclaw/appsend/util/states/State.java: -------------------------------------------------------------------------------- 1 | package com.tomclaw.appsend.util.states; 2 | 3 | import android.os.Parcelable; 4 | 5 | import com.tomclaw.appsend.util.Unobfuscatable; 6 | 7 | public abstract class State implements Parcelable, Unobfuscatable { 8 | 9 | public State() { 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_star_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-hdpi/ic_star_black_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_star_grey600_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-hdpi/ic_star_grey600_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/app_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-nodpi/app_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_star_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xhdpi/ic_star_black_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_star_grey600_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xhdpi/ic_star_grey600_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/discuss_background_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xxhdpi/discuss_background_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/discuss_background_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xxhdpi/discuss_background_light.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_star_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xxhdpi/ic_star_black_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_star_grey600_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xxhdpi/ic_star_grey600_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_star_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xxxhdpi/ic_star_black_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_star_grey600_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/drawable-xxxhdpi/ic_star_grey600_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/account.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/append_image_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/append_image_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/check_all.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/check_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/clock.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cloud.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/compose_background_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/compose_background_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/compose_gradient_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/compose_gradient_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/discuss.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/discuss_back_dark_repeat.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/discuss_back_light_repeat.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit_text_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/feed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_account.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_account_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_account_minus.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_account_plus.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alert.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alert_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apps.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_archive_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_forward.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_block.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_category.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud_upload.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_creation.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_crown.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_forever.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_discuss.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_discuss_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dots_vertical.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download_box_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_error.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite_outline.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_floppy.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_google_play.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_image_plus.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_inbox_full.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_inbox_full_outline.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_install.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_location.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_open.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_moderators.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_new_box.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pencil.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_permissions.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pill.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pin.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pin_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reply.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_run.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sms.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_14.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_smooth.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_storage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_store.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_translate.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_user_messages.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_warning.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/numeric.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/online_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_feed_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_feed_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radial_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rating_bar_small.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rating_detail_element.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_grey_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_grey_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_name_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_name_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_white_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_white_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_transparent_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_transparent_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_white_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_white_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/service_background_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/service_background_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_inverted.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/unread_badge.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/user_icon_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/details_play_item_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/feed_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/gallery_image_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/profile_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/progress_overlay.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/progress_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/time_inc_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/user_files_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/abuse_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/chat_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/distro_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/menu/gallery_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/home_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 11 | 16 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/installed_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/menu/profile_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/rating_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/menu/review_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/menu/unlink_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values/defaults.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | false 5 | @string/sort_order_ascending_value 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 108dp 5 | 168dp 6 | 7 | 110dp 8 | 110dp 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #2F9B04 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/pref_keys.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | pref_base_settings 4 | pref_dark_theme 5 | pref_show_system 6 | pref_sort_order 7 | pref_clear_cache 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/values.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | https://4pda.to/forum/index.php?showtopic=1063912 4 | https://t.me/appsend_store 5 | https://appteka.store/legal/ 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_descriptor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /art/app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/art/app.jpg -------------------------------------------------------------------------------- /art/chat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/art/chat.jpg -------------------------------------------------------------------------------- /art/main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/art/main.jpg -------------------------------------------------------------------------------- /art/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/art/profile.jpg -------------------------------------------------------------------------------- /art/topics.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/art/topics.jpg -------------------------------------------------------------------------------- /art/upload.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/art/upload.jpg -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.nonFinalResIds=false 3 | android.nonTransitiveRClass=true 4 | android.useAndroidX=true 5 | org.gradle.jvmargs=-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 6 | org.gradle.unsafe.configuration-cache=true 7 | 8 | android.enableR8.fullMode=false 9 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /graphics/App Shortcut icons.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/graphics/App Shortcut icons.sketch -------------------------------------------------------------------------------- /graphics/appsend.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/graphics/appsend.sketch -------------------------------------------------------------------------------- /graphics/appteka-logo.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/graphics/appteka-logo.sketch -------------------------------------------------------------------------------- /graphics/doodle.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/graphics/doodle.sketch -------------------------------------------------------------------------------- /graphics/web_hi_res_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/graphics/web_hi_res_512.png -------------------------------------------------------------------------------- /preference-fragment/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdk 34 5 | 6 | defaultConfig { 7 | minSdkVersion 21 8 | //noinspection ExpiredTargetSdkVersion 9 | targetSdkVersion 28 10 | } 11 | 12 | dependencies { 13 | compileOnly 'androidx.appcompat:appcompat:1.7.0' 14 | } 15 | namespace 'com.github.machinarius.preferencefragment' 16 | } 17 | -------------------------------------------------------------------------------- /preference-fragment/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ":preference-fragment" 2 | -------------------------------------------------------------------------------- /tomclaw.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solkin/appteka-android/a68c8eed80f61b72a26a5324cfa63d80777b12b5/tomclaw.keystore --------------------------------------------------------------------------------