├── .gitignore ├── .travis.yml ├── COPYING.txt ├── Kuroba ├── .idea │ └── codeStyles │ │ ├── KurobaCodeStyle.xml │ │ └── codeStyleConfig.xml ├── app │ ├── build.gradle │ ├── debug.properties │ ├── debug_ks.jks │ ├── proguard.cfg │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ ├── archives.json │ │ │ ├── captcha │ │ │ │ ├── captcha2.html │ │ │ │ └── captcha_legacy.html │ │ │ ├── font │ │ │ │ ├── OPTICubaLibreTwo.otf │ │ │ │ └── Talleyrand.ttf │ │ │ └── html │ │ │ │ ├── license.html │ │ │ │ └── licenses.html │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── github │ │ │ │ └── adamantcheese │ │ │ │ └── chan │ │ │ │ ├── Chan.java │ │ │ │ ├── ChanState.java │ │ │ │ ├── StartActivity.java │ │ │ │ ├── controller │ │ │ │ ├── Controller.java │ │ │ │ ├── ControllerTransition.java │ │ │ │ ├── NavigationController.java │ │ │ │ ├── transition │ │ │ │ │ ├── FadeInTransition.java │ │ │ │ │ ├── FadeOutTransition.java │ │ │ │ │ ├── PopControllerTransition.java │ │ │ │ │ └── PushControllerTransition.java │ │ │ │ └── ui │ │ │ │ │ └── NavigationControllerContainerLayout.java │ │ │ │ ├── core │ │ │ │ ├── base │ │ │ │ │ ├── BasePresenter.kt │ │ │ │ │ └── MResult.kt │ │ │ │ ├── cache │ │ │ │ │ ├── CacheHandler.kt │ │ │ │ │ ├── FileCacheListener.java │ │ │ │ │ ├── FileCacheV2.kt │ │ │ │ │ ├── MediaSourceCallback.kt │ │ │ │ │ ├── downloader │ │ │ │ │ │ ├── ActiveDownloads.kt │ │ │ │ │ │ ├── CancelableDownload.kt │ │ │ │ │ │ ├── ChunkDownloadEvent.kt │ │ │ │ │ │ ├── ChunkDownloader.kt │ │ │ │ │ │ ├── ChunkMerger.kt │ │ │ │ │ │ ├── ChunkPersister.kt │ │ │ │ │ │ ├── ChunkResponse.kt │ │ │ │ │ │ ├── Chunker.kt │ │ │ │ │ │ ├── ConcurrentChunkedFileDownloader.kt │ │ │ │ │ │ ├── DownloadState.kt │ │ │ │ │ │ ├── DownloaderUtils.kt │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── FileDownloadRequest.kt │ │ │ │ │ │ ├── FileDownloadResult.kt │ │ │ │ │ │ ├── FileDownloader.kt │ │ │ │ │ │ ├── Logging.kt │ │ │ │ │ │ ├── PartialContentCheckResult.kt │ │ │ │ │ │ └── PartialContentSupportChecker.kt │ │ │ │ │ └── stream │ │ │ │ │ │ ├── WebmStreamingDataSource.java │ │ │ │ │ │ └── WebmStreamingSource.kt │ │ │ │ ├── database │ │ │ │ │ ├── DatabaseBoardManager.java │ │ │ │ │ ├── DatabaseFilterManager.java │ │ │ │ │ ├── DatabaseHelper.java │ │ │ │ │ ├── DatabaseHideManager.java │ │ │ │ │ ├── DatabaseHistoryManager.java │ │ │ │ │ ├── DatabaseLoadableManager.java │ │ │ │ │ ├── DatabaseManager.java │ │ │ │ │ ├── DatabasePinManager.java │ │ │ │ │ ├── DatabaseSavedReplyManager.java │ │ │ │ │ ├── DatabaseSavedThreadManager.java │ │ │ │ │ └── DatabaseSiteManager.java │ │ │ │ ├── di │ │ │ │ │ ├── AppModule.java │ │ │ │ │ ├── DatabaseModule.java │ │ │ │ │ ├── GsonModule.java │ │ │ │ │ ├── ManagerModule.java │ │ │ │ │ ├── NetModule.java │ │ │ │ │ ├── RepositoryModule.java │ │ │ │ │ └── SiteModule.java │ │ │ │ ├── image │ │ │ │ │ └── ImageLoaderV2.java │ │ │ │ ├── kt_extensions │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── manager │ │ │ │ │ ├── ArchivesManager.java │ │ │ │ │ ├── BoardManager.java │ │ │ │ │ ├── FilterEngine.java │ │ │ │ │ ├── FilterType.java │ │ │ │ │ ├── FilterWatchManager.java │ │ │ │ │ ├── PageRequestManager.java │ │ │ │ │ ├── ReplyManager.java │ │ │ │ │ ├── SavedThreadLoaderManager.kt │ │ │ │ │ ├── ThreadSaveManager.java │ │ │ │ │ ├── UpdateManager.java │ │ │ │ │ ├── WakeManager.java │ │ │ │ │ └── WatchManager.java │ │ │ │ ├── mapper │ │ │ │ │ ├── BoardMapper.java │ │ │ │ │ ├── PostImageMapper.java │ │ │ │ │ ├── PostMapper.java │ │ │ │ │ ├── SiteMapper.java │ │ │ │ │ ├── SpannableStringMapper.java │ │ │ │ │ └── ThreadMapper.java │ │ │ │ ├── model │ │ │ │ │ ├── Archive.java │ │ │ │ │ ├── ChanThread.java │ │ │ │ │ ├── Post.java │ │ │ │ │ ├── PostHttpIcon.java │ │ │ │ │ ├── PostImage.java │ │ │ │ │ ├── PostLinkable.java │ │ │ │ │ ├── export │ │ │ │ │ │ ├── ExportedAppSettings.java │ │ │ │ │ │ ├── ExportedBoard.java │ │ │ │ │ │ ├── ExportedFilter.java │ │ │ │ │ │ ├── ExportedLoadable.java │ │ │ │ │ │ ├── ExportedPin.java │ │ │ │ │ │ ├── ExportedPostHide.java │ │ │ │ │ │ ├── ExportedSavedThread.java │ │ │ │ │ │ └── ExportedSite.java │ │ │ │ │ ├── json │ │ │ │ │ │ └── site │ │ │ │ │ │ │ └── SiteConfig.java │ │ │ │ │ ├── orm │ │ │ │ │ │ ├── Board.java │ │ │ │ │ │ ├── Filter.java │ │ │ │ │ │ ├── History.java │ │ │ │ │ │ ├── Loadable.java │ │ │ │ │ │ ├── Pin.java │ │ │ │ │ │ ├── PinType.java │ │ │ │ │ │ ├── PostHide.java │ │ │ │ │ │ ├── SavedReply.java │ │ │ │ │ │ ├── SavedThread.java │ │ │ │ │ │ └── SiteModel.java │ │ │ │ │ └── save │ │ │ │ │ │ ├── SerializableBoard.java │ │ │ │ │ │ ├── SerializablePost.java │ │ │ │ │ │ ├── SerializablePostImage.java │ │ │ │ │ │ ├── SerializableSite.java │ │ │ │ │ │ ├── SerializableThread.java │ │ │ │ │ │ └── spans │ │ │ │ │ │ ├── SerializableAbsoluteSizeSpan.java │ │ │ │ │ │ ├── SerializableBackgroundColorSpan.java │ │ │ │ │ │ ├── SerializableForegroundColorSpan.java │ │ │ │ │ │ ├── SerializablePostLinkableSpan.java │ │ │ │ │ │ ├── SerializableSpannableString.java │ │ │ │ │ │ ├── SerializableStyleSpan.java │ │ │ │ │ │ ├── SerializableTypefaceSpan.java │ │ │ │ │ │ └── linkable │ │ │ │ │ │ ├── PostLinkThreadLinkValue.java │ │ │ │ │ │ ├── PostLinkableBoardLinkValue.java │ │ │ │ │ │ ├── PostLinkableLinkValue.java │ │ │ │ │ │ ├── PostLinkableQuoteValue.java │ │ │ │ │ │ ├── PostLinkableSearchLinkValue.java │ │ │ │ │ │ ├── PostLinkableSpoilerValue.java │ │ │ │ │ │ └── PostLinkableValue.java │ │ │ │ ├── net │ │ │ │ │ ├── BitmapLruImageCache.java │ │ │ │ │ ├── HtmlReaderRequest.java │ │ │ │ │ ├── JsonReaderRequest.java │ │ │ │ │ ├── ProxiedHurlStack.java │ │ │ │ │ └── UpdateApiRequest.java │ │ │ │ ├── pool │ │ │ │ │ └── ChanLoaderFactory.java │ │ │ │ ├── presenter │ │ │ │ │ ├── ArchivePresenter.java │ │ │ │ │ ├── BoardSetupPresenter.java │ │ │ │ │ ├── BoardsMenuPresenter.java │ │ │ │ │ ├── BrowsePresenter.java │ │ │ │ │ ├── ImageReencodingPresenter.java │ │ │ │ │ ├── ImageViewerPresenter.java │ │ │ │ │ ├── ImportExportSettingsPresenter.java │ │ │ │ │ ├── MediaSettingsControllerPresenter.kt │ │ │ │ │ ├── ReplyPresenter.java │ │ │ │ │ ├── SettingsPresenter.java │ │ │ │ │ ├── SiteSetupPresenter.java │ │ │ │ │ ├── SitesSetupPresenter.java │ │ │ │ │ └── ThreadPresenter.java │ │ │ │ ├── receiver │ │ │ │ │ └── WakeUpdateReceiver.java │ │ │ │ ├── repository │ │ │ │ │ ├── BoardRepository.java │ │ │ │ │ ├── ImportExportRepository.kt │ │ │ │ │ ├── LastReplyRepository.java │ │ │ │ │ ├── SavedThreadLoaderRepository.kt │ │ │ │ │ └── SiteRepository.java │ │ │ │ ├── saver │ │ │ │ │ ├── FileWatcher.java │ │ │ │ │ ├── ImageSaveTask.java │ │ │ │ │ ├── ImageSaver.java │ │ │ │ │ └── StorageHelper.java │ │ │ │ ├── settings │ │ │ │ │ ├── BooleanSetting.java │ │ │ │ │ ├── ChanSettings.java │ │ │ │ │ ├── CounterSetting.java │ │ │ │ │ ├── IntegerSetting.java │ │ │ │ │ ├── LongSetting.java │ │ │ │ │ ├── OptionSettingItem.java │ │ │ │ │ ├── OptionsSetting.java │ │ │ │ │ ├── Setting.java │ │ │ │ │ ├── SettingProvider.java │ │ │ │ │ ├── SharedPreferencesSettingProvider.java │ │ │ │ │ ├── StringSetting.java │ │ │ │ │ ├── base_dir │ │ │ │ │ │ ├── BaseDirectorySetting.kt │ │ │ │ │ │ ├── LocalThreadsBaseDirSetting.kt │ │ │ │ │ │ └── SavedFilesBaseDirSetting.kt │ │ │ │ │ └── json │ │ │ │ │ │ ├── BooleanJsonSetting.java │ │ │ │ │ │ ├── IntegerJsonSetting.java │ │ │ │ │ │ ├── JsonSetting.java │ │ │ │ │ │ ├── JsonSettings.java │ │ │ │ │ │ ├── JsonSettingsProvider.java │ │ │ │ │ │ ├── LongJsonSetting.java │ │ │ │ │ │ ├── RuntimeTypeAdapterFactory.java │ │ │ │ │ │ └── StringJsonSetting.java │ │ │ │ └── site │ │ │ │ │ ├── ChunkDownloaderSiteProperties.kt │ │ │ │ │ ├── ImageSearch.java │ │ │ │ │ ├── Site.java │ │ │ │ │ ├── SiteActions.java │ │ │ │ │ ├── SiteAuthentication.java │ │ │ │ │ ├── SiteBase.java │ │ │ │ │ ├── SiteEndpoints.java │ │ │ │ │ ├── SiteIcon.java │ │ │ │ │ ├── SiteRegistry.java │ │ │ │ │ ├── SiteRequestModifier.java │ │ │ │ │ ├── SiteResolver.java │ │ │ │ │ ├── SiteService.java │ │ │ │ │ ├── SiteSetting.java │ │ │ │ │ ├── SiteUrlHandler.java │ │ │ │ │ ├── common │ │ │ │ │ ├── CommonReplyHttpCall.java │ │ │ │ │ ├── CommonSite.java │ │ │ │ │ ├── DefaultPostParser.java │ │ │ │ │ ├── FutabaChanReader.java │ │ │ │ │ ├── MultipartHttpCall.java │ │ │ │ │ └── vichan │ │ │ │ │ │ ├── VichanActions.java │ │ │ │ │ │ ├── VichanAntispam.java │ │ │ │ │ │ ├── VichanApi.java │ │ │ │ │ │ ├── VichanCommentParser.java │ │ │ │ │ │ └── VichanEndpoints.java │ │ │ │ │ ├── http │ │ │ │ │ ├── DeleteRequest.java │ │ │ │ │ ├── DeleteResponse.java │ │ │ │ │ ├── HttpCall.java │ │ │ │ │ ├── HttpCallManager.java │ │ │ │ │ ├── LoginRequest.java │ │ │ │ │ ├── LoginResponse.java │ │ │ │ │ ├── ProgressRequestBody.java │ │ │ │ │ ├── Reply.java │ │ │ │ │ └── ReplyResponse.java │ │ │ │ │ ├── loader │ │ │ │ │ ├── ChanLoaderRequest.java │ │ │ │ │ ├── ChanLoaderRequestParams.java │ │ │ │ │ ├── ChanLoaderResponse.java │ │ │ │ │ └── ChanThreadLoader.java │ │ │ │ │ ├── parser │ │ │ │ │ ├── ChanReader.java │ │ │ │ │ ├── ChanReaderProcessingQueue.java │ │ │ │ │ ├── ChanReaderRequest.java │ │ │ │ │ ├── CommentParser.java │ │ │ │ │ ├── CommentParserHelper.java │ │ │ │ │ ├── MockReplyManager.kt │ │ │ │ │ ├── PostParseCallable.java │ │ │ │ │ ├── PostParser.java │ │ │ │ │ └── StyleRule.java │ │ │ │ │ └── sites │ │ │ │ │ ├── Arisuchan.java │ │ │ │ │ ├── Lainchan.java │ │ │ │ │ ├── Sushichan.java │ │ │ │ │ ├── Wired7.java │ │ │ │ │ ├── chan4 │ │ │ │ │ ├── Chan4.java │ │ │ │ │ ├── Chan4ArchiveRequest.java │ │ │ │ │ ├── Chan4BoardsRequest.java │ │ │ │ │ ├── Chan4DeleteHttpCall.java │ │ │ │ │ ├── Chan4PagesRequest.java │ │ │ │ │ ├── Chan4PassHttpCall.java │ │ │ │ │ └── Chan4ReplyCall.java │ │ │ │ │ └── dvach │ │ │ │ │ ├── Dvach.java │ │ │ │ │ ├── DvachApi.java │ │ │ │ │ ├── DvachBoardsRequest.java │ │ │ │ │ ├── DvachCommentParser.java │ │ │ │ │ ├── DvachPostParser.java │ │ │ │ │ └── DvachReplyCall.java │ │ │ │ ├── report │ │ │ │ ├── ReportActivityView.kt │ │ │ │ ├── ReportProblemController.kt │ │ │ │ └── ReportProblemPresenter.kt │ │ │ │ ├── ui │ │ │ │ ├── adapter │ │ │ │ │ ├── DrawerAdapter.java │ │ │ │ │ ├── FilesAdapter.java │ │ │ │ │ ├── ImageViewerAdapter.java │ │ │ │ │ ├── PostAdapter.java │ │ │ │ │ └── PostsFilter.java │ │ │ │ ├── captcha │ │ │ │ │ ├── AuthenticationLayoutCallback.java │ │ │ │ │ ├── AuthenticationLayoutInterface.java │ │ │ │ │ ├── CaptchaHolder.java │ │ │ │ │ ├── CaptchaLayout.java │ │ │ │ │ ├── GenericWebViewAuthenticationLayout.java │ │ │ │ │ ├── LegacyCaptchaLayout.java │ │ │ │ │ ├── v1 │ │ │ │ │ │ └── CaptchaNojsLayoutV1.java │ │ │ │ │ └── v2 │ │ │ │ │ │ ├── CaptchaInfo.java │ │ │ │ │ │ ├── CaptchaNoJsHtmlParser.java │ │ │ │ │ │ ├── CaptchaNoJsLayoutV2.java │ │ │ │ │ │ ├── CaptchaNoJsPresenterV2.java │ │ │ │ │ │ └── CaptchaNoJsV2Adapter.java │ │ │ │ ├── cell │ │ │ │ │ ├── AlbumViewCell.java │ │ │ │ │ ├── CardPostCell.java │ │ │ │ │ ├── PostCell.java │ │ │ │ │ ├── PostCellInterface.java │ │ │ │ │ ├── PostStubCell.java │ │ │ │ │ └── ThreadStatusCell.java │ │ │ │ ├── controller │ │ │ │ │ ├── AlbumDownloadController.java │ │ │ │ │ ├── AlbumViewController.java │ │ │ │ │ ├── ArchiveController.java │ │ │ │ │ ├── BaseFloatingController.java │ │ │ │ │ ├── BoardSetupController.java │ │ │ │ │ ├── BrowseController.java │ │ │ │ │ ├── DoubleNavigationController.java │ │ │ │ │ ├── DrawerController.java │ │ │ │ │ ├── FiltersController.java │ │ │ │ │ ├── HistoryController.java │ │ │ │ │ ├── ImageOptionsController.java │ │ │ │ │ ├── ImageReencodeOptionsController.java │ │ │ │ │ ├── ImageViewerController.java │ │ │ │ │ ├── ImageViewerNavigationController.java │ │ │ │ │ ├── LicensesController.java │ │ │ │ │ ├── LoadingViewController.java │ │ │ │ │ ├── LoginController.java │ │ │ │ │ ├── LogsController.java │ │ │ │ │ ├── PopupController.java │ │ │ │ │ ├── PostRepliesController.java │ │ │ │ │ ├── RemovedPostsController.java │ │ │ │ │ ├── ReportController.java │ │ │ │ │ ├── SaveLocationController.java │ │ │ │ │ ├── SiteSetupController.java │ │ │ │ │ ├── SitesSetupController.java │ │ │ │ │ ├── SplitNavigationController.java │ │ │ │ │ ├── StyledToolbarNavigationController.java │ │ │ │ │ ├── ThreadController.java │ │ │ │ │ ├── ThreadSlideController.java │ │ │ │ │ ├── ToolbarNavigationController.java │ │ │ │ │ ├── ViewThreadController.java │ │ │ │ │ └── settings │ │ │ │ │ │ ├── AppearanceSettingsController.java │ │ │ │ │ │ ├── BehaviourSettingsController.java │ │ │ │ │ │ ├── DeveloperSettingsController.java │ │ │ │ │ │ ├── ExperimentalSettingsController.java │ │ │ │ │ │ ├── ImportExportSettingsController.java │ │ │ │ │ │ ├── MainSettingsController.java │ │ │ │ │ │ ├── MediaSettingsController.java │ │ │ │ │ │ ├── MediaSettingsControllerCallbacks.java │ │ │ │ │ │ ├── SettingsController.java │ │ │ │ │ │ ├── ThemeSettingsController.java │ │ │ │ │ │ ├── WatchSettingsController.java │ │ │ │ │ │ └── captcha │ │ │ │ │ │ ├── JsCaptchaCookiesEditorController.kt │ │ │ │ │ │ └── JsCaptchaCookiesJar.kt │ │ │ │ ├── helper │ │ │ │ │ ├── BoardHelper.java │ │ │ │ │ ├── HintPopup.java │ │ │ │ │ ├── ImageOptionsHelper.java │ │ │ │ │ ├── ImagePickDelegate.java │ │ │ │ │ ├── PinHelper.java │ │ │ │ │ ├── PostHelper.java │ │ │ │ │ ├── PostPopupHelper.java │ │ │ │ │ ├── RefreshUIMessage.java │ │ │ │ │ ├── RemovedPostsHelper.java │ │ │ │ │ └── RuntimePermissionsHelper.java │ │ │ │ ├── layout │ │ │ │ │ ├── ArchivesLayout.java │ │ │ │ │ ├── BoardAddLayout.java │ │ │ │ │ ├── BrowseBoardsFloatingMenu.java │ │ │ │ │ ├── DrawerWidthAdjustingLayout.java │ │ │ │ │ ├── FilesLayout.java │ │ │ │ │ ├── FilterLayout.java │ │ │ │ │ ├── FixedRatioLinearLayout.java │ │ │ │ │ ├── NewFolderLayout.java │ │ │ │ │ ├── PopupControllerContainer.java │ │ │ │ │ ├── PostRepliesContainer.java │ │ │ │ │ ├── ReplyLayout.java │ │ │ │ │ ├── SearchLayout.java │ │ │ │ │ ├── SelectLayout.java │ │ │ │ │ ├── SiteAddLayout.java │ │ │ │ │ ├── SplitNavigationControllerLayout.java │ │ │ │ │ ├── ThreadLayout.java │ │ │ │ │ ├── ThreadListLayout.java │ │ │ │ │ └── ThreadSlidingPaneLayout.java │ │ │ │ ├── service │ │ │ │ │ ├── LastPageNotification.java │ │ │ │ │ ├── SavingNotification.java │ │ │ │ │ └── WatchNotification.java │ │ │ │ ├── settings │ │ │ │ │ ├── BooleanSettingView.java │ │ │ │ │ ├── IntegerSettingView.java │ │ │ │ │ ├── LinkSettingView.java │ │ │ │ │ ├── ListSettingView.java │ │ │ │ │ ├── SettingView.java │ │ │ │ │ ├── SettingsGroup.java │ │ │ │ │ ├── StringSettingView.java │ │ │ │ │ └── base_directory │ │ │ │ │ │ ├── LocalThreadsBaseDirectory.kt │ │ │ │ │ │ └── SavedFilesBaseDirectory.kt │ │ │ │ ├── text │ │ │ │ │ ├── AbsoluteSizeSpanHashed.java │ │ │ │ │ ├── BackgroundColorSpanHashed.java │ │ │ │ │ ├── FastTextView.java │ │ │ │ │ ├── FastTextViewMovementMethod.java │ │ │ │ │ └── ForegroundColorSpanHashed.java │ │ │ │ ├── theme │ │ │ │ │ ├── ArrowMenuDrawable.java │ │ │ │ │ ├── DarkTheme.java │ │ │ │ │ ├── DropdownArrowDrawable.java │ │ │ │ │ ├── Theme.java │ │ │ │ │ └── ThemeHelper.java │ │ │ │ ├── toolbar │ │ │ │ │ ├── NavigationItem.java │ │ │ │ │ ├── Toolbar.java │ │ │ │ │ ├── ToolbarContainer.java │ │ │ │ │ ├── ToolbarMenu.java │ │ │ │ │ ├── ToolbarMenuItem.java │ │ │ │ │ ├── ToolbarMenuSubItem.java │ │ │ │ │ ├── ToolbarMenuView.java │ │ │ │ │ ├── ToolbarMiddleMenu.java │ │ │ │ │ └── ToolbarPresenter.java │ │ │ │ ├── view │ │ │ │ │ ├── ColorPickerView.java │ │ │ │ │ ├── CrossfadeView.java │ │ │ │ │ ├── CustomScaleImageView.java │ │ │ │ │ ├── DividerItemDecoration.java │ │ │ │ │ ├── FastScroller.java │ │ │ │ │ ├── FastScrollerHelper.java │ │ │ │ │ ├── FixedRatioThumbnailView.java │ │ │ │ │ ├── FloatingMenu.java │ │ │ │ │ ├── FloatingMenuItem.java │ │ │ │ │ ├── GridRecyclerView.java │ │ │ │ │ ├── HidingFloatingActionButton.java │ │ │ │ │ ├── LoadView.java │ │ │ │ │ ├── LoadingBar.java │ │ │ │ │ ├── MultiImageView.java │ │ │ │ │ ├── MultiImageViewGestureDetector.kt │ │ │ │ │ ├── OptionalSwipeViewPager.java │ │ │ │ │ ├── PostImageThumbnailView.java │ │ │ │ │ ├── SelectionListeningEditText.java │ │ │ │ │ ├── ThumbnailImageView.kt │ │ │ │ │ ├── ThumbnailView.java │ │ │ │ │ ├── TouchBlockingFrameLayout.java │ │ │ │ │ ├── TouchBlockingLinearLayout.java │ │ │ │ │ ├── TransitionImageView.java │ │ │ │ │ └── ViewPagerAdapter.java │ │ │ │ └── widget │ │ │ │ │ └── CancellableToast.kt │ │ │ │ └── utils │ │ │ │ ├── AndroidUtils.java │ │ │ │ ├── AnimationUtils.java │ │ │ │ ├── BackgroundUtils.java │ │ │ │ ├── BitmapUtils.java │ │ │ │ ├── ConversionUtils.kt │ │ │ │ ├── HashingUtil.kt │ │ │ │ ├── IOUtils.java │ │ │ │ ├── ImageDecoder.java │ │ │ │ ├── Logger.java │ │ │ │ ├── PostUtils.java │ │ │ │ ├── RecyclerUtils.java │ │ │ │ └── StringUtils.java │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ ├── ic_action_pause.png │ │ │ ├── ic_add_white_24dp.png │ │ │ ├── ic_arrow_back_white_24dp.png │ │ │ ├── ic_arrow_forward_black_24dp.png │ │ │ ├── ic_bookmark_outline_white_24dp.png │ │ │ ├── ic_bookmark_white_24dp.png │ │ │ ├── ic_clear_white_24dp.png │ │ │ ├── ic_create_white_24dp.png │ │ │ ├── ic_done_white_24dp.png │ │ │ ├── ic_expand_less_black_24dp.png │ │ │ ├── ic_expand_more_black_24dp.png │ │ │ ├── ic_file_download_white_24dp.png │ │ │ ├── ic_help_outline_white_24dp.png │ │ │ ├── ic_history_white_24dp.png │ │ │ ├── ic_image_white_24dp.png │ │ │ ├── ic_more_vert_white_24dp.png │ │ │ ├── ic_overflow.png │ │ │ ├── ic_overflow_black.png │ │ │ ├── ic_play_circle_outline_white_24dp.png │ │ │ ├── ic_play_circle_outline_white_48dp.png │ │ │ ├── ic_radio_button_unchecked_white_24dp.png │ │ │ ├── ic_refresh_white_24dp.png │ │ │ ├── ic_reorder_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_select_all_white_24dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_settings_white_24dp.png │ │ │ ├── ic_stat_notify.png │ │ │ ├── ic_stat_notify_alert.png │ │ │ ├── ic_subdirectory_arrow_left_white_24dp.png │ │ │ ├── ic_task_description.png │ │ │ ├── ic_view_list_24dp.png │ │ │ ├── ic_view_module_24dp.png │ │ │ ├── ic_volume_off_white_24dp.png │ │ │ ├── ic_volume_up_white_24dp.png │ │ │ └── partyhat.png │ │ │ ├── drawable-mdpi │ │ │ ├── archived_icon.png │ │ │ ├── closed_icon.png │ │ │ ├── error_icon.png │ │ │ ├── ic_action_pause.png │ │ │ ├── ic_add_white_24dp.png │ │ │ ├── ic_arrow_back_white_24dp.png │ │ │ ├── ic_arrow_forward_black_24dp.png │ │ │ ├── ic_bookmark_outline_white_24dp.png │ │ │ ├── ic_bookmark_white_24dp.png │ │ │ ├── ic_chevron_left_black_24dp.xml │ │ │ ├── ic_clear_white_24dp.png │ │ │ ├── ic_create_white_24dp.png │ │ │ ├── ic_done_white_24dp.png │ │ │ ├── ic_expand_less_black_24dp.png │ │ │ ├── ic_expand_more_black_24dp.png │ │ │ ├── ic_file_download_white_24dp.png │ │ │ ├── ic_help_outline_white_24dp.png │ │ │ ├── ic_history_white_24dp.png │ │ │ ├── ic_image_white_24dp.png │ │ │ ├── ic_more_vert_white_24dp.png │ │ │ ├── ic_overflow.png │ │ │ ├── ic_overflow_black.png │ │ │ ├── ic_play_circle_outline_white_24dp.png │ │ │ ├── ic_play_circle_outline_white_48dp.png │ │ │ ├── ic_radio_button_unchecked_white_24dp.png │ │ │ ├── ic_refresh_white_24dp.png │ │ │ ├── ic_reorder_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_select_all_white_24dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_settings_white_24dp.png │ │ │ ├── ic_stat_notify.png │ │ │ ├── ic_stat_notify_alert.png │ │ │ ├── ic_subdirectory_arrow_left_white_24dp.png │ │ │ ├── ic_task_description.png │ │ │ ├── ic_view_list_24dp.png │ │ │ ├── ic_view_module_24dp.png │ │ │ ├── ic_volume_off_white_24dp.png │ │ │ ├── ic_volume_up_white_24dp.png │ │ │ ├── sticky_icon.png │ │ │ ├── trash_icon.png │ │ │ └── youtube_icon.png │ │ │ ├── drawable-xhdpi │ │ │ ├── ic_action_pause.png │ │ │ ├── ic_add_white_24dp.png │ │ │ ├── ic_arrow_back_white_24dp.png │ │ │ ├── ic_arrow_forward_black_24dp.png │ │ │ ├── ic_bookmark_outline_white_24dp.png │ │ │ ├── ic_bookmark_white_24dp.png │ │ │ ├── ic_clear_white_24dp.png │ │ │ ├── ic_create_white_24dp.png │ │ │ ├── ic_done_white_24dp.png │ │ │ ├── ic_expand_less_black_24dp.png │ │ │ ├── ic_expand_more_black_24dp.png │ │ │ ├── ic_file_download_white_24dp.png │ │ │ ├── ic_help_outline_white_24dp.png │ │ │ ├── ic_history_white_24dp.png │ │ │ ├── ic_image_white_24dp.png │ │ │ ├── ic_more_vert_white_24dp.png │ │ │ ├── ic_overflow.png │ │ │ ├── ic_overflow_black.png │ │ │ ├── ic_play_circle_outline_white_24dp.png │ │ │ ├── ic_play_circle_outline_white_48dp.png │ │ │ ├── ic_radio_button_unchecked_white_24dp.png │ │ │ ├── ic_refresh_white_24dp.png │ │ │ ├── ic_reorder_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_select_all_white_24dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_settings_white_24dp.png │ │ │ ├── ic_stat_notify.png │ │ │ ├── ic_stat_notify_alert.png │ │ │ ├── ic_subdirectory_arrow_left_white_24dp.png │ │ │ ├── ic_task_description.png │ │ │ ├── ic_view_list_24dp.png │ │ │ ├── ic_view_module_24dp.png │ │ │ ├── ic_volume_off_white_24dp.png │ │ │ └── ic_volume_up_white_24dp.png │ │ │ ├── drawable-xxhdpi │ │ │ ├── ic_action_pause.png │ │ │ ├── ic_add_white_24dp.png │ │ │ ├── ic_arrow_back_white_24dp.png │ │ │ ├── ic_arrow_forward_black_24dp.png │ │ │ ├── ic_bookmark_outline_white_24dp.png │ │ │ ├── ic_bookmark_white_24dp.png │ │ │ ├── ic_clear_white_24dp.png │ │ │ ├── ic_create_white_24dp.png │ │ │ ├── ic_done_white_24dp.png │ │ │ ├── ic_expand_less_black_24dp.png │ │ │ ├── ic_expand_more_black_24dp.png │ │ │ ├── ic_file_download_white_24dp.png │ │ │ ├── ic_folder_black_24dp.xml │ │ │ ├── ic_help_outline_white_24dp.png │ │ │ ├── ic_history_white_24dp.png │ │ │ ├── ic_image_white_24dp.png │ │ │ ├── ic_more_vert_white_24dp.png │ │ │ ├── ic_overflow.png │ │ │ ├── ic_overflow_black.png │ │ │ ├── ic_play_circle_outline_white_24dp.png │ │ │ ├── ic_play_circle_outline_white_48dp.png │ │ │ ├── ic_radio_button_unchecked_white_24dp.png │ │ │ ├── ic_refresh_white_24dp.png │ │ │ ├── ic_reorder_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_select_all_white_24dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_settings_white_24dp.png │ │ │ ├── ic_stat_notify.png │ │ │ ├── ic_stat_notify_alert.png │ │ │ ├── ic_subdirectory_arrow_left_white_24dp.png │ │ │ ├── ic_task_description.png │ │ │ ├── ic_view_list_24dp.png │ │ │ ├── ic_view_module_24dp.png │ │ │ ├── ic_volume_off_white_24dp.png │ │ │ └── ic_volume_up_white_24dp.png │ │ │ ├── drawable-xxxhdpi │ │ │ ├── ic_add_white_24dp.png │ │ │ ├── ic_arrow_back_white_24dp.png │ │ │ ├── ic_arrow_forward_black_24dp.png │ │ │ ├── ic_bookmark_outline_white_24dp.png │ │ │ ├── ic_bookmark_white_24dp.png │ │ │ ├── ic_clear_white_24dp.png │ │ │ ├── ic_create_white_24dp.png │ │ │ ├── ic_done_white_24dp.png │ │ │ ├── ic_expand_less_black_24dp.png │ │ │ ├── ic_expand_more_black_24dp.png │ │ │ ├── ic_file_download_white_24dp.png │ │ │ ├── ic_help_outline_white_24dp.png │ │ │ ├── ic_history_white_24dp.png │ │ │ ├── ic_image_white_24dp.png │ │ │ ├── ic_more_vert_white_24dp.png │ │ │ ├── ic_play_circle_outline_white_24dp.png │ │ │ ├── ic_play_circle_outline_white_48dp.png │ │ │ ├── ic_radio_button_unchecked_white_24dp.png │ │ │ ├── ic_refresh_white_24dp.png │ │ │ ├── ic_reorder_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_select_all_white_24dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_settings_white_24dp.png │ │ │ ├── ic_stat_notify.png │ │ │ ├── ic_stat_notify_alert.png │ │ │ ├── ic_subdirectory_arrow_left_white_24dp.png │ │ │ ├── ic_task_description.png │ │ │ ├── ic_view_list_24dp.png │ │ │ ├── ic_view_module_24dp.png │ │ │ ├── ic_volume_off_white_24dp.png │ │ │ └── ic_volume_up_white_24dp.png │ │ │ ├── drawable │ │ │ ├── background_accent_rounded.xml │ │ │ ├── background_hint_arrow.xml │ │ │ ├── circle_background.xml │ │ │ ├── ic_404_image_not_found.xml │ │ │ ├── ic_blue_checkmark_24dp.xml │ │ │ ├── ic_captcha.xml │ │ │ ├── ic_download_anim.xml │ │ │ ├── ic_download_anim0.xml │ │ │ ├── ic_download_anim1.xml │ │ │ ├── ic_splash_screen.9.png │ │ │ ├── item_background.xml │ │ │ ├── panel_shadow.xml │ │ │ ├── setting_description_bottom.xml │ │ │ ├── setting_description_bottom_dark.xml │ │ │ ├── setting_description_top.xml │ │ │ └── setting_description_top_dark.xml │ │ │ ├── layout │ │ │ ├── activity_report.xml │ │ │ ├── cell_album_download.xml │ │ │ ├── cell_album_view.xml │ │ │ ├── cell_archive.xml │ │ │ ├── cell_board.xml │ │ │ ├── cell_board_suggestion.xml │ │ │ ├── cell_browse_board.xml │ │ │ ├── cell_browse_input.xml │ │ │ ├── cell_browse_site.xml │ │ │ ├── cell_divider.xml │ │ │ ├── cell_file.xml │ │ │ ├── cell_filter.xml │ │ │ ├── cell_header.xml │ │ │ ├── cell_history.xml │ │ │ ├── cell_link.xml │ │ │ ├── cell_pin.xml │ │ │ ├── cell_post.xml │ │ │ ├── cell_post_card.xml │ │ │ ├── cell_post_last_seen.xml │ │ │ ├── cell_post_stub.xml │ │ │ ├── cell_select.xml │ │ │ ├── cell_site.xml │ │ │ ├── cell_thread_status.xml │ │ │ ├── controller_album_download.xml │ │ │ ├── controller_album_view.xml │ │ │ ├── controller_archive.xml │ │ │ ├── controller_board_edit.xml │ │ │ ├── controller_board_setup.xml │ │ │ ├── controller_filters.xml │ │ │ ├── controller_history.xml │ │ │ ├── controller_image_viewer.xml │ │ │ ├── controller_loading_view.xml │ │ │ ├── controller_navigation_drawer.xml │ │ │ ├── controller_navigation_image_viewer.xml │ │ │ ├── controller_navigation_setup.xml │ │ │ ├── controller_navigation_toolbar.xml │ │ │ ├── controller_pass.xml │ │ │ ├── controller_save_location.xml │ │ │ ├── controller_site_setup.xml │ │ │ ├── controller_sites_setup.xml │ │ │ ├── controller_theme.xml │ │ │ ├── controller_thread_slide.xml │ │ │ ├── controller_watch.xml │ │ │ ├── dialog_post_delete.xml │ │ │ ├── js_captcha_cookies_editor.xml │ │ │ ├── layout_archives.xml │ │ │ ├── layout_board_add.xml │ │ │ ├── layout_captcha_challenge_image.xml │ │ │ ├── layout_captcha_legacy.xml │ │ │ ├── layout_captcha_nojs_v2.xml │ │ │ ├── layout_controller_popup.xml │ │ │ ├── layout_empty_setup.xml │ │ │ ├── layout_filter.xml │ │ │ ├── layout_folder_add.xml │ │ │ ├── layout_image_options.xml │ │ │ ├── layout_image_reencoding.xml │ │ │ ├── layout_post_replies.xml │ │ │ ├── layout_post_replies_bottombuttons.xml │ │ │ ├── layout_post_replies_container.xml │ │ │ ├── layout_removed_post.xml │ │ │ ├── layout_removed_posts.xml │ │ │ ├── layout_reply_captcha.xml │ │ │ ├── layout_reply_input.xml │ │ │ ├── layout_reply_progress.xml │ │ │ ├── layout_select.xml │ │ │ ├── layout_site_add.xml │ │ │ ├── layout_split_empty.xml │ │ │ ├── layout_thread.xml │ │ │ ├── layout_thread_error.xml │ │ │ ├── layout_thread_list.xml │ │ │ ├── layout_thread_progress.xml │ │ │ ├── popup_hint.xml │ │ │ ├── popup_hint_top.xml │ │ │ ├── setting_boolean.xml │ │ │ ├── setting_description.xml │ │ │ ├── setting_divider.xml │ │ │ ├── setting_group.xml │ │ │ ├── setting_link.xml │ │ │ ├── setting_text.xml │ │ │ ├── settings_layout.xml │ │ │ ├── toolbar_menu.xml │ │ │ └── toolbar_menu_item.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── values-sw600dp │ │ │ └── dimens.xml │ │ │ ├── values │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ids.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── file_paths.xml │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── github │ │ │ └── adamantcheese │ │ │ └── chan │ │ │ └── core │ │ │ └── cache │ │ │ ├── CacheHandlerTest.kt │ │ │ ├── PartialContentOkHttpDispatcher.kt │ │ │ ├── TestHelpers.kt │ │ │ └── downloader │ │ │ ├── ChunkDownloaderTest.kt │ │ │ ├── ChunkPersisterTest.kt │ │ │ ├── ChunkerKtTest.kt │ │ │ ├── ConcurrentChunkedFileDownloaderTest.kt │ │ │ ├── PartialContentSupportCheckerTest.kt │ │ │ └── TestModule.kt │ │ └── resources │ │ ├── test_img1.jpg │ │ ├── test_img2.jpg │ │ ├── test_img3.jpg │ │ └── test_img4.jpg ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── upload_apk.py ├── README.md └── docs ├── complete_guide_how_to_manually_test_local_threads.txt ├── ic_captcha.svg ├── ic_download_anim.ai ├── ic_download_anim0.svg ├── ic_download_anim1.svg ├── icon_512.png ├── internal_spoiler.png ├── internal_spoiler.psd ├── new_icon_512.png ├── new_icon_512.psd ├── new_new_icon_512.png ├── new_new_icon_512.psd └── release.txt /.gitignore: -------------------------------------------------------------------------------- 1 | gps/ 2 | **/keys.properties 3 | **/keystore.jks 4 | **/version.properties 5 | 6 | 7 | #built application files 8 | # *.apk 9 | *.ap_ 10 | 11 | # files for the dex VM 12 | *.dex 13 | 14 | # Java class files 15 | *.class 16 | 17 | # generated files 18 | bin/ 19 | gen/ 20 | 21 | # Local configuration file (sdk path, etc) 22 | local.properties 23 | 24 | # Android Studio 25 | .idea 26 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. 27 | .gradle 28 | build/ 29 | *.iml 30 | # Layout captures 31 | **/*.li 32 | 33 | ## Windows detritus 34 | ############# 35 | 36 | # Windows image file caches 37 | Thumbs.db 38 | ehthumbs.db 39 | 40 | # Folder config file 41 | Desktop.ini 42 | 43 | # Recycle Bin used on file shares 44 | $RECYCLE.BIN/ 45 | 46 | # Mac crap 47 | .DS_Store 48 | 49 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: 4 | - android 5 | - python 6 | jdk: 7 | - oraclejdk8 8 | python: "3.6" 9 | android: 10 | components: 11 | - platform-tools 12 | - tools 13 | - extra-android-m2repository 14 | - build-tools-29.0.2 15 | - android-29 16 | install: 17 | - sudo apt-get update 18 | - sudo apt-get install python3 19 | - sudo apt-get -y install python3-pip 20 | - pip3 install requests 21 | script: 22 | - cd Kuroba || travis_terminate 1; 23 | - chmod +x gradlew || travis_terminate 2; 24 | - ./gradlew assembleDevDebug --console plain -x lint || travis_terminate 3; 25 | - python3 upload_apk.py http://94.140.116.243:8080 multi-feature || travis_terminate 4; 26 | 27 | notifications: 28 | email: false -------------------------------------------------------------------------------- /Kuroba/.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Kuroba/app/debug.properties: -------------------------------------------------------------------------------- 1 | keystoreFile=debug_ks.jks 2 | keystorePass=android 3 | keyAlias=android 4 | keyPass=android -------------------------------------------------------------------------------- /Kuroba/app/debug_ks.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/debug_ks.jks -------------------------------------------------------------------------------- /Kuroba/app/src/main/assets/captcha/captcha2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 20 | 21 |
22 |
23 |
Loading captcha…
24 | 25 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/assets/captcha/captcha_legacy.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 | 8 | 42 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/assets/font/OPTICubaLibreTwo.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/assets/font/OPTICubaLibreTwo.otf -------------------------------------------------------------------------------- /Kuroba/app/src/main/assets/font/Talleyrand.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/assets/font/Talleyrand.ttf -------------------------------------------------------------------------------- /Kuroba/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/controller/ControllerTransition.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.controller; 18 | 19 | public abstract class ControllerTransition { 20 | private Callback callback; 21 | 22 | public Controller from; 23 | public Controller to; 24 | 25 | public abstract void perform(); 26 | 27 | public void onCompleted() { 28 | if (callback != null) { 29 | callback.onControllerTransitionCompleted(this); 30 | } 31 | } 32 | 33 | public void setCallback(Callback callback) { 34 | this.callback = callback; 35 | } 36 | 37 | public interface Callback { 38 | void onControllerTransitionCompleted(ControllerTransition transition); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/base/BasePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.base 2 | 3 | import androidx.annotation.CallSuper 4 | 5 | abstract class BasePresenter { 6 | private var view: V? = null 7 | 8 | @CallSuper 9 | open fun onCreate(view: V) { 10 | this.view = view 11 | } 12 | 13 | @CallSuper 14 | open fun onDestroy() { 15 | this.view = null 16 | } 17 | 18 | fun withView(func: (V) -> Unit) { 19 | view?.let { func(it) } 20 | } 21 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/base/MResult.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.base 2 | 3 | sealed class MResult { 4 | data class Value(val value: V) : MResult() 5 | data class Error(val error: Throwable) : MResult() 6 | 7 | companion object { 8 | fun value(value: V): MResult { 9 | return Value(value) 10 | } 11 | 12 | fun error(error: Throwable): MResult { 13 | return Error(error) 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/MediaSourceCallback.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache 2 | 3 | import com.google.android.exoplayer2.source.MediaSource 4 | 5 | interface MediaSourceCallback { 6 | fun onMediaSourceReady(source: MediaSource?) 7 | fun onError(error: Throwable) 8 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/ChunkDownloadEvent.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import com.github.k1rakishou.fsaf.file.RawFile 4 | 5 | internal sealed class ChunkDownloadEvent { 6 | class Success(val output: RawFile, val requestTime: Long) : ChunkDownloadEvent() 7 | class ChunkSuccess(val chunkIndex: Int, val chunkCacheFile: RawFile, val chunk: Chunk) : ChunkDownloadEvent() 8 | class ChunkError(val error: Throwable) : ChunkDownloadEvent() 9 | class Progress(val chunkIndex: Int, val downloaded: Long, val chunkSize: Long) : ChunkDownloadEvent() 10 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/ChunkResponse.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import okhttp3.Response 4 | 5 | internal data class ChunkResponse( 6 | val chunk: Chunk, 7 | val response: Response 8 | ) -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/Chunker.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | 4 | fun chunkLong(value: Long, chunksCount: Int, minChunkSize: Long): List { 5 | require(chunksCount > 0) { "ChunksCount ($chunksCount) must be greater than zero!" } 6 | require(value >= chunksCount) { "Value ($value) must be greater or equal to chunksCount ($chunksCount)" } 7 | 8 | if (value < minChunkSize) { 9 | return listOf(Chunk(0, value)) 10 | } 11 | 12 | val chunks = mutableListOf() 13 | val chunkSize = value / chunksCount 14 | var current = 0L 15 | 16 | for (i in 0 until chunksCount) { 17 | chunks += Chunk(current, (current + chunkSize).coerceAtMost(value)) 18 | current += chunkSize 19 | } 20 | 21 | if (current < value) { 22 | val lastChunk = chunks.removeAt(chunks.lastIndex) 23 | chunks += Chunk(lastChunk.start, value) 24 | } 25 | 26 | return chunks 27 | } 28 | 29 | /** 30 | * [realEnd] is only being used in tests. 31 | * */ 32 | data class Chunk(val start: Long, val realEnd: Long) { 33 | // Must be 1 less than actual _end 34 | val end: Long 35 | get() = realEnd - 1 36 | 37 | fun isWholeFile(): Boolean { 38 | return start == 0L && realEnd == Long.MAX_VALUE 39 | } 40 | 41 | fun chunkSize(): Long = realEnd - start 42 | 43 | override fun toString(): String { 44 | return "Chunk(start=$start, end=$end)" 45 | } 46 | 47 | companion object { 48 | fun wholeFile(): Chunk = Chunk(0, Long.MAX_VALUE) 49 | } 50 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/DownloadState.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | sealed class DownloadState { 4 | object Running : DownloadState() 5 | /** 6 | * Stopped is kinda the same as Canceled, the only difference is that we don't remove the cache 7 | * file right away because we use that cache file ti fill up the WebmStreamingDataSource 8 | * */ 9 | object Stopped : DownloadState() 10 | 11 | /** 12 | * Cancels the download and deletes the file 13 | * */ 14 | object Canceled : DownloadState() 15 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/DownloaderUtils.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import okhttp3.internal.http2.StreamResetException 4 | import java.io.IOException 5 | 6 | internal object DownloaderUtils { 7 | 8 | fun isCancellationError(error: Throwable): Boolean { 9 | if (error !is IOException) { 10 | return false 11 | } 12 | 13 | if (error is FileCacheException.CancellationException 14 | || error is StreamResetException) { 15 | return true 16 | } 17 | 18 | // Thrown by OkHttp when cancelling a call 19 | if (error.message?.contains("Canceled") == true) { 20 | return true 21 | } 22 | 23 | return false 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/FileDownloadRequest.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import com.github.k1rakishou.fsaf.file.RawFile 4 | import java.io.File 5 | import java.util.concurrent.atomic.AtomicInteger 6 | import java.util.concurrent.atomic.AtomicLong 7 | 8 | internal open class FileDownloadRequest( 9 | val url: String, 10 | val output: RawFile, 11 | // A file will be split into [chunksCount] chunks which will be downloaded in parallel. 12 | // Must be 1 or greater than 1. 13 | val chunksCount: AtomicInteger, 14 | // How many bytes were downloaded across all chunks 15 | val downloaded: AtomicLong, 16 | // How many bytes a file we download takes in total 17 | val total: AtomicLong, 18 | // A handle to cancel the current download 19 | val cancelableDownload: CancelableDownload, 20 | val extraInfo: DownloadRequestExtraInfo, 21 | // Chunks to delete from the disk upon download success or error 22 | val chunks: MutableSet = mutableSetOf() 23 | ) { 24 | 25 | init { 26 | check(chunksCount.get() >= 1) { 27 | "chunksCount is zero or less than zero! chunksCount = $chunksCount" 28 | } 29 | } 30 | 31 | override fun toString(): String { 32 | return "[FileDownloadRequest: " + 33 | "url = ${url}, " + 34 | "outputFileName = ${File(output.getFullPath()).name}]" 35 | } 36 | } 37 | 38 | class DownloadRequestExtraInfo( 39 | val fileSize: Long = -1L, 40 | val fileHash: String? = null 41 | ) -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/FileDownloadResult.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import com.github.k1rakishou.fsaf.file.RawFile 4 | 5 | internal sealed class FileDownloadResult { 6 | class Start(val chunksCount: Int) : FileDownloadResult() 7 | class Success(val file: RawFile, val requestTime: Long) : FileDownloadResult() 8 | class Progress(val chunkIndex: Int, val downloaded: Long, val chunkSize: Long) : FileDownloadResult() 9 | object Canceled : FileDownloadResult() 10 | object Stopped : FileDownloadResult() 11 | class KnownException(val fileCacheException: FileCacheException) : FileDownloadResult() 12 | class UnknownException(val error: Throwable) : FileDownloadResult() 13 | 14 | fun isErrorOfAnyKind(): Boolean { 15 | return this !is Start && this !is Success && this !is Progress 16 | } 17 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/FileDownloader.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import com.github.adamantcheese.chan.core.cache.CacheHandler 4 | import com.github.adamantcheese.chan.utils.BackgroundUtils 5 | import io.reactivex.Flowable 6 | 7 | internal abstract class FileDownloader( 8 | protected val activeDownloads: ActiveDownloads, 9 | protected val cacheHandler: CacheHandler 10 | ) { 11 | abstract fun download( 12 | partialContentCheckResult: PartialContentCheckResult, 13 | url: String, 14 | chunked: Boolean 15 | ): Flowable 16 | 17 | protected fun isRequestStoppedOrCanceled(url: String): Boolean { 18 | BackgroundUtils.ensureBackgroundThread() 19 | 20 | val request = activeDownloads.get(url) 21 | ?: return true 22 | 23 | return !request.cancelableDownload.isRunning() 24 | } 25 | 26 | companion object { 27 | internal const val BUFFER_SIZE: Long = 8192L 28 | internal const val MAX_RETRIES = 5L 29 | } 30 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/Logging.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | import com.github.adamantcheese.chan.utils.Logger 4 | 5 | internal fun log(tag: String, message: String) { 6 | Logger.d(tag, String.format("[%s]: %s", Thread.currentThread().name, message)) 7 | } 8 | 9 | internal fun logError(tag: String, message: String, error: Throwable? = null) { 10 | if (error == null) { 11 | Logger.e(tag, String.format("[%s]: %s", Thread.currentThread().name, message)) 12 | } else { 13 | Logger.e(tag, String.format("[%s]: %s", Thread.currentThread().name, message), error) 14 | } 15 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/cache/downloader/PartialContentCheckResult.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.cache.downloader 2 | 3 | internal data class PartialContentCheckResult( 4 | val supportsPartialContentDownload: Boolean, 5 | val notFoundOnServer: Boolean = false, 6 | val length: Long = -1L 7 | ) { 8 | 9 | fun couldDetermineFileSize(): Boolean = length >= 0 10 | 11 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/kt_extensions/Extensions.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.kt_extensions 2 | 3 | /** 4 | * Forces the kotlin compiler to require handling of all branches in the "when" operator 5 | * */ 6 | val T.exhaustive: T 7 | get() = this -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/mapper/BoardMapper.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.mapper; 2 | 3 | import com.github.adamantcheese.chan.core.model.orm.Board; 4 | import com.github.adamantcheese.chan.core.model.save.SerializableBoard; 5 | 6 | public class BoardMapper { 7 | 8 | public static SerializableBoard toSerializableBoard(Board board) { 9 | return new SerializableBoard( 10 | board.id, 11 | board.siteId, 12 | SiteMapper.toSerializableSite(board.site), 13 | board.saved, 14 | board.order, 15 | board.name, 16 | board.code 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/mapper/SiteMapper.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.mapper; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.SerializableSite; 4 | import com.github.adamantcheese.chan.core.site.Site; 5 | 6 | public class SiteMapper { 7 | 8 | public static SerializableSite toSerializableSite(Site site) { 9 | return new SerializableSite(site.id()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/mapper/ThreadMapper.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.mapper; 2 | 3 | import androidx.annotation.Nullable; 4 | 5 | import com.github.adamantcheese.chan.core.model.ChanThread; 6 | import com.github.adamantcheese.chan.core.model.Post; 7 | import com.github.adamantcheese.chan.core.model.orm.Loadable; 8 | import com.github.adamantcheese.chan.core.model.save.SerializableThread; 9 | import com.github.adamantcheese.chan.utils.Logger; 10 | 11 | import java.util.List; 12 | 13 | public class ThreadMapper { 14 | private static final String TAG = "ThreadMapper"; 15 | 16 | public static SerializableThread toSerializableThread(List posts) { 17 | return new SerializableThread(PostMapper.toSerializablePostList(posts)); 18 | } 19 | 20 | @Nullable 21 | public static ChanThread fromSerializedThread(Loadable loadable, SerializableThread serializableThread) { 22 | List posts = PostMapper.fromSerializedPostList(loadable, serializableThread.getPostList()); 23 | 24 | if (posts.isEmpty()) { 25 | Logger.w(TAG, "PostMapper.fromSerializedPostList returned empty list"); 26 | return null; 27 | } 28 | 29 | ChanThread chanThread = new ChanThread(loadable, posts); 30 | 31 | chanThread.setArchived(true); 32 | 33 | return chanThread; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/PostHttpIcon.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.model; 18 | 19 | import okhttp3.HttpUrl; 20 | 21 | public class PostHttpIcon { 22 | public final HttpUrl url; 23 | public final String name; 24 | 25 | public PostHttpIcon(HttpUrl url, String name) { 26 | this.url = url; 27 | this.name = name; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/json/site/SiteConfig.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.model.json.site; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | public class SiteConfig { 22 | @SerializedName("external") 23 | public boolean external; 24 | 25 | @SerializedName("internal_site_id") 26 | public int classId; 27 | } 28 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/orm/History.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.model.orm; 18 | 19 | import com.j256.ormlite.field.DatabaseField; 20 | import com.j256.ormlite.table.DatabaseTable; 21 | 22 | @DatabaseTable(tableName = "history") 23 | public class History { 24 | @DatabaseField(generatedId = true) 25 | public int id; 26 | 27 | @DatabaseField(canBeNull = false, foreign = true) 28 | public Loadable loadable; 29 | 30 | @DatabaseField 31 | public String thumbnailUrl; 32 | 33 | @DatabaseField 34 | public long date; 35 | } 36 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/SerializableSite.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save; 2 | 3 | import androidx.annotation.Nullable; 4 | 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class SerializableSite { 8 | @SerializedName("site_id") 9 | private int siteId; 10 | 11 | public SerializableSite(int siteId) { 12 | this.siteId = siteId; 13 | } 14 | 15 | @Override 16 | public int hashCode() { 17 | return 31 * siteId; 18 | } 19 | 20 | @Override 21 | public boolean equals(@Nullable Object other) { 22 | if (other == null) { 23 | return false; 24 | } 25 | 26 | if (other == this) { 27 | return true; 28 | } 29 | 30 | if (this.getClass() != other.getClass()) { 31 | return false; 32 | } 33 | 34 | SerializableSite otherSite = (SerializableSite) other; 35 | return this.siteId == otherSite.siteId; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/SerializableAbsoluteSizeSpan.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public class SerializableAbsoluteSizeSpan { 6 | @SerializedName("size") 7 | private int size; 8 | 9 | public SerializableAbsoluteSizeSpan(int size) { 10 | this.size = size; 11 | } 12 | 13 | public int getSize() { 14 | return size; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/SerializableBackgroundColorSpan.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public class SerializableBackgroundColorSpan { 6 | @SerializedName("background_color") 7 | private int backgroundColor; 8 | 9 | public SerializableBackgroundColorSpan(int backgroundColor) { 10 | this.backgroundColor = backgroundColor; 11 | } 12 | 13 | public int getBackgroundColor() { 14 | return backgroundColor; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/SerializableForegroundColorSpan.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public class SerializableForegroundColorSpan { 6 | @SerializedName("foreground_color") 7 | private int foregroundColor; 8 | 9 | public SerializableForegroundColorSpan(int foregroundColor) { 10 | this.foregroundColor = foregroundColor; 11 | } 12 | 13 | public int getForegroundColor() { 14 | return foregroundColor; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/SerializableStyleSpan.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public class SerializableStyleSpan { 6 | @SerializedName("style") 7 | private int style; 8 | 9 | public SerializableStyleSpan(int style) { 10 | this.style = style; 11 | } 12 | 13 | public int getStyle() { 14 | return style; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/SerializableTypefaceSpan.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public class SerializableTypefaceSpan { 6 | @SerializedName("family") 7 | private String family; 8 | 9 | public SerializableTypefaceSpan(String family) { 10 | this.family = family; 11 | } 12 | 13 | public String getFamily() { 14 | return family; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkThreadLinkValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan.PostLinkableType; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | public class PostLinkThreadLinkValue 7 | extends PostLinkableValue { 8 | @SerializedName("board") 9 | private String board; 10 | @SerializedName("thread_id") 11 | private int threadId; 12 | @SerializedName("post_id") 13 | private int postId; 14 | 15 | public PostLinkThreadLinkValue(PostLinkableType type, String board, int threadId, int postId) { 16 | super(type); 17 | 18 | this.board = board; 19 | this.threadId = threadId; 20 | this.postId = postId; 21 | } 22 | 23 | public String getBoard() { 24 | return board; 25 | } 26 | 27 | public int getThreadId() { 28 | return threadId; 29 | } 30 | 31 | public int getPostId() { 32 | return postId; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkableBoardLinkValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan.PostLinkableType; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | public class PostLinkableBoardLinkValue 7 | extends PostLinkableValue { 8 | @SerializedName("board_link") 9 | private String boardLink; 10 | 11 | public PostLinkableBoardLinkValue(PostLinkableType type, String boardLink) { 12 | super(type); 13 | 14 | this.boardLink = boardLink; 15 | } 16 | 17 | public String getBoardLink() { 18 | return boardLink; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkableLinkValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan.PostLinkableType; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | public class PostLinkableLinkValue 7 | extends PostLinkableValue { 8 | @SerializedName("link") 9 | private String link; 10 | 11 | public PostLinkableLinkValue(PostLinkableType type, String link) { 12 | super(type); 13 | 14 | this.link = link; 15 | } 16 | 17 | public String getLink() { 18 | return link; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkableQuoteValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | public class PostLinkableQuoteValue 7 | extends PostLinkableValue { 8 | @SerializedName("post_id") 9 | private int postId; 10 | 11 | public PostLinkableQuoteValue(SerializablePostLinkableSpan.PostLinkableType type, int postId) { 12 | super(type); 13 | 14 | this.postId = postId; 15 | } 16 | 17 | public int getPostId() { 18 | return postId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkableSearchLinkValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan.PostLinkableType; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | public class PostLinkableSearchLinkValue 7 | extends PostLinkableValue { 8 | @SerializedName("board") 9 | private String board; 10 | @SerializedName("search") 11 | private String search; 12 | 13 | public PostLinkableSearchLinkValue(PostLinkableType type, String board, String search) { 14 | super(type); 15 | 16 | this.board = board; 17 | this.search = search; 18 | } 19 | 20 | public String getBoard() { 21 | return board; 22 | } 23 | 24 | public String getSearch() { 25 | return search; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkableSpoilerValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan; 4 | 5 | public class PostLinkableSpoilerValue 6 | extends PostLinkableValue { 7 | 8 | public PostLinkableSpoilerValue(SerializablePostLinkableSpan.PostLinkableType type) { 9 | super(type); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/model/save/spans/linkable/PostLinkableValue.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.model.save.spans.linkable; 2 | 3 | import com.github.adamantcheese.chan.core.model.save.spans.SerializablePostLinkableSpan; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | public abstract class PostLinkableValue { 7 | @SerializedName("post_linkable_value_type") 8 | protected int type; 9 | 10 | public PostLinkableValue(SerializablePostLinkableSpan.PostLinkableType type) { 11 | this.type = type.getTypeValue(); 12 | } 13 | 14 | public int getType() { 15 | return type; 16 | } 17 | } 18 | 19 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/net/BitmapLruImageCache.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.net; 18 | 19 | import android.graphics.Bitmap; 20 | import android.util.LruCache; 21 | 22 | import com.android.volley.toolbox.ImageLoader; 23 | 24 | public class BitmapLruImageCache 25 | extends LruCache 26 | implements ImageLoader.ImageCache { 27 | public BitmapLruImageCache(int maxSize) { 28 | super(maxSize); 29 | } 30 | 31 | @Override 32 | protected int sizeOf(String key, Bitmap value) { 33 | return value.getRowBytes() * value.getHeight() / 1024; 34 | } 35 | 36 | @Override 37 | public Bitmap getBitmap(String url) { 38 | return get(url); 39 | } 40 | 41 | @Override 42 | public void putBitmap(String url, Bitmap bitmap) { 43 | put(url, bitmap); 44 | } 45 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/CounterSetting.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings; 18 | 19 | public class CounterSetting 20 | extends IntegerSetting { 21 | public CounterSetting(SettingProvider settingProvider, String key) { 22 | super(settingProvider, key, 0); 23 | } 24 | 25 | public int increase() { 26 | set(get() + 1); 27 | return get(); 28 | } 29 | 30 | public void reset() { 31 | set(getDefault()); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/OptionSettingItem.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings; 18 | 19 | public interface OptionSettingItem { 20 | String getKey(); 21 | } 22 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/SettingProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings; 18 | 19 | public interface SettingProvider { 20 | int getInt(String key, int def); 21 | 22 | void putInt(String key, int value); 23 | 24 | long getLong(String key, long def); 25 | 26 | void putLong(String key, long value); 27 | 28 | boolean getBoolean(String key, boolean def); 29 | 30 | void putBoolean(String key, boolean value); 31 | 32 | String getString(String key, String def); 33 | 34 | void putString(String key, String value); 35 | 36 | void putStringSync(String key, String value); 37 | 38 | void removeSync(String key); 39 | 40 | void putIntSync(String key, Integer value); 41 | } 42 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/base_dir/BaseDirectorySetting.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.settings.base_dir 2 | 3 | import android.net.Uri 4 | import com.github.adamantcheese.chan.core.settings.IntegerSetting 5 | import com.github.adamantcheese.chan.core.settings.StringSetting 6 | import com.github.adamantcheese.chan.core.settings.base_dir.BaseDirectorySetting.ActiveBaseDir.Companion.fromIntegerSetting 7 | 8 | abstract class BaseDirectorySetting { 9 | abstract var activeBaseDir: IntegerSetting 10 | abstract val fileApiBaseDir: StringSetting 11 | abstract val safBaseDir: StringSetting 12 | 13 | fun isSafDirActive() = fromIntegerSetting(activeBaseDir) == ActiveBaseDir.SAFBaseDir 14 | fun isFileDirActive() = fromIntegerSetting(activeBaseDir) == ActiveBaseDir.FileBaseDir 15 | 16 | abstract fun setFileBaseDir(dir: String) 17 | abstract fun setSafBaseDir(dir: Uri) 18 | abstract fun resetFileDir() 19 | abstract fun resetActiveDir() 20 | 21 | /** 22 | * DO NOT CHANGE THE ORDER!!! 23 | * It will break the settings!!! 24 | * */ 25 | enum class ActiveBaseDir { 26 | FileBaseDir, 27 | SAFBaseDir; 28 | 29 | companion object { 30 | fun fromIntegerSetting(setting: IntegerSetting): ActiveBaseDir { 31 | val ordinalToFind = setting.get() 32 | 33 | return values() 34 | .firstOrNull { value -> value.ordinal == ordinalToFind } 35 | ?: throw IllegalStateException("Couldn't find ActiveBaseDir with ordinal $ordinalToFind") 36 | } 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/json/BooleanJsonSetting.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings.json; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | public class BooleanJsonSetting 22 | extends JsonSetting { 23 | @SerializedName("value") 24 | public boolean value; 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/json/IntegerJsonSetting.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings.json; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | public class IntegerJsonSetting 22 | extends JsonSetting { 23 | @SerializedName("value") 24 | public int value; 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/json/JsonSetting.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings.json; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | public class JsonSetting { 22 | @SerializedName("key") 23 | public String key; 24 | } 25 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/json/JsonSettings.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings.json; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | import java.util.HashMap; 22 | import java.util.Map; 23 | 24 | public class JsonSettings { 25 | @SerializedName("settings") 26 | Map settings = new HashMap<>(); 27 | } 28 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/json/LongJsonSetting.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings.json; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | public class LongJsonSetting 22 | extends JsonSetting { 23 | @SerializedName("value") 24 | public long value; 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/settings/json/StringJsonSetting.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.settings.json; 18 | 19 | import com.google.gson.annotations.SerializedName; 20 | 21 | public class StringJsonSetting 22 | extends JsonSetting { 23 | @SerializedName("value") 24 | public String value; 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/ChunkDownloaderSiteProperties.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.site 2 | 3 | data class ChunkDownloaderSiteProperties( 4 | /** 5 | * Whether the site send file size info in bytes or not. Some sites may send it in KB which 6 | * breaks ChunkedFileDownloader. To figure out whether a site sends us bytes or kilobytes 7 | * (or something else) you will have to look into the thread json of a concrete site. 8 | * If a site uses Vichan or Futaba chan engine then they most likely send file size in bytes. 9 | * */ 10 | val siteSendsCorrectFileSizeInBytes: Boolean, 11 | 12 | /** 13 | * Some sites (Wired-7) may send incorrect file md5 to us (sometimes) so we have no other way other 14 | * than file md5 disabling for such sites 15 | * */ 16 | val canFileHashBeTrusted: Boolean 17 | ) -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/SiteRequestModifier.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site; 18 | 19 | import android.webkit.WebView; 20 | 21 | import com.github.adamantcheese.chan.core.site.http.HttpCall; 22 | 23 | import okhttp3.Request; 24 | 25 | public interface SiteRequestModifier { 26 | void modifyHttpCall(HttpCall httpCall, Request.Builder requestBuilder); 27 | 28 | void modifyWebView(WebView webView); 29 | } 30 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/SiteUrlHandler.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site; 18 | 19 | import androidx.annotation.NonNull; 20 | 21 | import com.github.adamantcheese.chan.core.model.orm.Loadable; 22 | 23 | import okhttp3.HttpUrl; 24 | 25 | public interface SiteUrlHandler { 26 | Class getSiteClass(); 27 | 28 | boolean matchesName(String value); 29 | 30 | boolean respondsTo(HttpUrl url); 31 | 32 | boolean matchesMediaHost(@NonNull HttpUrl url); 33 | 34 | String desktopUrl(Loadable loadable, int postNo); 35 | 36 | Loadable resolveLoadable(Site site, HttpUrl url); 37 | } 38 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/common/vichan/VichanCommentParser.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.common.vichan; 18 | 19 | import com.github.adamantcheese.chan.core.site.parser.CommentParser; 20 | import com.github.adamantcheese.chan.core.site.parser.StyleRule; 21 | 22 | import java.util.regex.Pattern; 23 | 24 | public class VichanCommentParser 25 | extends CommentParser { 26 | public VichanCommentParser() { 27 | addDefaultRules(); 28 | setQuotePattern(Pattern.compile(".*#(\\d+)")); 29 | setFullQuotePattern(Pattern.compile("/(\\w+)/\\w+/(\\d+)\\.html#(\\d+)")); 30 | rule(StyleRule.tagRule("p") 31 | .cssClass("quote") 32 | .foregroundColor(StyleRule.ForegroundColor.INLINE_QUOTE) 33 | .linkify()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/http/DeleteRequest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.http; 18 | 19 | import com.github.adamantcheese.chan.core.model.Post; 20 | import com.github.adamantcheese.chan.core.model.orm.SavedReply; 21 | 22 | public class DeleteRequest { 23 | public final Post post; 24 | public final SavedReply savedReply; 25 | public final boolean imageOnly; 26 | 27 | public DeleteRequest(Post post, SavedReply savedReply, boolean imageOnly) { 28 | this.post = post; 29 | this.savedReply = savedReply; 30 | this.imageOnly = imageOnly; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/http/DeleteResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.http; 18 | 19 | public class DeleteResponse { 20 | public boolean deleted; 21 | public String errorMessage; 22 | } 23 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/http/LoginRequest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.http; 18 | 19 | public class LoginRequest { 20 | public final String user; 21 | public final String pass; 22 | 23 | public LoginRequest(String user, String pass) { 24 | this.user = user; 25 | this.pass = pass; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/http/LoginResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.http; 18 | 19 | public class LoginResponse { 20 | public boolean success; 21 | public String message; 22 | 23 | // TODO(multi-site) make this a cookie abstraction 24 | public String token; 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/loader/ChanLoaderRequest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.loader; 18 | 19 | import com.android.volley.Request; 20 | 21 | public class ChanLoaderRequest { 22 | private Request volleyRequest; 23 | 24 | public ChanLoaderRequest(Request volleyRequest) { 25 | this.volleyRequest = volleyRequest; 26 | } 27 | 28 | public Request getVolleyRequest() { 29 | return volleyRequest; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/loader/ChanLoaderResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.loader; 18 | 19 | import com.github.adamantcheese.chan.core.model.Post; 20 | 21 | import java.util.List; 22 | 23 | public class ChanLoaderResponse { 24 | // Op Post that is created new each time. 25 | // Used to later copy members like image count to the real op on the main thread. 26 | public final Post.Builder op; 27 | public final List posts; 28 | 29 | public ChanLoaderResponse(Post.Builder op, List posts) { 30 | this.op = op; 31 | this.posts = posts; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/parser/ChanReader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.parser; 18 | 19 | import android.util.JsonReader; 20 | 21 | public interface ChanReader { 22 | PostParser getParser(); 23 | 24 | void loadThread(JsonReader reader, ChanReaderProcessingQueue queue) 25 | throws Exception; 26 | 27 | void loadCatalog(JsonReader reader, ChanReaderProcessingQueue queue) 28 | throws Exception; 29 | 30 | void readPostObject(JsonReader reader, ChanReaderProcessingQueue queue) 31 | throws Exception; 32 | } 33 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/parser/PostParser.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.core.site.parser; 18 | 19 | import com.github.adamantcheese.chan.core.model.Post; 20 | import com.github.adamantcheese.chan.ui.theme.Theme; 21 | 22 | public interface PostParser { 23 | Post parse(Theme theme, Post.Builder builder, Callback callback); 24 | 25 | interface Callback { 26 | boolean isSaved(int postNo); 27 | 28 | /** 29 | * Is the post id from this thread. 30 | * 31 | * @param postNo the post id 32 | * @return {@code true} if referring to a post in the thread, {@code false} otherwise. 33 | */ 34 | boolean isInternal(int postNo); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/core/site/sites/dvach/DvachCommentParser.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.core.site.sites.dvach; 2 | 3 | import com.github.adamantcheese.chan.core.site.common.vichan.VichanCommentParser; 4 | import com.github.adamantcheese.chan.core.site.parser.StyleRule; 5 | 6 | public class DvachCommentParser 7 | extends VichanCommentParser { 8 | @Override 9 | public void addDefaultRules() { 10 | super.addDefaultRules(); 11 | rule(StyleRule.tagRule("span").cssClass("s").strikeThrough()); 12 | rule(StyleRule.tagRule("span").cssClass("u").underline()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/report/ReportActivityView.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.report 2 | 3 | interface ReportActivityView { 4 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/captcha/AuthenticationLayoutCallback.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.captcha; 18 | 19 | public interface AuthenticationLayoutCallback { 20 | void onAuthenticationComplete( 21 | AuthenticationLayoutInterface authenticationLayout, String challenge, String response, boolean autoReply 22 | ); 23 | 24 | void onFallbackToV1CaptchaView(boolean autoReply); 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/captcha/AuthenticationLayoutInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.captcha; 18 | 19 | import com.github.adamantcheese.chan.core.site.Site; 20 | 21 | public interface AuthenticationLayoutInterface { 22 | void initialize(Site site, AuthenticationLayoutCallback callback, boolean autoReply); 23 | 24 | void reset(); 25 | 26 | void hardReset(); 27 | } 28 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/controller/BaseFloatingController.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.controller; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.view.Window; 6 | 7 | import com.github.adamantcheese.chan.controller.Controller; 8 | 9 | import static com.github.adamantcheese.chan.utils.AndroidUtils.inflate; 10 | import static com.github.adamantcheese.chan.utils.AnimationUtils.animateStatusBar; 11 | 12 | public abstract class BaseFloatingController 13 | extends Controller { 14 | private static final int TRANSITION_DURATION = 200; 15 | private int statusBarColorPrevious; 16 | 17 | public BaseFloatingController(Context context) { 18 | super(context); 19 | } 20 | 21 | @Override 22 | public void onCreate() { 23 | super.onCreate(); 24 | 25 | view = inflate(context, getLayoutId()); 26 | 27 | statusBarColorPrevious = getWindow().getStatusBarColor(); 28 | if (statusBarColorPrevious != 0) { 29 | animateStatusBar(getWindow(), true, statusBarColorPrevious, TRANSITION_DURATION); 30 | } 31 | } 32 | 33 | @Override 34 | public void stopPresenting() { 35 | super.stopPresenting(); 36 | 37 | if (statusBarColorPrevious != 0) { 38 | animateStatusBar(getWindow(), false, statusBarColorPrevious, TRANSITION_DURATION); 39 | } 40 | } 41 | 42 | private Window getWindow() { 43 | return ((Activity) context).getWindow(); 44 | } 45 | 46 | protected abstract int getLayoutId(); 47 | } 48 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/controller/settings/MediaSettingsControllerCallbacks.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.controller.settings; 2 | 3 | import androidx.annotation.Nullable; 4 | 5 | import com.github.k1rakishou.fsaf.file.AbstractFile; 6 | 7 | public interface MediaSettingsControllerCallbacks { 8 | void updateLocalThreadsLocation(String newLocation); 9 | 10 | void askUserIfTheyWantToMoveOldThreadsToTheNewDirectory( 11 | @Nullable AbstractFile oldBaseDirectory, AbstractFile newBaseDirectory 12 | ); 13 | 14 | void askUserIfTheyWantToMoveOldSavedFilesToTheNewDirectory( 15 | @Nullable AbstractFile oldBaseDirectory, AbstractFile newBaseDirectory 16 | ); 17 | 18 | void updateLoadingViewText(String text); 19 | 20 | void updateSaveLocationViewText(String newLocation); 21 | 22 | void showCopyFilesDialog(int filesCount, AbstractFile oldBaseDirectory, AbstractFile newBaseDirectory); 23 | 24 | void onCopyDirectoryEnded(AbstractFile oldBaseDirectory, AbstractFile newBaseDirectory, boolean result); 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/controller/settings/captcha/JsCaptchaCookiesJar.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.controller.settings.captcha 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class JsCaptchaCookiesJar( 6 | @SerializedName("hsid_cookie") 7 | val hsidCookie: String = "", 8 | @SerializedName("ssid_cookie") 9 | val ssidCookie: String = "", 10 | @SerializedName("sid_cookie") 11 | val sidCookie: String = "", 12 | @SerializedName("nid_cookie") 13 | val nidCookie: String = "" 14 | ) { 15 | 16 | fun isValid(): Boolean { 17 | return hsidCookie.isNotEmpty() 18 | && ssidCookie.isNotEmpty() 19 | && sidCookie.isNotEmpty() 20 | && nidCookie.isNotEmpty() 21 | } 22 | 23 | companion object { 24 | @JvmStatic 25 | fun empty(): JsCaptchaCookiesJar { 26 | return JsCaptchaCookiesJar( 27 | hsidCookie = "", 28 | ssidCookie = "", 29 | sidCookie = "", 30 | nidCookie = "" 31 | ) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/helper/PinHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.helper; 18 | 19 | public class PinHelper { 20 | public static String getShortUnreadCount(int value) { 21 | String count; 22 | if (value < 0) { 23 | count = "?"; 24 | } else if (value < 1000) { 25 | count = String.valueOf(value); 26 | } else { 27 | int k = value / 1000; 28 | if (k < 10) { 29 | count = k + "k+"; 30 | } else if (k < 100) { 31 | count = k + "k"; 32 | } else { 33 | count = "XD"; 34 | } 35 | } 36 | return count; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/helper/RefreshUIMessage.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.helper; 18 | 19 | public class RefreshUIMessage { 20 | public String reason; 21 | 22 | public RefreshUIMessage(String reason) { 23 | this.reason = reason; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/layout/NewFolderLayout.java: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.layout; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.EditText; 6 | import android.widget.LinearLayout; 7 | 8 | import com.github.adamantcheese.chan.R; 9 | 10 | import static com.github.adamantcheese.chan.utils.AndroidUtils.getApplicationLabel; 11 | 12 | public class NewFolderLayout 13 | extends LinearLayout { 14 | private EditText folderName; 15 | 16 | public NewFolderLayout(Context context) { 17 | this(context, null); 18 | } 19 | 20 | public NewFolderLayout(Context context, AttributeSet attrs) { 21 | this(context, attrs, 0); 22 | } 23 | 24 | public NewFolderLayout(Context context, AttributeSet attrs, int defStyle) { 25 | super(context, attrs, defStyle); 26 | } 27 | 28 | @Override 29 | protected void onFinishInflate() { 30 | super.onFinishInflate(); 31 | folderName = findViewById(R.id.new_folder); 32 | folderName.setText(getApplicationLabel()); 33 | } 34 | 35 | public String getFolderName() { 36 | return folderName.getText().toString(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/settings/SettingsGroup.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.settings; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | public class SettingsGroup { 23 | public final String name; 24 | public final List settingViews = new ArrayList<>(); 25 | 26 | public SettingsGroup(int name) { 27 | this(SettingView.getString(name)); 28 | } 29 | 30 | public SettingsGroup(String name) { 31 | this.name = name; 32 | } 33 | 34 | public SettingView add(SettingView settingView) { 35 | settingViews.add(settingView); 36 | return settingView; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/settings/base_directory/LocalThreadsBaseDirectory.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.settings.base_directory 2 | 3 | import android.net.Uri 4 | import com.github.adamantcheese.chan.core.settings.ChanSettings 5 | import com.github.k1rakishou.fsaf.manager.base_directory.BaseDirectory 6 | import java.io.File 7 | 8 | class LocalThreadsBaseDirectory : BaseDirectory() { 9 | 10 | override fun getDirFile(): File? { 11 | val path = ChanSettings.localThreadLocation.fileApiBaseDir.get() 12 | if (path.isEmpty()) { 13 | return null 14 | } 15 | 16 | return File(path) 17 | } 18 | 19 | override fun getDirUri(): Uri? { 20 | val path = ChanSettings.localThreadLocation.safBaseDir.get() 21 | if (path.isEmpty()) { 22 | return null 23 | } 24 | 25 | return Uri.parse(path) 26 | } 27 | 28 | override fun currentActiveBaseDirType(): ActiveBaseDirType { 29 | return when { 30 | ChanSettings.localThreadLocation.isSafDirActive() -> ActiveBaseDirType.SafBaseDir 31 | ChanSettings.localThreadLocation.isFileDirActive() -> ActiveBaseDirType.JavaFileBaseDir 32 | else -> throw IllegalStateException("LocalThreadsBaseDirectory: No active base directory!!!") 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/settings/base_directory/SavedFilesBaseDirectory.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.settings.base_directory 2 | 3 | import android.net.Uri 4 | import com.github.adamantcheese.chan.core.settings.ChanSettings 5 | import com.github.k1rakishou.fsaf.manager.base_directory.BaseDirectory 6 | import java.io.File 7 | 8 | class SavedFilesBaseDirectory : BaseDirectory() { 9 | 10 | override fun getDirFile(): File? { 11 | val path = ChanSettings.saveLocation.fileApiBaseDir.get() 12 | if (path.isEmpty()) { 13 | return null 14 | } 15 | 16 | return File(path) 17 | } 18 | 19 | override fun getDirUri(): Uri? { 20 | val path = ChanSettings.saveLocation.safBaseDir.get() 21 | if (path.isEmpty()) { 22 | return null 23 | } 24 | 25 | return Uri.parse(path) 26 | } 27 | 28 | override fun currentActiveBaseDirType(): ActiveBaseDirType { 29 | return when { 30 | ChanSettings.saveLocation.isSafDirActive() -> ActiveBaseDirType.SafBaseDir 31 | ChanSettings.saveLocation.isFileDirActive() -> ActiveBaseDirType.JavaFileBaseDir 32 | else -> throw IllegalStateException("SavedFilesBaseDirectory: No active base directory!!!") 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/text/FastTextViewMovementMethod.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.text; 18 | 19 | import android.text.Spanned; 20 | import android.view.MotionEvent; 21 | 22 | public interface FastTextViewMovementMethod { 23 | boolean onTouchEvent(FastTextView widget, Spanned buffer, MotionEvent event); 24 | } 25 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/toolbar/ToolbarMiddleMenu.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Kuroba - *chan browser https://github.com/Adamantcheese/Kuroba/ 3 | * 4 | * This program is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | package com.github.adamantcheese.chan.ui.toolbar; 18 | 19 | import android.view.View; 20 | 21 | public interface ToolbarMiddleMenu { 22 | void show(View anchor); 23 | } 24 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/view/ThumbnailImageView.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.ImageView 6 | 7 | class ThumbnailImageView( 8 | context: Context, 9 | attrs: AttributeSet? = null, 10 | defStyleAttrs: Int = 0 11 | ) : ImageView(context, attrs, defStyleAttrs) -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/ui/widget/CancellableToast.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.ui.widget 2 | 3 | import android.widget.Toast 4 | import com.github.adamantcheese.chan.utils.AndroidUtils.getAppContext 5 | import com.github.adamantcheese.chan.utils.AndroidUtils.getString 6 | import com.github.adamantcheese.chan.utils.BackgroundUtils 7 | 8 | class CancellableToast { 9 | private var toast: Toast? = null 10 | 11 | fun showToast(message: String) { 12 | showToast(message, Toast.LENGTH_SHORT) 13 | } 14 | 15 | fun showToast(msgResId: Int) { 16 | showToast(getString(msgResId), Toast.LENGTH_SHORT) 17 | } 18 | 19 | fun showToast(msgResId: Int, duration: Int) { 20 | showToast(getString(msgResId), duration) 21 | } 22 | 23 | fun showToast(message: String, duration: Int) { 24 | BackgroundUtils.ensureMainThread() 25 | 26 | if (toast != null) { 27 | toast!!.cancel() 28 | toast = null 29 | } 30 | 31 | toast = Toast.makeText(getAppContext(), message, duration).apply { show() } 32 | } 33 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/utils/ConversionUtils.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.utils 2 | 3 | import okhttp3.internal.and 4 | 5 | 6 | object ConversionUtils { 7 | 8 | @JvmStatic 9 | fun intToByteArray(value: Int): ByteArray { 10 | return byteArrayOf( 11 | (value ushr 24).toByte(), 12 | (value ushr 16).toByte(), 13 | (value ushr 8).toByte(), 14 | value.toByte() 15 | ) 16 | } 17 | 18 | @JvmStatic 19 | fun intToCharArray(value: Int): CharArray { 20 | return charArrayOf( 21 | (value ushr 24).toChar(), 22 | (value ushr 16).toChar(), 23 | (value ushr 8).toChar(), 24 | value.toChar() 25 | ) 26 | } 27 | 28 | @JvmStatic 29 | fun byteArrayToInt(bytes: ByteArray): Int { 30 | return (bytes[0] and 0xFF) shl 24 or 31 | ((bytes[1] and 0xFF) shl 16) or 32 | ((bytes[2] and 0xFF) shl 8) or 33 | ((bytes[3] and 0xFF) shl 0) 34 | } 35 | 36 | @JvmStatic 37 | fun charArrayToInt(bytes: CharArray): Int { 38 | return (bytes[0].toByte() and 0xFF) shl 24 or 39 | ((bytes[1].toByte() and 0xFF) shl 16) or 40 | ((bytes[2].toByte() and 0xFF) shl 8) or 41 | ((bytes[3].toByte() and 0xFF) shl 0) 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/java/com/github/adamantcheese/chan/utils/HashingUtil.kt: -------------------------------------------------------------------------------- 1 | package com.github.adamantcheese.chan.utils 2 | 3 | import okio.ByteString.Companion.encodeUtf8 4 | import okio.HashingSource 5 | import okio.blackholeSink 6 | import okio.buffer 7 | import okio.source 8 | import java.io.InputStream 9 | 10 | object HashingUtil { 11 | 12 | fun inputStreamHash(inputStream: InputStream): String { 13 | return HashingSource.md5(inputStream.source()).use { hashingSource -> 14 | return@use hashingSource.buffer().use { source -> 15 | source.readAll(blackholeSink()) 16 | return@use hashingSource.hash.hex() 17 | } 18 | } 19 | } 20 | 21 | fun stringHash(inputString: String): String { 22 | return inputString.encodeUtf8().md5().hex() 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_action_pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_action_pause.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_arrow_forward_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_arrow_forward_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_bookmark_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_bookmark_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_clear_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_clear_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_create_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_create_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_done_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_done_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_expand_less_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_expand_less_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_expand_more_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_expand_more_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_help_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_help_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_history_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_history_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_image_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_image_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_overflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_overflow.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_overflow_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_overflow_black.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_48dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_radio_button_unchecked_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_radio_button_unchecked_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_reorder_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_reorder_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_select_all_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_select_all_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_stat_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_stat_notify.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_stat_notify_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_stat_notify_alert.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_subdirectory_arrow_left_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_subdirectory_arrow_left_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_task_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_task_description.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_view_list_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_view_list_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_view_module_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_view_module_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_volume_off_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_volume_off_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/ic_volume_up_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/ic_volume_up_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-hdpi/partyhat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-hdpi/partyhat.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/archived_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/archived_icon.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/closed_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/closed_icon.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/error_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/error_icon.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_action_pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_action_pause.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_arrow_forward_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_arrow_forward_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_bookmark_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_bookmark_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_chevron_left_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 25 | 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_clear_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_clear_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_create_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_create_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_done_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_done_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_expand_less_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_expand_less_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_expand_more_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_expand_more_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_help_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_help_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_history_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_history_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_image_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_image_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_overflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_overflow.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_overflow_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_overflow_black.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_48dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_radio_button_unchecked_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_radio_button_unchecked_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_reorder_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_reorder_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_select_all_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_select_all_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_stat_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_stat_notify.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_stat_notify_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_stat_notify_alert.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_subdirectory_arrow_left_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_subdirectory_arrow_left_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_task_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_task_description.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_view_list_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_view_list_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_view_module_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_view_module_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_volume_off_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_volume_off_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/ic_volume_up_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/ic_volume_up_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/sticky_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/sticky_icon.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/trash_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/trash_icon.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-mdpi/youtube_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-mdpi/youtube_icon.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_action_pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_action_pause.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_arrow_forward_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_arrow_forward_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_bookmark_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_bookmark_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_create_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_create_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_done_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_done_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_expand_less_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_expand_less_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_expand_more_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_expand_more_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_help_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_help_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_history_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_history_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_image_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_image_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_overflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_overflow.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_overflow_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_overflow_black.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_48dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_radio_button_unchecked_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_radio_button_unchecked_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_reorder_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_reorder_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_select_all_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_select_all_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_stat_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_stat_notify.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_stat_notify_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_stat_notify_alert.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_subdirectory_arrow_left_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_subdirectory_arrow_left_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_task_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_task_description.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_view_list_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_view_list_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_view_module_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_view_module_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_volume_off_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_volume_off_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xhdpi/ic_volume_up_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xhdpi/ic_volume_up_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_action_pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_action_pause.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_arrow_forward_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_arrow_forward_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_bookmark_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_bookmark_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_expand_less_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_expand_less_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_expand_more_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_expand_more_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_folder_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 25 | 26 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_help_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_help_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_image_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_image_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_overflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_overflow.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_overflow_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_overflow_black.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_48dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_radio_button_unchecked_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_radio_button_unchecked_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_reorder_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_reorder_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_select_all_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_select_all_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_stat_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_stat_notify.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_stat_notify_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_stat_notify_alert.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_subdirectory_arrow_left_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_subdirectory_arrow_left_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_task_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_task_description.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_view_list_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_view_list_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_view_module_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_view_module_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_volume_off_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_volume_off_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxhdpi/ic_volume_up_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxhdpi/ic_volume_up_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_arrow_forward_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_arrow_forward_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_bookmark_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_bookmark_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_bookmark_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_bookmark_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_create_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_create_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_done_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_done_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_file_download_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_file_download_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_help_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_help_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_history_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_history_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_image_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_image_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_more_vert_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_more_vert_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_48dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_radio_button_unchecked_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_radio_button_unchecked_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_reorder_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_reorder_black_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_select_all_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_select_all_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_stat_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_stat_notify.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_stat_notify_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_stat_notify_alert.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_subdirectory_arrow_left_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_subdirectory_arrow_left_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_task_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_task_description.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_view_list_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_view_list_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_view_module_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_view_module_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_volume_off_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_volume_off_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable-xxxhdpi/ic_volume_up_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable-xxxhdpi/ic_volume_up_white_24dp.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/background_accent_rounded.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/background_hint_arrow.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/circle_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/ic_blue_checkmark_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/ic_download_anim0.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/ic_download_anim1.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/ic_splash_screen.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/K1rakishou/Kuroba/0e5ace5bb57c8f5d17ae2ec2600f03d07750ad5c/Kuroba/app/src/main/res/drawable/ic_splash_screen.9.png -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/item_background.xml: -------------------------------------------------------------------------------- 1 | 17 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/panel_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 11 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/setting_description_bottom.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/setting_description_bottom_dark.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/setting_description_top.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/drawable/setting_description_top_dark.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_album_download.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 28 | 29 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_archive.xml: -------------------------------------------------------------------------------- 1 | 17 | 23 | 24 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_browse_board.xml: -------------------------------------------------------------------------------- 1 | 17 | 29 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_browse_input.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_divider.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 25 | 26 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_file.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 28 | 29 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_post_last_seen.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/cell_thread_status.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/controller_album_view.xml: -------------------------------------------------------------------------------- 1 | 17 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/controller_navigation_setup.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 27 | 28 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/controller_navigation_toolbar.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 26 | 27 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/controller_site_setup.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/controller_thread_slide.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 27 | 28 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/dialog_post_delete.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/layout_archives.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/layout_controller_popup.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/layout_post_replies_container.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/layout_reply_captcha.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/layout_split_empty.xml: -------------------------------------------------------------------------------- 1 | 17 | 21 | 22 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Kuroba/app/src/main/res/layout/layout_thread_error.xml: -------------------------------------------------------------------------------- 1 | 17 | 22 | 23 | 30 | 31 |