From 96c89a716eddcdf882bbaddd05c854ef92484607 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 19 May 2023 14:19:02 +0300 Subject: [PATCH] Refactoring --- app/build.gradle | 2 +- app/proguard-rules.pro | 2 +- .../kotatsu/tracker/domain/TrackerTest.kt | 4 +- .../LoggingAdapterDataObserver.kt | 2 +- .../org/koitharu/kotatsu/util/ext/DebugExt.kt | 3 + .../koitharu/kotatsu/utils/ext/DebugExt.kt | 3 - .../java/org/koitharu/kotatsu/KotatsuApp.kt | 4 +- .../koitharu/kotatsu/base/ui/BaseService.kt | 5 - .../bookmarks/domain/BookmarksRepository.kt | 6 +- .../kotatsu/bookmarks/ui/BookmarksActivity.kt | 10 +- .../kotatsu/bookmarks/ui/BookmarksFragment.kt | 34 +++--- .../ui/BookmarksSelectionDecoration.kt | 5 +- .../bookmarks/ui/BookmarksViewModel.kt | 8 +- .../bookmarks/ui/adapter/BookmarkListAD.kt | 16 +-- .../bookmarks/ui/adapter/BookmarksAdapter.kt | 6 +- .../bookmarks/ui/adapter/BookmarksGroupAD.kt | 18 ++-- .../ui/adapter/BookmarksGroupAdapter.kt | 4 +- .../kotatsu/browser/BrowserActivity.kt | 34 +++--- .../browser/cloudflare/CloudFlareDialog.kt | 25 ++--- .../org/koitharu/kotatsu/core/AppModule.kt | 14 +-- .../kotatsu/core/backup/BackupRepository.kt | 2 +- .../kotatsu/core/backup/BackupZipOutput.kt | 7 +- .../koitharu/kotatsu/core/db/MangaDatabase.kt | 2 +- .../kotatsu/core/db/entity/EntityMapping.kt | 2 +- .../exceptions/resolve/DialogErrorObserver.kt | 4 +- .../core/exceptions/resolve/ErrorObserver.kt | 4 +- .../exceptions/resolve/ExceptionResolver.kt | 6 +- .../resolve/SnackbarErrorObserver.kt | 4 +- .../core/github/AppUpdateRepository.kt | 6 +- .../koitharu/kotatsu/core/logs/FileLogger.kt | 8 +- .../org/koitharu/kotatsu/core/model/Manga.kt | 2 +- .../core/model/parcelable/Parcelable.kt | 4 +- .../model/parcelable/ParcelableMangaTags.kt | 6 +- .../core/network/CommonHeadersInterceptor.kt | 2 +- .../kotatsu/core/network/DoHManager.kt | 10 +- .../kotatsu/core/network/SSLBypass.kt | 2 +- .../network/cookies/PreferencesCookieJar.kt | 2 +- .../koitharu/kotatsu/core/os/NetworkState.kt | 4 +- .../kotatsu/core/os/ShortcutsUpdater.kt | 10 +- .../{utils => core/os}/VoiceInputContract.kt | 2 +- .../parser}/MangaDataRepository.kt | 7 +- .../domain => core/parser}/MangaIntent.kt | 8 +- .../core/parser/MangaLoaderContextImpl.kt | 2 +- .../core/parser/RemoteMangaRepository.kt | 4 +- .../kotatsu/core/prefs/AppSettings.kt | 12 +-- .../kotatsu/core/prefs/SourceSettings.kt | 6 +- .../{base => core}/ui/AlertDialogFragment.kt | 27 +++-- .../kotatsu/{base => core}/ui/BaseActivity.kt | 16 +-- .../{base => core}/ui/BaseBottomSheet.kt | 28 +++-- .../kotatsu/{base => core}/ui/BaseFragment.kt | 30 ++++-- .../ui/BaseFullscreenActivity.kt | 4 +- .../ui/BasePreferenceFragment.kt | 7 +- .../koitharu/kotatsu/core/ui/BaseService.kt | 5 + .../{base => core}/ui/BaseViewModel.kt | 8 +- .../ui/CoroutineIntentService.kt | 4 +- .../ui/DefaultActivityLifecycleCallbacks.kt | 2 +- .../ui/dialog/AppBottomSheetDialog.kt | 4 +- .../ui/dialog/CheckBoxAlertDialog.kt | 4 +- .../ui/{ => dialog}/ErrorDetailsDialog.kt | 19 ++-- .../ui/dialog/RecyclerViewAlertDialog.kt | 2 +- .../dialog/RememberSelectionDialogListener.kt | 4 +- .../ui/dialog/StorageSelectDialog.kt | 4 +- .../ui/dialog/TwoButtonsAlertDialog.kt | 2 +- .../ui}/image/CoilImageGetter.kt | 2 +- .../ui}/image/CoverSizeResolver.kt | 8 +- .../ui}/image/FaviconFallbackDrawable.kt | 9 +- .../ui}/image/RegionBitmapDecoder.kt | 8 +- .../ui}/image/TrimTransformation.kt | 10 +- .../AdapterDelegateClickListenerAdapter.kt | 2 +- .../ui/list/BoundsScrollListener.kt | 2 +- .../ui/list/FitHeightGridLayoutManager.kt | 4 +- .../ui/list/FitHeightLinearLayoutManager.kt | 4 +- .../ui/list/ListSelectionController.kt | 6 +- .../ui/list/NestedScrollStateHandle.kt | 2 +- .../ui/list/OnListItemClickListener.kt | 2 +- .../ui/list/OnTipCloseListener.kt | 2 +- .../ui/list/PaginationScrollListener.kt | 4 +- .../ScrollListenerInvalidationObserver.kt | 2 +- .../ui/list/SectionedSelectionController.kt | 4 +- .../decor/AbstractDividerItemDecoration.kt | 6 +- .../decor/AbstractSelectionItemDecoration.kt | 6 +- .../ui/list/decor/SpacingItemDecoration.kt | 2 +- .../list/decor/TypedSpacingItemDecoration.kt | 6 +- .../ui/list/fastscroll/BubbleAnimator.kt | 6 +- .../list/fastscroll/FastScrollRecyclerView.kt | 4 +- .../ui/list/fastscroll/FastScroller.kt | 13 ++- .../ui/list/fastscroll/ScrollbarAnimator.kt | 4 +- .../core/ui/{ => model}/DateTimeAgo.kt | 10 +- .../kotatsu/core/ui/{ => model}/SortOrder.kt | 4 +- .../ui/util/ActionModeDelegate.kt | 2 +- .../ui/util/ActionModeListener.kt | 4 +- .../ui/util/ActivityRecreationHandle.kt | 4 +- .../ui/util/BaseActivityEntryPoint.kt | 2 +- .../ui/util/CollapseActionViewCallback.kt | 2 +- .../ui/util/CountedBooleanLiveData.kt | 4 +- .../ui/util/DefaultTextWatcher.kt | 2 +- .../ui/util/RecyclerViewOwner.kt | 4 +- .../ui/util/ReversibleAction.kt | 5 +- .../ui/util/ReversibleActionObserver.kt | 3 +- .../ui/util}/ReversibleHandle.kt | 8 +- .../ui/util/ShrinkOnScrollBehavior.kt | 2 +- .../ui/util/SpanSizeResolver.kt | 2 +- .../ui/util/StatusBarDimHelper.kt | 6 +- .../ui/util/WindowInsetsDelegate.kt | 2 +- .../ui/widgets/BottomSheetHeaderBar.kt | 8 +- .../ui/widgets/CheckableImageView.kt | 4 +- .../{base => core}/ui/widgets/ChipsView.kt | 8 +- .../ui/widgets/CoverImageView.kt | 4 +- .../HideBottomNavigationOnScrollBehavior.kt | 6 +- .../ui/widgets/ListItemTextView.kt | 4 +- .../ui/widgets/SegmentedBarView.kt | 14 ++- .../ui/widgets/SelectableTextView.kt | 4 +- .../{base => core}/ui/widgets/ShapeView.kt | 2 +- .../ui/widgets/SlidingBottomNavigationView.kt | 8 +- .../ui/widgets/TwoLinesItemView.kt | 4 +- .../ui/widgets/WindowInsetHolder.kt | 2 +- .../util}/AlphanumComparator.kt | 4 +- .../{utils => core/util}/BufferedObserver.kt | 4 +- .../{utils => core/util}/CancellableSource.kt | 2 +- .../{utils => core/util}/CompositeMutex.kt | 2 +- .../{utils => core/util}/EditTextValidator.kt | 6 +- .../kotatsu/{utils => core/util}/FileSize.kt | 8 +- .../{utils => core/util}/FlowLiveData.kt | 2 +- .../util}/GoneOnInvisibleListener.kt | 2 +- .../{utils => core/util}/GridTouchHelper.kt | 3 +- .../{utils => core/util}/IdlingDetector.kt | 2 +- .../util}/IncognitoModeIndicator.kt | 6 +- .../{utils => core/util}/MediatorStateFlow.kt | 2 +- .../util}/RecyclerViewScrollCallback.kt | 4 +- .../util}/RetainedLifecycleCoroutineScope.kt | 2 +- .../util}/ScreenOrientationHelper.kt | 8 +- .../{utils => core/util}/ShareHelper.kt | 2 +- .../{utils => core/util}/SingleLiveEvent.kt | 2 +- .../util}/TaggedActivityResult.kt | 4 +- .../kotatsu/{utils => core/util}/Throttler.kt | 2 +- .../kotatsu/{utils => core/util}/ViewBadge.kt | 2 +- .../{utils => core/util}/WorkManagerHelper.kt | 2 +- .../util}/WorkServiceStopHelper.kt | 4 +- .../util/ext/Android.kt} | 8 +- .../{utils => core/util}/ext/Bundle.kt | 2 +- .../ext/CoilExt.kt => core/util/ext/Coil.kt} | 7 +- .../util/ext/Collections.kt} | 3 +- .../util/ext/Coroutines.kt} | 2 +- .../CursorExt.kt => core/util/ext/Cursor.kt} | 4 +- .../ext/DateExt.kt => core/util/ext/Date.kt} | 6 +- .../util/ext/Display.kt} | 2 +- .../ext/FileExt.kt => core/util/ext/File.kt} | 2 +- .../ext/FlowExt.kt => core/util/ext/Flow.kt} | 2 +- .../util/ext/Fragment.kt} | 2 +- .../util/ext/Graphics.kt} | 4 +- .../ext/HttpExt.kt => core/util/ext/Http.kt} | 2 +- .../kotatsu/{utils => core/util}/ext/IO.kt | 6 +- .../InsetsExt.kt => core/util/ext/Insets.kt} | 2 +- .../util/ext/LiveData.kt} | 4 +- .../util/ext/LocaleList.kt} | 6 +- .../{utils => core/util}/ext/Network.kt | 2 +- .../OtherExt.kt => core/util/ext/Other.kt} | 2 +- .../util/ext/Preferences.kt} | 4 +- .../util/ext/Primitive.kt} | 2 +- .../kotatsu/core/util/ext/RecyclerView.kt | 81 ++++++++++++++ .../util/ext/Resources.kt} | 2 +- .../StringExt.kt => core/util/ext/String.kt} | 3 +- .../util/ext/TextView.kt} | 2 +- .../ThemeExt.kt => core/util/ext/Theme.kt} | 2 +- .../util/ext/Throwable.kt} | 15 +-- .../ext/ViewExt.kt => core/util/ext/View.kt} | 66 +----------- .../{utils => core/util}/ext/ViewModel.kt | 2 +- .../progress/ImageRequestIndicatorListener.kt | 2 +- .../progress/IntPercentLabelFormatter.kt | 2 +- .../util}/progress/PausingProgressJob.kt | 2 +- .../util}/progress/ProgressDeferred.kt | 4 +- .../util}/progress/ProgressJob.kt | 4 +- .../util}/progress/ProgressResponseBody.kt | 2 +- .../util}/progress/TimeLeftEstimator.kt | 2 +- .../details/service/MangaPrefetchService.kt | 8 +- .../details/ui/ChaptersBottomSheetMediator.kt | 4 +- .../kotatsu/details/ui/ChaptersFragment.kt | 29 ++--- .../kotatsu/details/ui/DetailsActivity.kt | 78 +++++++------- .../kotatsu/details/ui/DetailsFragment.kt | 76 ++++++------- .../kotatsu/details/ui/DetailsMenuProvider.kt | 2 +- .../kotatsu/details/ui/DetailsViewModel.kt | 14 +-- .../details/ui/MangaDetailsDelegate.kt | 8 +- .../kotatsu/details/ui/adapter/BranchAD.kt | 6 +- .../details/ui/adapter/BranchesAdapter.kt | 2 +- .../details/ui/adapter/ChapterListItemAD.kt | 12 ++- .../details/ui/adapter/ChaptersAdapter.kt | 4 +- .../ui/adapter/ChaptersSelectionDecoration.kt | 4 +- .../details/ui/scrobbling/ScrobblingInfoAD.kt | 6 +- .../scrobbling/ScrobblingInfoBottomSheet.kt | 41 +++---- .../download/ui/list/DownloadItemAD.kt | 10 +- .../download/ui/list/DownloadItemListener.kt | 2 +- .../download/ui/list/DownloadsActivity.kt | 18 ++-- .../download/ui/list/DownloadsAdapter.kt | 2 +- .../ui/list/DownloadsSelectionDecoration.kt | 6 +- .../download/ui/list/DownloadsViewModel.kt | 14 +-- .../ui/worker/DownloadNotificationFactory.kt | 4 +- .../ui/worker/DownloadStartedObserver.kt | 2 +- .../download/ui/worker/DownloadWorker.kt | 20 ++-- .../download/ui/worker/PausingReceiver.kt | 2 +- .../explore/domain/ExploreRepository.kt | 8 +- .../kotatsu/explore/ui/ExploreFragment.kt | 28 ++--- .../kotatsu/explore/ui/ExploreViewModel.kt | 10 +- .../explore/ui/adapter/ExploreAdapter.kt | 2 +- .../ui/adapter/ExploreAdapterDelegates.kt | 16 +-- .../favourites/domain/FavouritesRepository.kt | 4 +- .../favourites/ui/FavouritesActivity.kt | 5 +- .../categories/CategoriesSelectionCallback.kt | 6 +- .../CategoriesSelectionDecoration.kt | 10 +- .../categories/FavouriteCategoriesActivity.kt | 38 +++---- .../FavouriteCategoriesListListener.kt | 4 +- .../FavouritesCategoriesViewModel.kt | 8 +- .../ui/categories/adapter/CategoryAD.kt | 10 +- .../edit/FavouritesCategoryEditActivity.kt | 62 +++++------ .../edit/FavouritesCategoryEditViewModel.kt | 6 +- .../select/FavouriteCategoriesBottomSheet.kt | 14 +-- .../select/MangaCategoriesViewModel.kt | 4 +- .../select/adapter/MangaCategoriesAdapter.kt | 4 +- .../select/adapter/MangaCategoryAD.kt | 6 +- .../ui/list/FavouritesListFragment.kt | 15 +-- .../ui/list/FavouritesListMenuProvider.kt | 2 +- .../ui/list/FavouritesListViewModel.kt | 4 +- .../history/domain/HistoryRepository.kt | 4 +- .../kotatsu/history/ui/HistoryActivity.kt | 7 +- .../kotatsu/history/ui/HistoryListAdapter.kt | 4 +- .../kotatsu/history/ui/HistoryListFragment.kt | 13 +-- .../history/ui/HistoryListViewModel.kt | 12 +-- .../ui/util/ReadingProgressDrawable.kt | 9 +- .../history/ui/util/ReadingProgressView.kt | 2 +- .../kotatsu/image/ui/ImageActivity.kt | 14 +-- .../kotatsu/list/ui/ListModeBottomSheet.kt | 19 ++-- .../kotatsu/list/ui/MangaListFragment.kt | 70 ++++++------ .../kotatsu/list/ui/MangaListViewModel.kt | 8 +- .../list/ui/MangaSelectionDecoration.kt | 6 +- .../kotatsu/list/ui/adapter/EmptyHintAD.kt | 8 +- .../list/ui/adapter/EmptyStateListAD.kt | 8 +- .../kotatsu/list/ui/adapter/ErrorFooterAD.kt | 6 +- .../list/ui/adapter/ErrorStateListAD.kt | 6 +- .../kotatsu/list/ui/adapter/ListHeader2AD.kt | 6 +- .../kotatsu/list/ui/adapter/ListHeaderAD.kt | 2 +- .../ui/adapter/MangaDetailsClickListener.kt | 2 +- .../list/ui/adapter/MangaGridItemAD.kt | 12 +-- .../list/ui/adapter/MangaListAdapter.kt | 2 +- .../ui/adapter/MangaListDetailedItemAD.kt | 14 +-- .../list/ui/adapter/MangaListItemAD.kt | 12 +-- .../list/ui/adapter/RelatedDateItemAD.kt | 4 +- .../list/ui/filter/FilterAdapterDelegates.kt | 10 +- .../list/ui/filter/FilterBottomSheet.kt | 19 ++-- .../list/ui/filter/FilterCoordinator.kt | 12 +-- .../kotatsu/list/ui/model/ListHeader.kt | 6 +- .../kotatsu/list/ui/model/ListHeader2.kt | 7 +- .../list/ui/model/ListModelConversionExt.kt | 4 +- .../list/ui/model/MangaListDetailedModel.kt | 2 +- .../kotatsu/local/data/LocalStorageManager.kt | 4 +- .../koitharu/kotatsu/local/data/MangaIndex.kt | 3 +- .../koitharu/kotatsu/local/data/PagesCache.kt | 16 +-- .../data/importer/SingleMangaImporter.kt | 4 +- .../local/data/input/LocalMangaDirInput.kt | 13 ++- .../local/data/input/LocalMangaZipInput.kt | 36 +++---- .../local/data/output/LocalMangaDirOutput.kt | 4 +- .../local/data/output/LocalMangaZipOutput.kt | 4 +- .../local/domain/LocalMangaRepository.kt | 11 +- .../kotatsu/local/ui/ImportDialogFragment.kt | 8 +- .../koitharu/kotatsu/local/ui/ImportWorker.kt | 6 +- .../local/ui/LocalChaptersRemoveService.kt | 6 +- .../kotatsu/local/ui/LocalListFragment.kt | 17 +-- .../kotatsu/local/ui/LocalListViewModel.kt | 8 +- .../main/ui/MainActionButtonBehavior.kt | 4 +- .../koitharu/kotatsu/main/ui/MainActivity.kt | 83 +++++++------- .../kotatsu/main/ui/MainNavigationDelegate.kt | 6 +- .../koitharu/kotatsu/main/ui/MainViewModel.kt | 6 +- .../kotatsu/main/ui/owners/BottomNavOwner.kt | 2 +- .../main/ui/owners/NoModalBottomSheetOwner.kt | 2 +- .../main/ui/protect/AppProtectHelper.kt | 5 +- .../main/ui/protect/ProtectActivity.kt | 32 +++--- .../main/ui/protect/ProtectViewModel.kt | 6 +- .../kotatsu/reader/domain/PageLoader.kt | 8 +- .../kotatsu/reader/ui/ChaptersBottomSheet.kt | 16 +-- .../kotatsu/reader/ui/PageSaveHelper.kt | 4 +- .../kotatsu/reader/ui/ReaderActivity.kt | 102 +++++++++--------- .../reader/ui/ReaderControlDelegate.kt | 2 +- .../kotatsu/reader/ui/ReaderInfoBarView.kt | 8 +- .../kotatsu/reader/ui/ReaderViewModel.kt | 20 ++-- .../colorfilter/ColorFilterConfigActivity.kt | 46 ++++---- .../colorfilter/ColorFilterConfigViewModel.kt | 8 +- .../ui/config/ReaderConfigBottomSheet.kt | 20 ++-- .../reader/ui/pager/BaseReaderAdapter.kt | 2 +- .../reader/ui/pager/BaseReaderFragment.kt | 9 +- .../reader/ui/pager/PageHolderDelegate.kt | 2 +- .../pager/reversed/ReversedReaderFragment.kt | 29 +++-- .../reader/ui/pager/standard/PageHolder.kt | 7 +- .../ui/pager/standard/PagerReaderFragment.kt | 29 +++-- .../reader/ui/pager/webtoon/WebtoonHolder.kt | 6 +- .../ui/pager/webtoon/WebtoonImageView.kt | 2 +- .../ui/pager/webtoon/WebtoonReaderFragment.kt | 27 +++-- .../ui/pager/webtoon/WebtoonRecyclerView.kt | 7 +- .../ui/thumbnails/PagesThumbnailsSheet.kt | 29 +++-- .../ui/thumbnails/PagesThumbnailsViewModel.kt | 4 +- .../ui/thumbnails/adapter/PageThumbnailAD.kt | 16 +-- .../adapter/PageThumbnailAdapter.kt | 2 +- .../remotelist/ui/RemoteListFragment.kt | 11 +- .../remotelist/ui/RemoteListViewModel.kt | 10 +- .../scrobbling/anilist/data/ScoreFormat.kt | 2 +- .../scrobbling/common/domain/Scrobbler.kt | 8 +- .../ui/config/ScrobblerConfigActivity.kt | 30 +++--- .../ui/config/ScrobblerConfigViewModel.kt | 14 +-- .../ui/config/adapter/ScrobblingMangaAD.kt | 10 +- .../config/adapter/ScrobblingMangaAdapter.kt | 2 +- .../selector/ScrobblingSelectorBottomSheet.kt | 36 +++---- .../selector/ScrobblingSelectorViewModel.kt | 16 +-- .../ui/selector/adapter/ScrobblerHintAD.kt | 6 +- .../ScrobblerMangaSelectionDecoration.kt | 2 +- .../adapter/ScrobblerSelectorAdapter.kt | 2 +- .../ui/selector/adapter/ScrobblingMangaAD.kt | 10 +- .../shikimori/data/ShikimoriRepository.kt | 2 +- .../search/domain/MangaSearchRepository.kt | 2 +- .../kotatsu/search/ui/MangaListActivity.kt | 10 +- .../kotatsu/search/ui/SearchActivity.kt | 18 ++-- .../kotatsu/search/ui/SearchFragment.kt | 4 +- .../kotatsu/search/ui/SearchViewModel.kt | 4 +- .../search/ui/multi/MultiSearchActivity.kt | 26 ++--- .../search/ui/multi/MultiSearchViewModel.kt | 12 +-- .../ui/multi/adapter/MultiSearchAdapter.kt | 2 +- .../ui/multi/adapter/SearchResultsAD.kt | 12 +-- .../ui/suggestion/SearchSuggestionFragment.kt | 17 ++- .../SearchSuggestionItemCallback.kt | 6 +- .../suggestion/SearchSuggestionViewModel.kt | 6 +- .../adapter/SearchSuggestionSourceAD.kt | 10 +- .../adapter/SearchSuggestionTagsAD.kt | 4 +- .../adapter/SearchSuggestionsMangaListAD.kt | 12 +-- .../suggestion/model/SearchSuggestionItem.kt | 15 +-- .../search/ui/widget/SearchEditText.kt | 4 +- .../settings/AppearanceSettingsFragment.kt | 12 +-- .../settings/ContentSettingsFragment.kt | 12 +-- .../kotatsu/settings/DomainValidator.kt | 2 +- .../settings/HistorySettingsFragment.kt | 10 +- .../NotificationSettingsLegacyFragment.kt | 3 +- .../settings/ReaderSettingsFragment.kt | 4 +- .../kotatsu/settings/RootSettingsFragment.kt | 4 +- .../settings/ServicesSettingsFragment.kt | 8 +- .../kotatsu/settings/SettingsActivity.kt | 18 ++-- .../settings/SourceSettingsFragment.kt | 16 +-- .../settings/SuggestionsSettingsFragment.kt | 4 +- .../kotatsu/settings/SyncSettingsFragment.kt | 2 +- .../settings/about/AboutSettingsFragment.kt | 4 +- .../settings/about/AboutSettingsViewModel.kt | 6 +- .../kotatsu/settings/about/AppUpdateDialog.kt | 2 +- .../settings/backup/BackupDialogFragment.kt | 13 ++- .../settings/backup/BackupSettingsFragment.kt | 12 ++- .../settings/backup/BackupViewModel.kt | 4 +- .../settings/backup/RestoreDialogFragment.kt | 15 ++- .../settings/backup/RestoreViewModel.kt | 6 +- .../newsources/NewSourcesDialogFragment.kt | 9 +- .../newsources/NewSourcesViewModel.kt | 6 +- .../settings/onboard/OnboardDialogFragment.kt | 13 ++- .../settings/onboard/OnboardViewModel.kt | 6 +- .../onboard/adapter/SourceLocaleAD.kt | 4 +- .../settings/protect/ProtectSetupActivity.kt | 44 ++++---- .../settings/protect/ProtectSetupViewModel.kt | 6 +- .../settings/sources/SourcesListFragment.kt | 31 +++--- .../settings/sources/SourcesListViewModel.kt | 15 ++- .../adapter/SourceConfigAdapterDelegates.kt | 16 +-- .../sources/adapter/SourceConfigListener.kt | 2 +- .../sources/auth/SourceAuthActivity.kt | 36 +++---- .../kotatsu/settings/tools/ToolsFragment.kt | 18 ++-- .../kotatsu/settings/tools/ToolsViewModel.kt | 2 +- .../settings/tools/views/MemoryUsageView.kt | 6 +- .../tracker/TrackerSettingsFragment.kt | 9 +- .../tracker/TrackerSettingsViewModel.kt | 4 +- .../TrackerCategoriesConfigAdapter.kt | 2 +- .../TrackerCategoriesConfigSheet.kt | 10 +- .../TrackerCategoriesConfigViewModel.kt | 6 +- .../tracker/categories/TrackerCategoryAD.kt | 4 +- .../settings/utils/ActivityListPreference.kt | 2 +- .../settings/utils/EditTextBindListener.kt | 4 +- .../settings/utils/RingtonePickContract.kt | 2 +- .../settings/utils/SliderPreference.kt | 2 +- .../kotatsu/shelf/domain/ShelfRepository.kt | 2 +- .../kotatsu/shelf/ui/ShelfFragment.kt | 24 ++--- .../kotatsu/shelf/ui/ShelfMenuProvider.kt | 4 +- .../shelf/ui/ShelfSelectionCallback.kt | 8 +- .../kotatsu/shelf/ui/ShelfViewModel.kt | 8 +- .../kotatsu/shelf/ui/adapter/ShelfAdapter.kt | 6 +- .../kotatsu/shelf/ui/adapter/ShelfGroupAD.kt | 14 +-- .../shelf/ui/config/ShelfSettingsActivity.kt | 12 +-- .../config/ShelfSettingsAdapterDelegates.kt | 2 +- .../shelf/ui/config/ShelfSettingsViewModel.kt | 6 +- .../ui/config/size/ShelfSizeBottomSheet.kt | 18 ++-- .../domain/SuggestionRepository.kt | 2 +- .../suggestions/domain/TagsBlacklist.kt | 2 +- .../suggestions/ui/SuggestionsActivity.kt | 7 +- .../suggestions/ui/SuggestionsFragment.kt | 14 +-- .../suggestions/ui/SuggestionsViewModel.kt | 4 +- .../suggestions/ui/SuggestionsWorker.kt | 24 ++--- .../koitharu/kotatsu/sync/data/SyncAuthApi.kt | 2 +- .../kotatsu/sync/data/SyncSettings.kt | 2 +- .../kotatsu/sync/domain/SyncController.kt | 2 +- .../kotatsu/sync/domain/SyncHelper.kt | 8 +- .../kotatsu/sync/ui/SyncAuthActivity.kt | 48 ++++----- .../kotatsu/sync/ui/SyncAuthViewModel.kt | 6 +- .../kotatsu/sync/ui/SyncHostDialogFragment.kt | 20 ++-- .../ui/favourites/FavouritesSyncAdapter.kt | 4 +- .../sync/ui/history/HistorySyncAdapter.kt | 4 +- .../kotatsu/tracker/ui/feed/FeedFragment.kt | 24 ++--- .../tracker/ui/feed/FeedMenuProvider.kt | 2 +- .../kotatsu/tracker/ui/feed/FeedViewModel.kt | 10 +- .../tracker/ui/feed/adapter/FeedAdapter.kt | 2 +- .../tracker/ui/feed/adapter/FeedItemAD.kt | 12 +-- .../tracker/ui/updates/UpdatesActivity.kt | 6 +- .../tracker/ui/updates/UpdatesViewModel.kt | 4 +- .../kotatsu/tracker/work/TrackWorker.kt | 10 +- .../kotatsu/utils/ext/LayoutManagerExt.kt | 19 ---- .../widget/recent/RecentListFactory.kt | 4 +- .../widget/shelf/ShelfConfigActivity.kt | 20 ++-- .../widget/shelf/ShelfConfigViewModel.kt | 4 +- .../kotatsu/widget/shelf/ShelfListFactory.kt | 4 +- .../shelf/adapter/CategorySelectAdapter.kt | 4 +- .../shelf/adapter/CategorySelectItemAD.kt | 6 +- .../res/layout-w600dp/activity_categories.xml | 2 +- .../main/res/layout-w600dp/activity_main.xml | 2 +- .../res/layout-w600dp/fragment_details.xml | 4 +- .../main/res/layout-w600dp/fragment_tools.xml | 4 +- .../main/res/layout/activity_categories.xml | 2 +- app/src/main/res/layout/activity_details.xml | 4 +- app/src/main/res/layout/activity_main.xml | 4 +- .../main/res/layout/activity_search_multi.xml | 2 +- app/src/main/res/layout/dialog_import.xml | 6 +- app/src/main/res/layout/dialog_list_mode.xml | 2 +- app/src/main/res/layout/fragment_chapters.xml | 2 +- app/src/main/res/layout/fragment_details.xml | 4 +- app/src/main/res/layout/fragment_feed.xml | 4 +- app/src/main/res/layout/fragment_list.xml | 4 +- .../main/res/layout/fragment_list_simple.xml | 2 +- app/src/main/res/layout/fragment_shelf.xml | 2 +- app/src/main/res/layout/fragment_tools.xml | 4 +- app/src/main/res/layout/item_bookmark.xml | 4 +- .../main/res/layout/item_checkable_new.xml | 4 +- app/src/main/res/layout/item_color_scheme.xml | 6 +- app/src/main/res/layout/item_header_2.xml | 2 +- app/src/main/res/layout/item_manga_grid.xml | 2 +- .../res/layout/item_manga_list_details.xml | 2 +- app/src/main/res/layout/item_page_thumb.xml | 2 +- .../item_search_suggestion_manga_grid.xml | 2 +- .../layout/item_search_suggestion_tags.xml | 6 +- app/src/main/res/layout/item_storage.xml | 4 +- .../main/res/layout/layout_memory_usage.xml | 2 +- app/src/main/res/layout/sheet_base.xml | 4 +- app/src/main/res/layout/sheet_chapters.xml | 4 +- .../res/layout/sheet_favorite_categories.xml | 4 +- app/src/main/res/layout/sheet_filter.xml | 2 +- app/src/main/res/layout/sheet_pages.xml | 2 +- .../main/res/layout/sheet_reader_config.xml | 10 +- .../res/layout/sheet_scrobbling_selector.xml | 4 +- .../{utils => util}/CompositeMutexTest.kt | 3 +- 453 files changed, 2009 insertions(+), 1975 deletions(-) rename app/src/debug/java/org/koitharu/kotatsu/{utils => util}/LoggingAdapterDataObserver.kt (97%) create mode 100644 app/src/debug/java/org/koitharu/kotatsu/util/ext/DebugExt.kt delete mode 100644 app/src/debug/java/org/koitharu/kotatsu/utils/ext/DebugExt.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/BaseService.kt rename app/src/main/java/org/koitharu/kotatsu/{utils => core/os}/VoiceInputContract.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base/domain => core/parser}/MangaDataRepository.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base/domain => core/parser}/MangaIntent.kt (83%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/AlertDialogFragment.kt (54%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/BaseActivity.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/BaseBottomSheet.kt (73%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/BaseFragment.kt (53%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/BaseFullscreenActivity.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/BasePreferenceFragment.kt (88%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/ui/BaseService.kt rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/BaseViewModel.kt (87%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/CoroutineIntentService.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/DefaultActivityLifecycleCallbacks.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/dialog/AppBottomSheetDialog.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/dialog/CheckBoxAlertDialog.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/core/ui/{ => dialog}/ErrorDetailsDialog.kt (80%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/dialog/RecyclerViewAlertDialog.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/dialog/RememberSelectionDialogListener.kt (85%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/dialog/StorageSelectDialog.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/dialog/TwoButtonsAlertDialog.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/ui}/image/CoilImageGetter.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/ui}/image/CoverSizeResolver.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/ui}/image/FaviconFallbackDrawable.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/ui}/image/RegionBitmapDecoder.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/ui}/image/TrimTransformation.kt (91%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/AdapterDelegateClickListenerAdapter.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/BoundsScrollListener.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/FitHeightGridLayoutManager.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/FitHeightLinearLayoutManager.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/ListSelectionController.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/NestedScrollStateHandle.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/OnListItemClickListener.kt (79%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/OnTipCloseListener.kt (59%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/PaginationScrollListener.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/ScrollListenerInvalidationObserver.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/SectionedSelectionController.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/decor/AbstractDividerItemDecoration.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/decor/AbstractSelectionItemDecoration.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/decor/SpacingItemDecoration.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/decor/TypedSpacingItemDecoration.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/fastscroll/BubbleAnimator.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/fastscroll/FastScrollRecyclerView.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/fastscroll/FastScroller.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/list/fastscroll/ScrollbarAnimator.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/core/ui/{ => model}/DateTimeAgo.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/core/ui/{ => model}/SortOrder.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/ActionModeDelegate.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/ActionModeListener.kt (78%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/ActivityRecreationHandle.kt (86%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/BaseActivityEntryPoint.kt (86%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/CollapseActionViewCallback.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/CountedBooleanLiveData.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/DefaultTextWatcher.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/RecyclerViewOwner.kt (72%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/ReversibleAction.kt (56%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/ReversibleActionObserver.kt (86%) rename app/src/main/java/org/koitharu/kotatsu/{base/domain => core/ui/util}/ReversibleHandle.kt (70%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/ShrinkOnScrollBehavior.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/SpanSizeResolver.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/StatusBarDimHelper.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/util/WindowInsetsDelegate.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/BottomSheetHeaderBar.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/CheckableImageView.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/ChipsView.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/CoverImageView.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/HideBottomNavigationOnScrollBehavior.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/ListItemTextView.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/SegmentedBarView.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/SelectableTextView.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/ShapeView.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/SlidingBottomNavigationView.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/TwoLinesItemView.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{base => core}/ui/widgets/WindowInsetHolder.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/AlphanumComparator.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/BufferedObserver.kt (64%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/CancellableSource.kt (90%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/CompositeMutex.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/EditTextValidator.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/FileSize.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/FlowLiveData.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/GoneOnInvisibleListener.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/GridTouchHelper.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/IdlingDetector.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/IncognitoModeIndicator.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/MediatorStateFlow.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/RecyclerViewScrollCallback.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/RetainedLifecycleCoroutineScope.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ScreenOrientationHelper.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ShareHelper.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/SingleLiveEvent.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/TaggedActivityResult.kt (63%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/Throttler.kt (88%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ViewBadge.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/WorkManagerHelper.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/WorkServiceStopHelper.kt (91%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/AndroidExt.kt => core/util/ext/Android.kt} (95%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ext/Bundle.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/CoilExt.kt => core/util/ext/Coil.kt} (92%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/CollectionExt.kt => core/util/ext/Collections.kt} (95%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/CoroutineExt.kt => core/util/ext/Coroutines.kt} (98%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/CursorExt.kt => core/util/ext/Cursor.kt} (92%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/DateExt.kt => core/util/ext/Date.kt} (89%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/DisplayExt.kt => core/util/ext/Display.kt} (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/FileExt.kt => core/util/ext/File.kt} (98%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/FlowExt.kt => core/util/ext/Flow.kt} (96%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/FragmentExt.kt => core/util/ext/Fragment.kt} (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/GraphicsExt.kt => core/util/ext/Graphics.kt} (85%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/HttpExt.kt => core/util/ext/Http.kt} (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ext/IO.kt (80%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/InsetsExt.kt => core/util/ext/Insets.kt} (83%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/LiveDataExt.kt => core/util/ext/LiveData.kt} (88%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/LocaleListExt.kt => core/util/ext/LocaleList.kt} (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ext/Network.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/OtherExt.kt => core/util/ext/Other.kt} (77%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/PreferencesExt.kt => core/util/ext/Preferences.kt} (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/PrimitiveExt.kt => core/util/ext/Primitive.kt} (81%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/util/ext/RecyclerView.kt rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/ResourcesExt.kt => core/util/ext/Resources.kt} (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/StringExt.kt => core/util/ext/String.kt} (89%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/TextViewExt.kt => core/util/ext/TextView.kt} (97%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/ThemeExt.kt => core/util/ext/Theme.kt} (96%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/ThrowableExt.kt => core/util/ext/Throwable.kt} (90%) rename app/src/main/java/org/koitharu/kotatsu/{utils/ext/ViewExt.kt => core/util/ext/View.kt} (65%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/ext/ViewModel.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/ImageRequestIndicatorListener.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/IntPercentLabelFormatter.kt (88%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/PausingProgressJob.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/ProgressDeferred.kt (87%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/ProgressJob.kt (85%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/ProgressResponseBody.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/{utils => core/util}/progress/TimeLeftEstimator.kt (96%) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/ext/LayoutManagerExt.kt rename app/src/test/java/org/koitharu/kotatsu/{utils => util}/CompositeMutexTest.kt (92%) diff --git a/app/build.gradle b/app/build.gradle index aa5621fc1..99d288a1d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ android { } lint { abortOnError true - disable 'MissingTranslation', 'PrivateResource', 'NotifyDataSetChanged' + disable 'MissingTranslation', 'PrivateResource', 'NotifyDataSetChanged', 'SetJavaScriptEnabled' } testOptions { unitTests.includeAndroidResources true diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 791a045d4..a81d9ac31 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -8,7 +8,7 @@ public static void checkParameterIsNotNull(...); public static void checkNotNullParameter(...); } --keep public class ** extends org.koitharu.kotatsu.base.ui.BaseFragment +-keep public class ** extends org.koitharu.kotatsu.core.ui.BaseFragment -keep class org.koitharu.kotatsu.core.db.entity.* { *; } -dontwarn okhttp3.internal.platform.** -dontwarn org.conscrypt.** diff --git a/app/src/androidTest/java/org/koitharu/kotatsu/tracker/domain/TrackerTest.kt b/app/src/androidTest/java/org/koitharu/kotatsu/tracker/domain/TrackerTest.kt index 37b5ebf02..5e38b4d15 100644 --- a/app/src/androidTest/java/org/koitharu/kotatsu/tracker/domain/TrackerTest.kt +++ b/app/src/androidTest/java/org/koitharu/kotatsu/tracker/domain/TrackerTest.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.tracker.domain import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import javax.inject.Inject import junit.framework.TestCase.* import kotlinx.coroutines.test.runTest import org.junit.Before @@ -11,8 +10,9 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.koitharu.kotatsu.SampleData -import org.koitharu.kotatsu.base.domain.MangaDataRepository +import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.parsers.model.Manga +import javax.inject.Inject @HiltAndroidTest @RunWith(AndroidJUnit4::class) diff --git a/app/src/debug/java/org/koitharu/kotatsu/utils/LoggingAdapterDataObserver.kt b/app/src/debug/java/org/koitharu/kotatsu/util/LoggingAdapterDataObserver.kt similarity index 97% rename from app/src/debug/java/org/koitharu/kotatsu/utils/LoggingAdapterDataObserver.kt rename to app/src/debug/java/org/koitharu/kotatsu/util/LoggingAdapterDataObserver.kt index e4221be71..07ae3c4bb 100644 --- a/app/src/debug/java/org/koitharu/kotatsu/utils/LoggingAdapterDataObserver.kt +++ b/app/src/debug/java/org/koitharu/kotatsu/util/LoggingAdapterDataObserver.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.util import android.util.Log import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver diff --git a/app/src/debug/java/org/koitharu/kotatsu/util/ext/DebugExt.kt b/app/src/debug/java/org/koitharu/kotatsu/util/ext/DebugExt.kt new file mode 100644 index 000000000..acaab0f0c --- /dev/null +++ b/app/src/debug/java/org/koitharu/kotatsu/util/ext/DebugExt.kt @@ -0,0 +1,3 @@ +package org.koitharu.kotatsu.util.ext + +fun Throwable.printStackTraceDebug() = printStackTrace() diff --git a/app/src/debug/java/org/koitharu/kotatsu/utils/ext/DebugExt.kt b/app/src/debug/java/org/koitharu/kotatsu/utils/ext/DebugExt.kt deleted file mode 100644 index e00bb6a83..000000000 --- a/app/src/debug/java/org/koitharu/kotatsu/utils/ext/DebugExt.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.koitharu.kotatsu.utils.ext - -fun Throwable.printStackTraceDebug() = printStackTrace() \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 95d48afa2..b8a5ac19d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -20,12 +20,12 @@ import org.acra.ktx.initAcra import org.acra.sender.HttpSender import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.WorkServiceStopHelper +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope import org.koitharu.kotatsu.local.data.PagesCache import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.reader.domain.PageLoader -import org.koitharu.kotatsu.utils.WorkServiceStopHelper -import org.koitharu.kotatsu.utils.ext.processLifecycleScope import javax.inject.Inject @HiltAndroidApp diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseService.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseService.kt deleted file mode 100644 index 05e07729e..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseService.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.koitharu.kotatsu.base.ui - -import androidx.lifecycle.LifecycleService - -abstract class BaseService : LifecycleService() \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt index feeac4519..0c439a6bc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt @@ -5,7 +5,6 @@ import androidx.room.withTransaction import dagger.Reusable import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import org.koitharu.kotatsu.base.domain.ReversibleHandle import org.koitharu.kotatsu.bookmarks.data.BookmarkEntity import org.koitharu.kotatsu.bookmarks.data.toBookmark import org.koitharu.kotatsu.bookmarks.data.toBookmarks @@ -14,9 +13,10 @@ import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.toEntities import org.koitharu.kotatsu.core.db.entity.toEntity import org.koitharu.kotatsu.core.db.entity.toManga +import org.koitharu.kotatsu.core.ui.util.ReversibleHandle +import org.koitharu.kotatsu.core.util.ext.mapItems import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.mapItems -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @Reusable diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksActivity.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksActivity.kt index 1bcc16d2e..5f2f952bd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksActivity.kt @@ -3,16 +3,14 @@ package org.koitharu.kotatsu.bookmarks.ui import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.ViewGroup import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.Insets -import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.fragment.app.commit import com.google.android.material.appbar.AppBarLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivityContainerBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.main.ui.owners.SnackbarOwner @@ -24,10 +22,10 @@ class BookmarksActivity : SnackbarOwner { override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override val snackbarHost: CoordinatorLayout - get() = binding.root + get() = viewBinding.root override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -43,7 +41,7 @@ class BookmarksActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksFragment.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksFragment.kt index 06b3dbb36..e76ee3ed0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksFragment.kt @@ -16,19 +16,21 @@ import coil.ImageLoader import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.reverseAsync -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration -import org.koitharu.kotatsu.base.ui.list.fastscroll.FastScroller -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.bookmarks.data.ids import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.adapter.BookmarksGroupAdapter import org.koitharu.kotatsu.bookmarks.ui.model.BookmarksGroup import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.ui.util.reverseAsync +import org.koitharu.kotatsu.core.util.ext.invalidateNestedItemDecorations +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf import org.koitharu.kotatsu.databinding.FragmentListSimpleBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener @@ -37,8 +39,6 @@ import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.main.ui.owners.SnackbarOwner import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.reader.ui.ReaderActivity -import org.koitharu.kotatsu.utils.ext.invalidateNestedItemDecorations -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf import javax.inject.Inject @AndroidEntryPoint @@ -56,12 +56,12 @@ class BookmarksFragment : private var adapter: BookmarksGroupAdapter? = null private var selectionController: SectionedSelectionController? = null - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): FragmentListSimpleBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentListSimpleBinding { return FragmentListSimpleBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentListSimpleBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) selectionController = SectionedSelectionController( activity = requireActivity(), owner = this, @@ -77,7 +77,7 @@ class BookmarksFragment : ) binding.recyclerView.adapter = adapter binding.recyclerView.setHasFixedSize(true) - val spacingDecoration = SpacingItemDecoration(view.resources.getDimensionPixelOffset(R.dimen.grid_spacing)) + val spacingDecoration = SpacingItemDecoration(resources.getDimensionPixelOffset(R.dimen.grid_spacing)) binding.recyclerView.addItemDecoration(spacingDecoration) viewModel.content.observe(viewLifecycleOwner, ::onListChanged) @@ -114,7 +114,7 @@ class BookmarksFragment : override fun onFastScrollStop(fastScroller: FastScroller) = Unit override fun onSelectionChanged(controller: SectionedSelectionController, count: Int) { - binding.recyclerView.invalidateNestedItemDecorations() + requireViewBinding().recyclerView.invalidateNestedItemDecorations() } override fun onCreateActionMode( @@ -149,10 +149,10 @@ class BookmarksFragment : ): AbstractSelectionItemDecoration = BookmarksSelectionDecoration(requireContext()) override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + requireViewBinding().recyclerView.updatePadding( bottom = insets.bottom, ) - binding.recyclerView.fastScroller.updateLayoutParams { + requireViewBinding().recyclerView.fastScroller.updateLayoutParams { bottomMargin = insets.bottom } } diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksSelectionDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksSelectionDecoration.kt index 025acb882..85886eed8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksSelectionDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksSelectionDecoration.kt @@ -4,8 +4,8 @@ import android.content.Context import android.view.View import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.bookmarks.domain.Bookmark +import org.koitharu.kotatsu.core.util.ext.getItem import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration -import org.koitharu.kotatsu.utils.ext.getItem class BookmarksSelectionDecoration(context: Context) : MangaSelectionDecoration(context) { @@ -14,5 +14,4 @@ class BookmarksSelectionDecoration(context: Context) : MangaSelectionDecoration( val item = holder.getItem(Bookmark::class.java) ?: return RecyclerView.NO_ID return item.pageId } - -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksViewModel.kt index ced4e03cc..614691d49 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/BookmarksViewModel.kt @@ -7,17 +7,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.map import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository import org.koitharu.kotatsu.bookmarks.ui.model.BookmarksGroup +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.list.ui.model.toErrorState import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt index 1ffa3bac3..886aba926 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarkListAD.kt @@ -4,16 +4,16 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.bookmarks.domain.Bookmark +import org.koitharu.kotatsu.core.ui.image.CoverSizeResolver +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.decodeRegion +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemBookmarkBinding -import org.koitharu.kotatsu.utils.ext.decodeRegion -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.image.CoverSizeResolver fun bookmarkListAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksAdapter.kt index 2f3022b8e..d47bbb785 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksAdapter.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.bookmarks.domain.Bookmark +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener class BookmarksAdapter( coil: ImageLoader, @@ -13,7 +13,7 @@ class BookmarksAdapter( clickListener: OnListItemClickListener, ) : AsyncListDifferDelegationAdapter( DiffCallback(), - bookmarkListAD(coil, lifecycleOwner, clickListener) + bookmarkListAD(coil, lifecycleOwner, clickListener), ) { private class DiffCallback : DiffUtil.ItemCallback() { @@ -27,4 +27,4 @@ class BookmarksAdapter( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt index a4d33d0eb..df737ff54 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAD.kt @@ -6,20 +6,20 @@ import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.model.BookmarksGroup +import org.koitharu.kotatsu.core.ui.image.CoverSizeResolver +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.util.ext.clearItemDecorations +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemBookmarksGroupBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.clearItemDecorations -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.image.CoverSizeResolver fun bookmarksGroupAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt index a51a00ec2..31ab12fd7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt @@ -5,10 +5,10 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.model.BookmarksGroup +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD import org.koitharu.kotatsu.list.ui.adapter.errorStateListAD diff --git a/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt b/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt index 55f4e193b..f84ca4899 100644 --- a/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt @@ -12,10 +12,10 @@ import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.core.view.updatePadding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.network.CommonHeadersInterceptor +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.catchingWebViewUnavailability import org.koitharu.kotatsu.databinding.ActivityBrowserBinding -import org.koitharu.kotatsu.utils.ext.catchingWebViewUnavailability import com.google.android.material.R as materialR @SuppressLint("SetJavaScriptEnabled") @@ -32,13 +32,13 @@ class BrowserActivity : BaseActivity(), BrowserCallback setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } - with(binding.webView.settings) { + with(viewBinding.webView.settings) { javaScriptEnabled = true userAgentString = CommonHeadersInterceptor.userAgentChrome } - binding.webView.webViewClient = BrowserClient(this) - binding.webView.webChromeClient = ProgressChromeClient(binding.progressBar) - onBackPressedCallback = WebViewBackPressedCallback(binding.webView) + viewBinding.webView.webViewClient = BrowserClient(this) + viewBinding.webView.webChromeClient = ProgressChromeClient(viewBinding.progressBar) + onBackPressedCallback = WebViewBackPressedCallback(viewBinding.webView) onBackPressedDispatcher.addCallback(onBackPressedCallback) if (savedInstanceState != null) { return @@ -51,18 +51,18 @@ class BrowserActivity : BaseActivity(), BrowserCallback intent?.getStringExtra(EXTRA_TITLE) ?: getString(R.string.loading_), url, ) - binding.webView.loadUrl(url) + viewBinding.webView.loadUrl(url) } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - binding.webView.saveState(outState) + viewBinding.webView.saveState(outState) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) - binding.webView.restoreState(savedInstanceState) + viewBinding.webView.restoreState(savedInstanceState) } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -73,14 +73,14 @@ class BrowserActivity : BaseActivity(), BrowserCallback override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { android.R.id.home -> { - binding.webView.stopLoading() + viewBinding.webView.stopLoading() finishAfterTransition() true } R.id.action_browser -> { val intent = Intent(Intent.ACTION_VIEW) - intent.data = Uri.parse(binding.webView.url) + intent.data = Uri.parse(viewBinding.webView.url) try { startActivity(Intent.createChooser(intent, item.title)) } catch (_: ActivityNotFoundException) { @@ -92,22 +92,22 @@ class BrowserActivity : BaseActivity(), BrowserCallback } override fun onPause() { - binding.webView.onPause() + viewBinding.webView.onPause() super.onPause() } override fun onResume() { super.onResume() - binding.webView.onResume() + viewBinding.webView.onResume() } override fun onDestroy() { super.onDestroy() - binding.webView.destroy() + viewBinding.webView.destroy() } override fun onLoadingStateChanged(isLoading: Boolean) { - binding.progressBar.isVisible = isLoading + viewBinding.progressBar.isVisible = isLoading } override fun onTitleChanged(title: CharSequence, subtitle: CharSequence?) { @@ -120,10 +120,10 @@ class BrowserActivity : BaseActivity(), BrowserCallback } override fun onWindowInsetsChanged(insets: Insets) { - binding.appbar.updatePadding( + viewBinding.appbar.updatePadding( top = insets.top, ) - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, bottom = insets.bottom, diff --git a/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt b/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt index 34f02003c..0a1284448 100644 --- a/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt @@ -1,10 +1,8 @@ package org.koitharu.kotatsu.browser.cloudflare -import android.annotation.SuppressLint import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.webkit.CookieManager import android.webkit.WebSettings @@ -14,13 +12,13 @@ import androidx.fragment.app.setFragmentResult import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import okhttp3.Headers -import org.koitharu.kotatsu.base.ui.AlertDialogFragment import org.koitharu.kotatsu.browser.WebViewBackPressedCallback import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.network.CommonHeadersInterceptor import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar +import org.koitharu.kotatsu.core.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.FragmentCloudflareBinding -import org.koitharu.kotatsu.utils.ext.withArgs import javax.inject.Inject @AndroidEntryPoint @@ -39,14 +37,13 @@ class CloudFlareDialog : AlertDialogFragment(), Cloud url = requireArguments().getString(ARG_URL).orEmpty() } - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentCloudflareBinding.inflate(inflater, container, false) - @SuppressLint("SetJavaScriptEnabled") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentCloudflareBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) with(binding.webView.settings) { javaScriptEnabled = true cacheMode = WebSettings.LOAD_DEFAULT @@ -64,8 +61,8 @@ class CloudFlareDialog : AlertDialogFragment(), Cloud } override fun onDestroyView() { - binding.webView.stopLoading() - binding.webView.destroy() + requireViewBinding().webView.stopLoading() + requireViewBinding().webView.destroy() onBackPressedCallback = null super.onDestroyView() } @@ -76,18 +73,18 @@ class CloudFlareDialog : AlertDialogFragment(), Cloud override fun onDialogCreated(dialog: AlertDialog) { super.onDialogCreated(dialog) - onBackPressedCallback = WebViewBackPressedCallback(binding.webView).also { + onBackPressedCallback = WebViewBackPressedCallback(requireViewBinding().webView).also { dialog.onBackPressedDispatcher.addCallback(it) } } override fun onResume() { super.onResume() - binding.webView.onResume() + requireViewBinding().webView.onResume() } override fun onPause() { - binding.webView.onPause() + requireViewBinding().webView.onPause() super.onPause() } @@ -97,7 +94,7 @@ class CloudFlareDialog : AlertDialogFragment(), Cloud } override fun onPageLoaded() { - bindingOrNull()?.progressBar?.isInvisible = true + viewBinding?.progressBar?.isInvisible = true } override fun onCheckPassed() { diff --git a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt index 1797b4213..6e53e3736 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt @@ -26,7 +26,6 @@ import kotlinx.coroutines.flow.asSharedFlow import okhttp3.CookieJar import okhttp3.OkHttpClient import org.koitharu.kotatsu.BuildConfig -import org.koitharu.kotatsu.base.ui.util.ActivityRecreationHandle import org.koitharu.kotatsu.core.cache.ContentCache import org.koitharu.kotatsu.core.cache.MemoryContentCache import org.koitharu.kotatsu.core.cache.StubContentCache @@ -41,6 +40,12 @@ import org.koitharu.kotatsu.core.parser.MangaLoaderContextImpl import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.favicon.FaviconFetcher import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.image.CoilImageGetter +import org.koitharu.kotatsu.core.ui.util.ActivityRecreationHandle +import org.koitharu.kotatsu.core.util.IncognitoModeIndicator +import org.koitharu.kotatsu.core.util.ext.activityManager +import org.koitharu.kotatsu.core.util.ext.connectivityManager +import org.koitharu.kotatsu.core.util.ext.isLowRamDevice import org.koitharu.kotatsu.local.data.CacheDir import org.koitharu.kotatsu.local.data.CbzFetcher import org.koitharu.kotatsu.local.data.LocalManga @@ -53,11 +58,6 @@ import org.koitharu.kotatsu.reader.ui.thumbnails.MangaPageFetcher import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider import org.koitharu.kotatsu.settings.backup.BackupObserver import org.koitharu.kotatsu.sync.domain.SyncController -import org.koitharu.kotatsu.utils.IncognitoModeIndicator -import org.koitharu.kotatsu.utils.ext.activityManager -import org.koitharu.kotatsu.utils.ext.connectivityManager -import org.koitharu.kotatsu.utils.ext.isLowRamDevice -import org.koitharu.kotatsu.utils.image.CoilImageGetter import org.koitharu.kotatsu.widget.WidgetUpdater import java.util.concurrent.TimeUnit import javax.inject.Singleton @@ -159,7 +159,7 @@ interface AppModule { .transformationDispatcher(Dispatchers.Default) .diskCache(diskCacheFactory) .logger(if (BuildConfig.DEBUG) DebugLogger() else null) - .allowRgb565(isLowRamDevice(context)) + .allowRgb565(context.isLowRamDevice()) .components( ComponentRegistry.Builder() .add(SvgDecoder.Factory()) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupRepository.kt index 9d80b7af4..f02602cef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupRepository.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.parsers.util.json.JSONIterator import org.koitharu.kotatsu.parsers.util.json.mapJSON -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import javax.inject.Inject private const val PAGE_SIZE = 10 diff --git a/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt b/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt index 8a6217d04..c06f45a76 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt @@ -5,10 +5,11 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible import okio.Closeable import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.format import org.koitharu.kotatsu.core.zip.ZipOutput -import org.koitharu.kotatsu.utils.ext.format import java.io.File -import java.util.* +import java.util.Date +import java.util.Locale import java.util.zip.Deflater class BackupZipOutput(val file: File) : Closeable { @@ -42,4 +43,4 @@ suspend fun BackupZipOutput(context: Context): BackupZipOutput = runInterruptibl append(".bk.zip") } BackupZipOutput(File(dir, filename)) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt index d390e80dd..5378e420e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt @@ -33,6 +33,7 @@ import org.koitharu.kotatsu.core.db.migrations.Migration6To7 import org.koitharu.kotatsu.core.db.migrations.Migration7To8 import org.koitharu.kotatsu.core.db.migrations.Migration8To9 import org.koitharu.kotatsu.core.db.migrations.Migration9To10 +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope import org.koitharu.kotatsu.favourites.data.FavouriteCategoriesDao import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity import org.koitharu.kotatsu.favourites.data.FavouriteEntity @@ -46,7 +47,6 @@ import org.koitharu.kotatsu.suggestions.data.SuggestionEntity import org.koitharu.kotatsu.tracker.data.TrackEntity import org.koitharu.kotatsu.tracker.data.TrackLogEntity import org.koitharu.kotatsu.tracker.data.TracksDao -import org.koitharu.kotatsu.utils.ext.processLifecycleScope const val DATABASE_VERSION = 15 diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/EntityMapping.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/EntityMapping.kt index 7bba6f4df..80bcb6045 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/EntityMapping.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/EntityMapping.kt @@ -1,13 +1,13 @@ package org.koitharu.kotatsu.core.db.entity import org.koitharu.kotatsu.core.model.MangaSource +import org.koitharu.kotatsu.core.util.ext.longHashCode import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaState import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.toTitleCase -import org.koitharu.kotatsu.utils.ext.longHashCode // Entity to model diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/DialogErrorObserver.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/DialogErrorObserver.kt index c3bc2f893..68949cc36 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/DialogErrorObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/DialogErrorObserver.kt @@ -6,9 +6,9 @@ import androidx.core.util.Consumer import androidx.fragment.app.Fragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.ui.ErrorDetailsDialog +import org.koitharu.kotatsu.core.ui.dialog.ErrorDetailsDialog +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import org.koitharu.kotatsu.parsers.exception.ParseException -import org.koitharu.kotatsu.utils.ext.getDisplayMessage class DialogErrorObserver( host: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ErrorObserver.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ErrorObserver.kt index e41b65955..3af75685e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ErrorObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ErrorObserver.kt @@ -11,8 +11,8 @@ import androidx.lifecycle.Observer import androidx.lifecycle.coroutineScope import kotlinx.coroutines.isActive import kotlinx.coroutines.launch -import org.koitharu.kotatsu.utils.ext.findActivity -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope +import org.koitharu.kotatsu.core.util.ext.findActivity +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope abstract class ErrorObserver( protected val host: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt index 75d466bbb..b5e267dcb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt @@ -12,13 +12,13 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.browser.BrowserActivity import org.koitharu.kotatsu.browser.cloudflare.CloudFlareDialog import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException -import org.koitharu.kotatsu.core.ui.ErrorDetailsDialog +import org.koitharu.kotatsu.core.ui.dialog.ErrorDetailsDialog +import org.koitharu.kotatsu.core.util.TaggedActivityResult +import org.koitharu.kotatsu.core.util.isSuccess import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.settings.sources.auth.SourceAuthActivity -import org.koitharu.kotatsu.utils.TaggedActivityResult -import org.koitharu.kotatsu.utils.isSuccess import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt index fb3cea7d9..9a1ef14d5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/SnackbarErrorObserver.kt @@ -5,10 +5,10 @@ import androidx.core.util.Consumer import androidx.fragment.app.Fragment import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.ui.ErrorDetailsDialog +import org.koitharu.kotatsu.core.ui.dialog.ErrorDetailsDialog +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner import org.koitharu.kotatsu.parsers.exception.ParseException -import org.koitharu.kotatsu.utils.ext.getDisplayMessage class SnackbarErrorObserver( host: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt index 70598cb0a..53a53d273 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt @@ -14,13 +14,13 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.asArrayList import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.parsers.util.byte2HexFormatted import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull import org.koitharu.kotatsu.parsers.util.parseJsonArray -import org.koitharu.kotatsu.utils.ext.asArrayList -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.ByteArrayInputStream import java.io.InputStream import java.security.MessageDigest diff --git a/app/src/main/java/org/koitharu/kotatsu/core/logs/FileLogger.kt b/app/src/main/java/org/koitharu/kotatsu/core/logs/FileLogger.kt index 8c46d4c01..d63c2e3bb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/logs/FileLogger.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/logs/FileLogger.kt @@ -14,10 +14,10 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.processLifecycleScope -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.subdir +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope +import org.koitharu.kotatsu.core.util.ext.subdir +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import java.io.FileOutputStream import java.text.SimpleDateFormat diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt index 47ac983f3..4ed4c7885 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/Manga.kt @@ -1,11 +1,11 @@ package org.koitharu.kotatsu.core.model import androidx.core.os.LocaleListCompat +import org.koitharu.kotatsu.core.util.ext.iterator import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.mapToSet -import org.koitharu.kotatsu.utils.ext.iterator fun Collection.ids() = mapToSet { it.id } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt index 7ed9f638f..e774ce82e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt @@ -2,12 +2,12 @@ package org.koitharu.kotatsu.core.model.parcelable import android.os.Parcel import androidx.core.os.ParcelCompat +import org.koitharu.kotatsu.core.util.ext.readParcelableCompat +import org.koitharu.kotatsu.core.util.ext.readSerializableCompat import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.ext.readParcelableCompat -import org.koitharu.kotatsu.utils.ext.readSerializableCompat fun Manga.writeToParcel(out: Parcel, flags: Int, withChapters: Boolean) { out.writeLong(id) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt index bd5490e0a..7f6cf2f42 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt @@ -2,15 +2,15 @@ package org.koitharu.kotatsu.core.model.parcelable import android.os.Parcel import android.os.Parcelable +import org.koitharu.kotatsu.core.util.ext.Set import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.ext.Set class ParcelableMangaTags( val tags: Set, ) : Parcelable { constructor(parcel: Parcel) : this( - Set(parcel.readInt()) { parcel.readMangaTag() } + Set(parcel.readInt()) { parcel.readMangaTag() }, ) override fun writeToParcel(parcel: Parcel, flags: Int) { @@ -33,4 +33,4 @@ class ParcelableMangaTags( return arrayOfNulls(size) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeadersInterceptor.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeadersInterceptor.kt index 8a19866cd..ce873fbc6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeadersInterceptor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/CommonHeadersInterceptor.kt @@ -12,7 +12,7 @@ import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.mergeWith -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.net.IDN import java.util.Locale import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/DoHManager.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/DoHManager.kt index f32717aad..9547b4da5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/DoHManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/DoHManager.kt @@ -6,7 +6,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import okhttp3.dnsoverhttps.DnsOverHttps import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.net.InetAddress import java.net.UnknownHostException @@ -52,8 +52,9 @@ class DoHManager( tryGetByIp("8.8.8.8"), tryGetByIp("2001:4860:4860::8888"), tryGetByIp("2001:4860:4860::8844"), - ) + ), ).build() + DoHProvider.CLOUDFLARE -> DnsOverHttps.Builder().client(bootstrapClient) .url("https://cloudflare-dns.com/dns-query".toHttpUrl()) .resolvePrivateAddresses(true) @@ -68,8 +69,9 @@ class DoHManager( tryGetByIp("2606:4700:4700::1001"), tryGetByIp("2606:4700:4700::0064"), tryGetByIp("2606:4700:4700::6400"), - ) + ), ).build() + DoHProvider.ADGUARD -> DnsOverHttps.Builder().client(bootstrapClient) .url("https://dns-unfiltered.adguard.com/dns-query".toHttpUrl()) .resolvePrivateAddresses(true) @@ -79,7 +81,7 @@ class DoHManager( tryGetByIp("94.140.14.141"), tryGetByIp("2a10:50c0::1:ff"), tryGetByIp("2a10:50c0::2:ff"), - ) + ), ).build() } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt index ed1221613..a7dc8a04a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.core.network import android.annotation.SuppressLint import okhttp3.OkHttpClient -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.security.SecureRandom import java.security.cert.X509Certificate import javax.net.ssl.SSLContext diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PreferencesCookieJar.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PreferencesCookieJar.kt index cce51f827..4a709f38b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PreferencesCookieJar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PreferencesCookieJar.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import okhttp3.Cookie import okhttp3.HttpUrl -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug private const val PREFS_NAME = "cookies" diff --git a/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt b/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt index 0c3899bf6..63907bdde 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt @@ -6,8 +6,8 @@ import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import kotlinx.coroutines.flow.first -import org.koitharu.kotatsu.utils.MediatorStateFlow -import org.koitharu.kotatsu.utils.ext.isOnline +import org.koitharu.kotatsu.core.util.MediatorStateFlow +import org.koitharu.kotatsu.core.util.ext.isOnline class NetworkState( private val connectivityManager: ConnectivityManager, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsUpdater.kt b/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsUpdater.kt index 1de7b7c35..43c904696 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsUpdater.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsUpdater.kt @@ -22,16 +22,16 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.core.db.TABLE_HISTORY +import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.getDrawableOrThrow +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.reader.ui.ReaderActivity -import org.koitharu.kotatsu.utils.ext.getDrawableOrThrow -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.processLifecycleScope -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/VoiceInputContract.kt b/app/src/main/java/org/koitharu/kotatsu/core/os/VoiceInputContract.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/VoiceInputContract.kt rename to app/src/main/java/org/koitharu/kotatsu/core/os/VoiceInputContract.kt index ddb42ab45..15a6de48d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/VoiceInputContract.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/os/VoiceInputContract.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.os import android.app.Activity import android.content.Context diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaDataRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/domain/MangaDataRepository.kt rename to app/src/main/java/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt index 263253786..32862bf59 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaDataRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.domain +package org.koitharu.kotatsu.core.parser import android.graphics.BitmapFactory import android.net.Uri @@ -19,7 +19,6 @@ import org.koitharu.kotatsu.core.db.entity.toEntity import org.koitharu.kotatsu.core.db.entity.toManga import org.koitharu.kotatsu.core.db.entity.toMangaTags import org.koitharu.kotatsu.core.network.CommonHeaders -import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.ReaderMode import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaPage @@ -33,8 +32,6 @@ import java.util.zip.ZipFile import javax.inject.Inject import kotlin.math.roundToInt -private const val MIN_WEBTOON_RATIO = 2 - @Reusable class MangaDataRepository @Inject constructor( private val okHttpClient: OkHttpClient, @@ -148,6 +145,8 @@ class MangaDataRepository @Inject constructor( companion object { + private const val MIN_WEBTOON_RATIO = 2 + suspend fun getImageMimeType(file: File): String? = runInterruptible(Dispatchers.IO) { val options = BitmapFactory.Options().apply { inJustDecodeBounds = true diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaIntent.kt similarity index 83% rename from app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt rename to app/src/main/java/org/koitharu/kotatsu/core/parser/MangaIntent.kt index 55c34cb90..5c3d54a17 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaIntent.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaIntent.kt @@ -1,14 +1,14 @@ -package org.koitharu.kotatsu.base.domain +package org.koitharu.kotatsu.core.parser import android.content.Intent import android.net.Uri import android.os.Bundle import androidx.lifecycle.SavedStateHandle -import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.getParcelableCompat +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.getParcelableCompat -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat class MangaIntent private constructor( @JvmField val manga: Manga?, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt index 17f97c398..b8e864cba 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaLoaderContextImpl.kt @@ -11,10 +11,10 @@ import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar import org.koitharu.kotatsu.core.prefs.SourceSettings +import org.koitharu.kotatsu.core.util.ext.toList import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.toList import java.lang.ref.WeakReference import java.util.* import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt index a99cd9acc..0f3d6d482 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt @@ -14,6 +14,7 @@ import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.cache.ContentCache import org.koitharu.kotatsu.core.cache.SafeDeferred import org.koitharu.kotatsu.core.prefs.SourceSettings +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.config.ConfigKey @@ -25,8 +26,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.util.domain -import org.koitharu.kotatsu.utils.ext.processLifecycleScope -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable class RemoteMangaRepository( private val parser: MangaParser, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 6dab7e362..669b7ea41 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -14,16 +14,16 @@ import dagger.hilt.android.qualifiers.ApplicationContext import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.core.network.DoHProvider +import org.koitharu.kotatsu.core.util.ext.connectivityManager +import org.koitharu.kotatsu.core.util.ext.filterToSet +import org.koitharu.kotatsu.core.util.ext.getEnumValue +import org.koitharu.kotatsu.core.util.ext.observe +import org.koitharu.kotatsu.core.util.ext.putEnumValue +import org.koitharu.kotatsu.core.util.ext.toUriOrNull import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.shelf.domain.ShelfSection -import org.koitharu.kotatsu.utils.ext.connectivityManager -import org.koitharu.kotatsu.utils.ext.filterToSet -import org.koitharu.kotatsu.utils.ext.getEnumValue -import org.koitharu.kotatsu.utils.ext.observe -import org.koitharu.kotatsu.utils.ext.putEnumValue -import org.koitharu.kotatsu.utils.ext.toUriOrNull import java.io.File import java.util.Collections import java.util.EnumSet diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt index 1b3af7980..0080c0b1d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt @@ -2,13 +2,13 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context import androidx.core.content.edit +import org.koitharu.kotatsu.core.util.ext.getEnumValue +import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty +import org.koitharu.kotatsu.core.util.ext.putEnumValue import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.utils.ext.getEnumValue -import org.koitharu.kotatsu.utils.ext.ifNullOrEmpty -import org.koitharu.kotatsu.utils.ext.putEnumValue private const val KEY_SORT_ORDER = "sort_order" diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/AlertDialogFragment.kt similarity index 54% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/AlertDialogFragment.kt index a667fec32..40c091d4d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/AlertDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/AlertDialogFragment.kt @@ -1,8 +1,9 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper import androidx.appcompat.app.AlertDialog @@ -12,13 +13,15 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder abstract class AlertDialogFragment : DialogFragment() { - private var viewBinding: B? = null + var viewBinding: B? = null + private set + @Deprecated("", ReplaceWith("requireViewBinding()")) protected val binding: B - get() = checkNotNull(viewBinding) + get() = requireViewBinding() final override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val binding = onInflateView(layoutInflater, null) + val binding = onCreateViewBinding(layoutInflater, null) viewBinding = binding return MaterialAlertDialogBuilder(requireContext(), theme) .setView(binding.root) @@ -32,6 +35,11 @@ abstract class AlertDialogFragment : DialogFragment() { savedInstanceState: Bundle?, ) = viewBinding?.root + final override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + onViewBindingCreated(requireViewBinding(), savedInstanceState) + } + @CallSuper override fun onDestroyView() { viewBinding = null @@ -42,7 +50,14 @@ abstract class AlertDialogFragment : DialogFragment() { open fun onDialogCreated(dialog: AlertDialog) = Unit - protected fun bindingOrNull(): B? = viewBinding + @Deprecated("", ReplaceWith("viewBinding")) + protected fun bindingOrNull() = viewBinding - protected abstract fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): B + fun requireViewBinding(): B = checkNotNull(viewBinding) { + "Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()." + } + + protected abstract fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): B + + protected open fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) = Unit } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseActivity.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/BaseActivity.kt index c9474a173..f547e527a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseActivity.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.content.Intent import android.content.res.Configuration @@ -25,11 +25,11 @@ import androidx.viewbinding.ViewBinding import dagger.hilt.android.EntryPointAccessors import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.util.ActionModeDelegate -import org.koitharu.kotatsu.base.ui.util.BaseActivityEntryPoint -import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver -import org.koitharu.kotatsu.utils.ext.getThemeColor +import org.koitharu.kotatsu.core.ui.util.ActionModeDelegate +import org.koitharu.kotatsu.core.ui.util.BaseActivityEntryPoint +import org.koitharu.kotatsu.core.ui.util.WindowInsetsDelegate +import org.koitharu.kotatsu.core.util.ext.getThemeColor @Suppress("LeakingThis") abstract class BaseActivity : @@ -38,7 +38,7 @@ abstract class BaseActivity : private var isAmoledTheme = false - protected lateinit var binding: B + lateinit var viewBinding: B private set @JvmField @@ -88,7 +88,7 @@ abstract class BaseActivity : } protected fun setContentView(binding: B) { - this.binding = binding + this.viewBinding = binding super.setContentView(binding.root) val toolbar = (binding.root.findViewById(R.id.toolbar) as? Toolbar) toolbar?.let(this::setSupportActionBar) @@ -131,7 +131,7 @@ abstract class BaseActivity : } else { ContextCompat.getColor(this, R.color.kotatsu_secondaryContainer) } - val insets = ViewCompat.getRootWindowInsets(binding.root) + val insets = ViewCompat.getRootWindowInsets(viewBinding.root) ?.getInsets(WindowInsetsCompat.Type.systemBars()) ?: return findViewById(androidx.appcompat.R.id.action_mode_bar).apply { setBackgroundColor(actionModeColor) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseBottomSheet.kt similarity index 73% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/BaseBottomSheet.kt index 6207ce83f..9c81104a1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseBottomSheet.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.app.Dialog import android.os.Bundle @@ -13,17 +13,19 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.dialog.AppBottomSheetDialog -import org.koitharu.kotatsu.utils.ext.findActivity -import org.koitharu.kotatsu.utils.ext.getDisplaySize +import org.koitharu.kotatsu.core.ui.dialog.AppBottomSheetDialog +import org.koitharu.kotatsu.core.util.ext.findActivity +import org.koitharu.kotatsu.core.util.ext.getDisplaySize import com.google.android.material.R as materialR abstract class BaseBottomSheet : BottomSheetDialogFragment() { - private var viewBinding: B? = null + var viewBinding: B? = null + private set + @Deprecated("", ReplaceWith("requireViewBinding()")) protected val binding: B - get() = checkNotNull(viewBinding) + get() = requireViewBinding() protected val behavior: BottomSheetBehavior<*>? get() = (dialog as? BottomSheetDialog)?.behavior @@ -39,13 +41,14 @@ abstract class BaseBottomSheet : BottomSheetDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle?, ): View { - val binding = onInflateView(inflater, container) + val binding = onCreateViewBinding(inflater, container) viewBinding = binding return binding.root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + final override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val binding = requireViewBinding() // Enforce max width for tablets val width = resources.getDimensionPixelSize(R.dimen.bottom_sheet_width) if (width > 0) { @@ -55,6 +58,7 @@ abstract class BaseBottomSheet : BottomSheetDialogFragment() { binding.root.context.findActivity()?.getDisplaySize()?.let { behavior?.peekHeight = (it.height() * 0.4).toInt() } + onViewBindingCreated(binding, savedInstanceState) } override fun onDestroyView() { @@ -75,7 +79,9 @@ abstract class BaseBottomSheet : BottomSheetDialogFragment() { } } - protected abstract fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): B + protected abstract fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): B + + protected open fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) = Unit protected fun setExpanded(isExpanded: Boolean, isLocked: Boolean) { val b = behavior ?: return @@ -89,4 +95,8 @@ abstract class BaseBottomSheet : BottomSheetDialogFragment() { } b.isDraggable = !isLocked } + + fun requireViewBinding(): B = checkNotNull(viewBinding) { + "Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()." + } } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseFragment.kt similarity index 53% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/BaseFragment.kt index 697016c9a..6dfdadf1d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseFragment.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.os.Bundle import android.view.LayoutInflater @@ -6,19 +6,21 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding -import org.koitharu.kotatsu.base.ui.util.ActionModeDelegate -import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver +import org.koitharu.kotatsu.core.ui.util.ActionModeDelegate +import org.koitharu.kotatsu.core.ui.util.WindowInsetsDelegate @Suppress("LeakingThis") abstract class BaseFragment : Fragment(), WindowInsetsDelegate.WindowInsetsListener { - private var viewBinding: B? = null + var viewBinding: B? = null + private set + @Deprecated("", ReplaceWith("requireViewBinding()")) protected val binding: B - get() = checkNotNull(viewBinding) + get() = requireViewBinding() @JvmField protected val exceptionResolver = ExceptionResolver(this) @@ -29,19 +31,20 @@ abstract class BaseFragment : protected val actionModeDelegate: ActionModeDelegate get() = (requireActivity() as BaseActivity<*>).actionModeDelegate - override fun onCreateView( + final override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - val binding = onInflateView(inflater, container) + ): View { + val binding = onCreateViewBinding(inflater, container) viewBinding = binding return binding.root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + final override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) insetsDelegate.onViewCreated(view) + onViewBindingCreated(requireViewBinding(), savedInstanceState) } override fun onDestroyView() { @@ -50,7 +53,14 @@ abstract class BaseFragment : super.onDestroyView() } + fun requireViewBinding(): B = checkNotNull(viewBinding) { + "Fragment $this did not return a ViewBinding from onCreateView() or this was called before onCreateView()." + } + + @Deprecated("", ReplaceWith("viewBinding")) protected fun bindingOrNull() = viewBinding - protected abstract fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): B + protected abstract fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): B + + protected open fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) = Unit } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFullscreenActivity.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFullscreenActivity.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt index e43ca8877..96a240e55 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFullscreenActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.graphics.Color import android.os.Build @@ -56,4 +56,4 @@ abstract class BaseFullscreenActivity : } protected open fun onSystemUiVisibilityChanged(isVisible: Boolean) = Unit -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt similarity index 88% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt index 809944e8c..bfffb7ab3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.os.Bundle import android.view.View @@ -9,9 +9,9 @@ import androidx.core.view.updatePadding import androidx.preference.PreferenceFragmentCompat import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint -import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner -import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.settings.SettingsHeadersFragment import javax.inject.Inject @@ -56,6 +56,7 @@ abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : ) } + @Suppress("UsePropertyAccessSyntax") protected fun setTitle(title: CharSequence) { (parentFragment as? SettingsHeadersFragment)?.setTitle(title) ?: activity?.setTitle(title) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseService.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseService.kt new file mode 100644 index 000000000..7a8f1463c --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseService.kt @@ -0,0 +1,5 @@ +package org.koitharu.kotatsu.core.ui + +import androidx.lifecycle.LifecycleService + +abstract class BaseService : LifecycleService() diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseViewModel.kt similarity index 87% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/BaseViewModel.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/BaseViewModel.kt index ac5f78b09..12cda4167 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/BaseViewModel.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel @@ -9,9 +9,9 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import org.koitharu.kotatsu.base.ui.util.CountedBooleanLiveData -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.core.ui.util.CountedBooleanLiveData +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/CoroutineIntentService.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/CoroutineIntentService.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt index 1fd56bd94..dc1c59bd4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/CoroutineIntentService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.content.Intent import androidx.lifecycle.lifecycleScope @@ -9,7 +9,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug abstract class CoroutineIntentService : BaseService() { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/DefaultActivityLifecycleCallbacks.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/DefaultActivityLifecycleCallbacks.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/DefaultActivityLifecycleCallbacks.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/DefaultActivityLifecycleCallbacks.kt index dd83e4dc7..f97db54ae 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/DefaultActivityLifecycleCallbacks.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/DefaultActivityLifecycleCallbacks.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui +package org.koitharu.kotatsu.core.ui import android.app.Activity import android.app.Application.ActivityLifecycleCallbacks diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/AppBottomSheetDialog.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/AppBottomSheetDialog.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/AppBottomSheetDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/AppBottomSheetDialog.kt index 8b6da8d3d..f76e27d11 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/AppBottomSheetDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/AppBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.dialog +package org.koitharu.kotatsu.core.ui.dialog import android.content.Context import android.graphics.Color @@ -26,4 +26,4 @@ class AppBottomSheetDialog(context: Context, theme: Int) : BottomSheetDialog(con } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/CheckBoxAlertDialog.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/CheckBoxAlertDialog.kt index c452bd1ce..f246aba42 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/CheckBoxAlertDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.dialog +package org.koitharu.kotatsu.core.ui.dialog import android.content.Context import android.content.DialogInterface @@ -77,4 +77,4 @@ class CheckBoxAlertDialog private constructor(private val delegate: AlertDialog) fun create() = CheckBoxAlertDialog(delegate.create()) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/ErrorDetailsDialog.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/ErrorDetailsDialog.kt similarity index 80% rename from app/src/main/java/org/koitharu/kotatsu/core/ui/ErrorDetailsDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/ErrorDetailsDialog.kt index a9bb5eb8a..6f9d0f12c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/ErrorDetailsDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/ErrorDetailsDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.ui +package org.koitharu.kotatsu.core.ui.dialog import android.content.ClipData import android.content.ClipboardManager @@ -6,7 +6,6 @@ import android.content.Context import android.os.Bundle import android.text.method.LinkMovementMethod import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.core.text.HtmlCompat import androidx.core.text.htmlEncode @@ -14,12 +13,12 @@ import androidx.core.text.parseAsHtml import androidx.fragment.app.FragmentManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.util.ext.isReportable +import org.koitharu.kotatsu.core.util.ext.report +import org.koitharu.kotatsu.core.util.ext.requireSerializable +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.DialogErrorDetailsBinding -import org.koitharu.kotatsu.utils.ext.isReportable -import org.koitharu.kotatsu.utils.ext.report -import org.koitharu.kotatsu.utils.ext.requireSerializable -import org.koitharu.kotatsu.utils.ext.withArgs class ErrorDetailsDialog : AlertDialogFragment() { @@ -31,12 +30,12 @@ class ErrorDetailsDialog : AlertDialogFragment() { exception = args.requireSerializable(ARG_ERROR) } - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): DialogErrorDetailsBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): DialogErrorDetailsBinding { return DialogErrorDetailsBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogErrorDetailsBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) with(binding.textViewMessage) { movementMethod = LinkMovementMethod.getInstance() text = context.getString( diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/RecyclerViewAlertDialog.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/RecyclerViewAlertDialog.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/RecyclerViewAlertDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/RecyclerViewAlertDialog.kt index a2e28fd17..3199138e4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/RecyclerViewAlertDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/RecyclerViewAlertDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.dialog +package org.koitharu.kotatsu.core.ui.dialog import android.content.Context import android.content.DialogInterface diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/RememberSelectionDialogListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/RememberSelectionDialogListener.kt similarity index 85% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/RememberSelectionDialogListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/RememberSelectionDialogListener.kt index 7783a564b..e98e5d992 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/RememberSelectionDialogListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/RememberSelectionDialogListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.dialog +package org.koitharu.kotatsu.core.ui.dialog import android.content.DialogInterface @@ -10,4 +10,4 @@ class RememberSelectionDialogListener(initialValue: Int) : DialogInterface.OnCli override fun onClick(dialog: DialogInterface?, which: Int) { selection = which } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/StorageSelectDialog.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/StorageSelectDialog.kt index 58e353ca8..efc47ffde 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/StorageSelectDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.dialog +package org.koitharu.kotatsu.core.ui.dialog import android.content.Context import android.content.DialogInterface @@ -98,4 +98,4 @@ class StorageSelectDialog private constructor(private val delegate: AlertDialog) fun onStorageSelected(file: File) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TwoButtonsAlertDialog.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/TwoButtonsAlertDialog.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TwoButtonsAlertDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/TwoButtonsAlertDialog.kt index 12bc0d955..4d15077e1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TwoButtonsAlertDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/dialog/TwoButtonsAlertDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.dialog +package org.koitharu.kotatsu.core.ui.dialog import android.content.Context import android.content.DialogInterface diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/image/CoilImageGetter.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/CoilImageGetter.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/utils/image/CoilImageGetter.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/image/CoilImageGetter.kt index 381d71d9f..7c5a5467f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/image/CoilImageGetter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/CoilImageGetter.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.image +package org.koitharu.kotatsu.core.ui.image import android.content.Context import android.graphics.drawable.Drawable diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/image/CoverSizeResolver.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/CoverSizeResolver.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/utils/image/CoverSizeResolver.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/image/CoverSizeResolver.kt index 69f61133f..43d662759 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/image/CoverSizeResolver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/CoverSizeResolver.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.image +package org.koitharu.kotatsu.core.ui.image import android.view.View import android.view.View.OnLayoutChangeListener @@ -7,10 +7,10 @@ import android.widget.ImageView import coil.size.Dimension import coil.size.Size import coil.size.SizeResolver -import kotlin.coroutines.resume -import kotlin.math.roundToInt import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.suspendCancellableCoroutine +import kotlin.coroutines.resume +import kotlin.math.roundToInt private const val ASPECT_RATIO_HEIGHT = 18f private const val ASPECT_RATIO_WIDTH = 13f @@ -80,4 +80,4 @@ class CoverSizeResolver( continuation.resume(size) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/image/FaviconFallbackDrawable.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/FaviconFallbackDrawable.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/utils/image/FaviconFallbackDrawable.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/image/FaviconFallbackDrawable.kt index f6fdaa7df..ab065e004 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/image/FaviconFallbackDrawable.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/FaviconFallbackDrawable.kt @@ -1,7 +1,12 @@ -package org.koitharu.kotatsu.utils.image +package org.koitharu.kotatsu.core.ui.image import android.content.Context -import android.graphics.* +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.ColorFilter +import android.graphics.Paint +import android.graphics.PixelFormat +import android.graphics.Rect import android.graphics.drawable.Drawable import androidx.core.graphics.ColorUtils import com.google.android.material.color.MaterialColors diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/image/RegionBitmapDecoder.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/RegionBitmapDecoder.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/image/RegionBitmapDecoder.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/image/RegionBitmapDecoder.kt index 9736f6776..47d5461cb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/image/RegionBitmapDecoder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/RegionBitmapDecoder.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.image +package org.koitharu.kotatsu.core.ui.image import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -13,7 +13,11 @@ import coil.decode.Decoder import coil.decode.ImageSource import coil.fetch.SourceResult import coil.request.Options -import coil.size.* +import coil.size.Dimension +import coil.size.Scale +import coil.size.Size +import coil.size.isOriginal +import coil.size.pxOrElse import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/TrimTransformation.kt similarity index 91% rename from app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/image/TrimTransformation.kt index b44281f38..bc22724ed 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/image/TrimTransformation.kt @@ -1,8 +1,12 @@ -package org.koitharu.kotatsu.utils.image +package org.koitharu.kotatsu.core.ui.image import android.graphics.Bitmap import androidx.annotation.ColorInt -import androidx.core.graphics.* +import androidx.core.graphics.alpha +import androidx.core.graphics.blue +import androidx.core.graphics.get +import androidx.core.graphics.green +import androidx.core.graphics.red import coil.size.Size import coil.transform.Transformation import kotlin.math.abs @@ -104,4 +108,4 @@ class TrimTransformation( abs(a.blue - b.blue) <= tolerance && abs(a.alpha - b.alpha) <= tolerance } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/AdapterDelegateClickListenerAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/AdapterDelegateClickListenerAdapter.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/AdapterDelegateClickListenerAdapter.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/AdapterDelegateClickListenerAdapter.kt index 19d1d5661..a9e6e13ea 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/AdapterDelegateClickListenerAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/AdapterDelegateClickListenerAdapter.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.view.View import android.view.View.OnClickListener diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/BoundsScrollListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/BoundsScrollListener.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/BoundsScrollListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/BoundsScrollListener.kt index 11d65d7b3..f9d41fec8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/BoundsScrollListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/BoundsScrollListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/FitHeightGridLayoutManager.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/FitHeightGridLayoutManager.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/FitHeightGridLayoutManager.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/FitHeightGridLayoutManager.kt index fc6564beb..ddb94ce34 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/FitHeightGridLayoutManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/FitHeightGridLayoutManager.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.content.Context import android.util.AttributeSet @@ -34,4 +34,4 @@ class FitHeightGridLayoutManager : GridLayoutManager { super.layoutDecoratedWithMargins(child, left, top, right, bottom) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/FitHeightLinearLayoutManager.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/FitHeightLinearLayoutManager.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/FitHeightLinearLayoutManager.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/FitHeightLinearLayoutManager.kt index 64e73198a..f4a36a227 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/FitHeightLinearLayoutManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/FitHeightLinearLayoutManager.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.content.Context import android.util.AttributeSet @@ -34,4 +34,4 @@ class FitHeightLinearLayoutManager : LinearLayoutManager { super.layoutDecoratedWithMargins(child, left, top, right, bottom) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/ListSelectionController.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/ListSelectionController.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/ListSelectionController.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/ListSelectionController.kt index 5cadc9c6f..e552e1098 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/ListSelectionController.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/ListSelectionController.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.app.Activity import android.os.Bundle @@ -12,9 +12,9 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.RecyclerView import androidx.savedstate.SavedStateRegistry import androidx.savedstate.SavedStateRegistryOwner -import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.Dispatchers -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import kotlin.coroutines.EmptyCoroutineContext private const val KEY_SELECTION = "selection" private const val PROVIDER_NAME = "selection_decoration" diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/NestedScrollStateHandle.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/NestedScrollStateHandle.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/NestedScrollStateHandle.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/NestedScrollStateHandle.kt index 80d5310d3..b4946ccb0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/NestedScrollStateHandle.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/NestedScrollStateHandle.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.os.Bundle import android.os.Parcelable diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/OnListItemClickListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/OnListItemClickListener.kt similarity index 79% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/OnListItemClickListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/OnListItemClickListener.kt index e61f85bb0..e394740b9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/OnListItemClickListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/OnListItemClickListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.view.View diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/OnTipCloseListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/OnTipCloseListener.kt similarity index 59% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/OnTipCloseListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/OnTipCloseListener.kt index 9c9721eef..81078afee 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/OnTipCloseListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/OnTipCloseListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list interface OnTipCloseListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/PaginationScrollListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/PaginationScrollListener.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/PaginationScrollListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/PaginationScrollListener.kt index 5681cae23..4f70dcd4d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/PaginationScrollListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/PaginationScrollListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import androidx.recyclerview.widget.RecyclerView @@ -15,4 +15,4 @@ class PaginationScrollListener(offset: Int, private val callback: Callback) : fun onScrolledToEnd() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/ScrollListenerInvalidationObserver.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/ScrollListenerInvalidationObserver.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/ScrollListenerInvalidationObserver.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/ScrollListenerInvalidationObserver.kt index b3e30c910..5acc5862c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/ScrollListenerInvalidationObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/ScrollListenerInvalidationObserver.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/SectionedSelectionController.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/SectionedSelectionController.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/SectionedSelectionController.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/SectionedSelectionController.kt index d210c6991..066b4fa59 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/SectionedSelectionController.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/SectionedSelectionController.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list +package org.koitharu.kotatsu.core.ui.list import android.app.Activity import android.os.Bundle @@ -14,7 +14,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.savedstate.SavedStateRegistry import androidx.savedstate.SavedStateRegistryOwner import kotlinx.coroutines.Dispatchers -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration import kotlin.coroutines.EmptyCoroutineContext private const val PROVIDER_NAME = "selection_decoration_sectioned" diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/AbstractDividerItemDecoration.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/AbstractDividerItemDecoration.kt index 2d91e71c7..ca4bbec76 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractDividerItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/AbstractDividerItemDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.decor +package org.koitharu.kotatsu.core.ui.list.decor import android.annotation.SuppressLint import android.content.Context @@ -59,7 +59,7 @@ abstract class AbstractDividerItemDecoration(context: Context) : RecyclerView.It left, parent.paddingTop.toFloat(), right, - (parent.height - parent.paddingBottom).toFloat() + (parent.height - parent.paddingBottom).toFloat(), ) } else { left = 0f @@ -84,4 +84,4 @@ abstract class AbstractDividerItemDecoration(context: Context) : RecyclerView.It above: RecyclerView.ViewHolder, below: RecyclerView.ViewHolder, ): Boolean -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractSelectionItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/AbstractSelectionItemDecoration.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractSelectionItemDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/AbstractSelectionItemDecoration.kt index 1974f6a5d..20e3aef78 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/AbstractSelectionItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/AbstractSelectionItemDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.decor +package org.koitharu.kotatsu.core.ui.list.decor import android.graphics.Canvas import android.graphics.Rect @@ -67,7 +67,7 @@ abstract class AbstractSelectionItemDecoration : RecyclerView.ItemDecoration() { if (parent.clipToPadding) { canvas.clipRect( parent.paddingLeft, parent.paddingTop, parent.width - parent.paddingRight, - parent.height - parent.paddingBottom + parent.height - parent.paddingBottom, ) } @@ -108,4 +108,4 @@ abstract class AbstractSelectionItemDecoration : RecyclerView.ItemDecoration() { bounds: RectF, state: RecyclerView.State, ) = Unit -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SpacingItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/SpacingItemDecoration.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SpacingItemDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/SpacingItemDecoration.kt index 5b9fbde29..88f3593ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SpacingItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/SpacingItemDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.decor +package org.koitharu.kotatsu.core.ui.list.decor import android.graphics.Rect import android.view.View diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/TypedSpacingItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/TypedSpacingItemDecoration.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/TypedSpacingItemDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/TypedSpacingItemDecoration.kt index 5662f026a..244936dbf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/TypedSpacingItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/decor/TypedSpacingItemDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.decor +package org.koitharu.kotatsu.core.ui.list.decor import android.graphics.Rect import android.util.SparseIntArray @@ -13,7 +13,7 @@ class TypedSpacingItemDecoration( ) : RecyclerView.ItemDecoration() { private val mapping = SparseIntArray(spacingMapping.size) - + init { spacingMapping.forEach { (k, v) -> mapping[k] = v } } @@ -32,4 +32,4 @@ class TypedSpacingItemDecoration( } outRect.set(spacing, spacing, spacing, spacing) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/BubbleAnimator.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/BubbleAnimator.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/BubbleAnimator.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/BubbleAnimator.kt index 36b5e0e5f..359edfc05 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/BubbleAnimator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/BubbleAnimator.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.fastscroll +package org.koitharu.kotatsu.core.ui.list.fastscroll import android.animation.Animator import android.animation.AnimatorListenerAdapter @@ -8,9 +8,9 @@ import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import androidx.core.view.isInvisible import androidx.core.view.isVisible +import org.koitharu.kotatsu.core.util.ext.animatorDurationScale +import org.koitharu.kotatsu.core.util.ext.measureWidth import kotlin.math.hypot -import org.koitharu.kotatsu.utils.ext.animatorDurationScale -import org.koitharu.kotatsu.utils.ext.measureWidth class BubbleAnimator( private val bubble: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/FastScrollRecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/FastScrollRecyclerView.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/FastScrollRecyclerView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/FastScrollRecyclerView.kt index 5a7c1274e..2b62a6d49 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/FastScrollRecyclerView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/FastScrollRecyclerView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.fastscroll +package org.koitharu.kotatsu.core.ui.list.fastscroll import android.content.Context import android.util.AttributeSet @@ -42,4 +42,4 @@ class FastScrollRecyclerView @JvmOverloads constructor( fastScroller.detachRecyclerView() super.onDetachedFromWindow() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/FastScroller.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/FastScroller.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/FastScroller.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/FastScroller.kt index e5cb94dd4..d7eca512d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/FastScroller.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/FastScroller.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.fastscroll +package org.koitharu.kotatsu.core.ui.list.fastscroll import android.annotation.SuppressLint import android.content.Context @@ -22,9 +22,9 @@ import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.getThemeColor +import org.koitharu.kotatsu.core.util.ext.isLayoutReversed import org.koitharu.kotatsu.databinding.FastScrollerBinding -import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.isLayoutReversed import kotlin.math.roundToInt import com.google.android.material.R as materialR @@ -98,6 +98,7 @@ class FastScroller @JvmOverloads constructor( showScrollbar() if (showBubbleAlways && sectionIndexer != null) showBubble() } + RecyclerView.SCROLL_STATE_IDLE -> if (hideScrollbar && !binding.thumb.isSelected) { handler.postDelayed(scrollbarHider, SCROLLBAR_HIDE_DELAY) } @@ -176,10 +177,12 @@ class FastScroller @JvmOverloads constructor( setYPositions() return true } + MotionEvent.ACTION_MOVE -> { setYPositions() return true } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { requestDisallowInterceptTouchEvent(false) setHandleSelected(false) @@ -248,17 +251,20 @@ class FastScroller @JvmOverloads constructor( setMargins(0, marginTop, 0, marginBottom) } } + is CoordinatorLayout -> layoutParams = (layoutParams as CoordinatorLayout.LayoutParams).apply { height = LayoutParams.MATCH_PARENT anchorGravity = GravityCompat.END anchorId = recyclerViewId setMargins(0, marginTop, 0, marginBottom) } + is FrameLayout -> layoutParams = (layoutParams as FrameLayout.LayoutParams).apply { height = LayoutParams.MATCH_PARENT gravity = GravityCompat.END setMargins(0, marginTop, 0, marginBottom) } + is RelativeLayout -> layoutParams = (layoutParams as RelativeLayout.LayoutParams).apply { height = 0 addRule(RelativeLayout.ALIGN_TOP, recyclerViewId) @@ -266,6 +272,7 @@ class FastScroller @JvmOverloads constructor( addRule(RelativeLayout.ALIGN_END, recyclerViewId) setMargins(0, marginTop, 0, marginBottom) } + else -> throw IllegalArgumentException("Parent ViewGroup must be a ConstraintLayout, CoordinatorLayout, FrameLayout, or RelativeLayout") } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/ScrollbarAnimator.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/ScrollbarAnimator.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/ScrollbarAnimator.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/ScrollbarAnimator.kt index 75298a802..1d9287b2d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/fastscroll/ScrollbarAnimator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/list/fastscroll/ScrollbarAnimator.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.list.fastscroll +package org.koitharu.kotatsu.core.ui.list.fastscroll import android.animation.Animator import android.animation.AnimatorListenerAdapter @@ -7,7 +7,7 @@ import android.view.ViewPropertyAnimator import androidx.core.view.isInvisible import androidx.core.view.isVisible import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.ext.animatorDurationScale +import org.koitharu.kotatsu.core.util.ext.animatorDurationScale class ScrollbarAnimator( private val scrollbar: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/DateTimeAgo.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/model/DateTimeAgo.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/core/ui/DateTimeAgo.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/model/DateTimeAgo.kt index a11f56e01..8e468b5ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/DateTimeAgo.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/model/DateTimeAgo.kt @@ -1,10 +1,10 @@ -package org.koitharu.kotatsu.core.ui +package org.koitharu.kotatsu.core.ui.model import android.content.res.Resources import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.daysDiff +import org.koitharu.kotatsu.core.util.ext.format import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.daysDiff -import org.koitharu.kotatsu.utils.ext.format import java.util.Date sealed class DateTimeAgo : ListModel { @@ -107,9 +107,7 @@ sealed class DateTimeAgo : ListModel { other as Absolute - if (day != other.day) return false - - return true + return day == other.day } override fun hashCode(): Int { diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/SortOrder.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/model/SortOrder.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/core/ui/SortOrder.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/model/SortOrder.kt index 92b9fd9ef..71e6034e6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/SortOrder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/model/SortOrder.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.ui +package org.koitharu.kotatsu.core.ui.model import androidx.annotation.StringRes import org.koitharu.kotatsu.R @@ -12,4 +12,4 @@ val SortOrder.titleRes: Int SortOrder.RATING -> R.string.by_rating SortOrder.NEWEST -> R.string.newest SortOrder.ALPHABETICAL -> R.string.by_name - } \ No newline at end of file + } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActionModeDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActionModeDelegate.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActionModeDelegate.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActionModeDelegate.kt index feed3fc6a..585f39e69 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActionModeDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActionModeDelegate.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import androidx.activity.OnBackPressedCallback import androidx.appcompat.view.ActionMode diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActionModeListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActionModeListener.kt similarity index 78% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActionModeListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActionModeListener.kt index 0c87ff612..fde599ede 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActionModeListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActionModeListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import androidx.appcompat.view.ActionMode @@ -7,4 +7,4 @@ interface ActionModeListener { fun onActionModeStarted(mode: ActionMode) fun onActionModeFinished(mode: ActionMode) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt similarity index 86% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt index 036515bbe..46c1d0f9e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ActivityRecreationHandle.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt @@ -1,9 +1,9 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.app.Activity import android.os.Bundle import androidx.core.app.ActivityCompat -import org.koitharu.kotatsu.base.ui.DefaultActivityLifecycleCallbacks +import org.koitharu.kotatsu.core.ui.DefaultActivityLifecycleCallbacks import java.util.WeakHashMap import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/BaseActivityEntryPoint.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/BaseActivityEntryPoint.kt similarity index 86% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/BaseActivityEntryPoint.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/BaseActivityEntryPoint.kt index 66b1a588c..309883319 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/BaseActivityEntryPoint.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/BaseActivityEntryPoint.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import dagger.hilt.EntryPoint import dagger.hilt.InstallIn diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/CollapseActionViewCallback.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/CollapseActionViewCallback.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/CollapseActionViewCallback.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/CollapseActionViewCallback.kt index 5d9058de1..b417e40e3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/CollapseActionViewCallback.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/CollapseActionViewCallback.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.view.MenuItem import android.view.MenuItem.OnActionExpandListener diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/CountedBooleanLiveData.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/CountedBooleanLiveData.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/CountedBooleanLiveData.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/CountedBooleanLiveData.kt index d654e541d..a737c0af9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/CountedBooleanLiveData.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/CountedBooleanLiveData.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import androidx.annotation.AnyThread import androidx.lifecycle.LiveData @@ -28,4 +28,4 @@ class CountedBooleanLiveData : LiveData(false) { postValue(false) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/DefaultTextWatcher.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/DefaultTextWatcher.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/DefaultTextWatcher.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/DefaultTextWatcher.kt index a382f488c..999dd6641 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/DefaultTextWatcher.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/DefaultTextWatcher.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.text.Editable import android.text.TextWatcher diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/RecyclerViewOwner.kt similarity index 72% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/RecyclerViewOwner.kt index 9b0976d51..f34963f15 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/RecyclerViewOwner.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/RecyclerViewOwner.kt @@ -1,8 +1,8 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import androidx.recyclerview.widget.RecyclerView interface RecyclerViewOwner { val recyclerView: RecyclerView -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ReversibleAction.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleAction.kt similarity index 56% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/ReversibleAction.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleAction.kt index 57bb80a78..f9fea6652 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ReversibleAction.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleAction.kt @@ -1,9 +1,8 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import androidx.annotation.StringRes -import org.koitharu.kotatsu.base.domain.ReversibleHandle class ReversibleAction( @StringRes val stringResId: Int, val handle: ReversibleHandle?, -) \ No newline at end of file +) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ReversibleActionObserver.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt similarity index 86% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/ReversibleActionObserver.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt index ba685c4f4..4f6319f66 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ReversibleActionObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleActionObserver.kt @@ -1,10 +1,9 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.view.View import androidx.lifecycle.Observer import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.reverseAsync class ReversibleActionObserver( private val snackbarHost: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/ReversibleHandle.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleHandle.kt similarity index 70% rename from app/src/main/java/org/koitharu/kotatsu/base/domain/ReversibleHandle.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleHandle.kt index f34c99e69..d3d6bc475 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/ReversibleHandle.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ReversibleHandle.kt @@ -1,12 +1,12 @@ -package org.koitharu.kotatsu.base.domain +package org.koitharu.kotatsu.core.ui.util import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.processLifecycleScope -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug fun interface ReversibleHandle { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ShrinkOnScrollBehavior.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ShrinkOnScrollBehavior.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/ShrinkOnScrollBehavior.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/ShrinkOnScrollBehavior.kt index c22585755..8d648ec3a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/ShrinkOnScrollBehavior.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/ShrinkOnScrollBehavior.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.content.Context import android.util.AttributeSet diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/SpanSizeResolver.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/SpanSizeResolver.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/SpanSizeResolver.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/SpanSizeResolver.kt index 71e5dc398..9c0e07f91 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/SpanSizeResolver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/SpanSizeResolver.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.view.View import androidx.annotation.Px diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/StatusBarDimHelper.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/StatusBarDimHelper.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/StatusBarDimHelper.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/StatusBarDimHelper.kt index 7a8bf28d4..b58f36ae1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/StatusBarDimHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/StatusBarDimHelper.kt @@ -1,11 +1,11 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.animation.ValueAnimator import android.view.animation.AccelerateDecelerateInterpolator -import com.google.android.material.R as materialR import com.google.android.material.appbar.AppBarLayout import com.google.android.material.shape.MaterialShapeDrawable -import org.koitharu.kotatsu.utils.ext.getAnimationDuration +import org.koitharu.kotatsu.core.util.ext.getAnimationDuration +import com.google.android.material.R as materialR class StatusBarDimHelper : AppBarLayout.OnOffsetChangedListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/WindowInsetsDelegate.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/util/WindowInsetsDelegate.kt index ff80acbbb..a85868857 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/util/WindowInsetsDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/util/WindowInsetsDelegate.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.util +package org.koitharu.kotatsu.core.ui.util import android.view.View import androidx.core.graphics.Insets diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/BottomSheetHeaderBar.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/BottomSheetHeaderBar.kt index 3f01e8769..354206ad4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/BottomSheetHeaderBar.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.animation.LayoutTransition import android.content.Context @@ -21,10 +21,10 @@ import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomsheet.BottomSheetBehavior import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.getAnimationDuration +import org.koitharu.kotatsu.core.util.ext.getThemeDrawable +import org.koitharu.kotatsu.core.util.ext.parents import org.koitharu.kotatsu.databinding.LayoutSheetHeaderBinding -import org.koitharu.kotatsu.utils.ext.getAnimationDuration -import org.koitharu.kotatsu.utils.ext.getThemeDrawable -import org.koitharu.kotatsu.utils.ext.parents import java.util.* import com.google.android.material.R as materialR diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CheckableImageView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/CheckableImageView.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CheckableImageView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/CheckableImageView.kt index 2d18292cc..b872917c0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CheckableImageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/CheckableImageView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.content.Context import android.os.Parcel @@ -101,4 +101,4 @@ class CheckableImageView @JvmOverloads constructor( } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ChipsView.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ChipsView.kt index 88398cbd0..3ad0838ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ChipsView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.annotation.SuppressLint import android.content.Context @@ -13,7 +13,7 @@ import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipGroup import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.ext.castOrNull +import org.koitharu.kotatsu.core.util.ext.castOrNull import com.google.android.material.R as materialR class ChipsView @JvmOverloads constructor( @@ -149,9 +149,7 @@ class ChipsView @JvmOverloads constructor( if (title != other.title) return false if (isCheckable != other.isCheckable) return false if (isChecked != other.isChecked) return false - if (data != other.data) return false - - return true + return data == other.data } override fun hashCode(): Int { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/CoverImageView.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/CoverImageView.kt index 3a52eb237..9bcd4ca60 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/CoverImageView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.content.Context import android.util.AttributeSet @@ -40,4 +40,4 @@ class CoverImageView @JvmOverloads constructor( } setMeasuredDimension(desiredWidth, desiredHeight) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/HideBottomNavigationOnScrollBehavior.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/HideBottomNavigationOnScrollBehavior.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/HideBottomNavigationOnScrollBehavior.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/HideBottomNavigationOnScrollBehavior.kt index b1742420a..629ffcd12 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/HideBottomNavigationOnScrollBehavior.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/HideBottomNavigationOnScrollBehavior.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.animation.ValueAnimator import android.content.Context @@ -10,8 +10,8 @@ import androidx.core.view.ViewCompat import com.google.android.material.appbar.AppBarLayout import com.google.android.material.bottomnavigation.BottomNavigationView import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.ext.getAnimationDuration -import org.koitharu.kotatsu.utils.ext.measureHeight +import org.koitharu.kotatsu.core.util.ext.getAnimationDuration +import org.koitharu.kotatsu.core.util.ext.measureHeight class HideBottomNavigationOnScrollBehavior @JvmOverloads constructor( context: Context? = null, diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ListItemTextView.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ListItemTextView.kt index e51509920..71d9314f7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ListItemTextView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ListItemTextView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.annotation.SuppressLint import android.content.Context @@ -19,7 +19,7 @@ import com.google.android.material.ripple.RippleUtils import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.ext.resolveDp +import org.koitharu.kotatsu.core.util.ext.resolveDp @SuppressLint("RestrictedApi") class ListItemTextView @JvmOverloads constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SegmentedBarView.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SegmentedBarView.kt index 1125b7839..39591490a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SegmentedBarView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SegmentedBarView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.animation.Animator import android.animation.ValueAnimator @@ -12,11 +12,11 @@ import android.view.ViewOutlineProvider import android.view.animation.DecelerateInterpolator import androidx.annotation.ColorInt import androidx.annotation.FloatRange +import org.koitharu.kotatsu.core.util.ext.getAnimationDuration +import org.koitharu.kotatsu.core.util.ext.getThemeColor +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled +import org.koitharu.kotatsu.core.util.ext.resolveDp import org.koitharu.kotatsu.parsers.util.replaceWith -import org.koitharu.kotatsu.utils.ext.getAnimationDuration -import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.isAnimationsEnabled -import org.koitharu.kotatsu.utils.ext.resolveDp import com.google.android.material.R as materialR class SegmentedBarView @JvmOverloads constructor( @@ -135,9 +135,7 @@ class SegmentedBarView @JvmOverloads constructor( other as Segment if (percent != other.percent) return false - if (color != other.color) return false - - return true + return color == other.color } override fun hashCode(): Int { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SelectableTextView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SelectableTextView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt index e931853f0..32cb29875 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SelectableTextView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.content.Context import android.text.Selection @@ -26,4 +26,4 @@ class SelectableTextView @JvmOverloads constructor( Selection.setSelection(spannableText, text.length) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ShapeView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ShapeView.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ShapeView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ShapeView.kt index 5ec934c1e..32b7f47dd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ShapeView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/ShapeView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SlidingBottomNavigationView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SlidingBottomNavigationView.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SlidingBottomNavigationView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SlidingBottomNavigationView.kt index 3e9e7b55d..b34a958bf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/SlidingBottomNavigationView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/SlidingBottomNavigationView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.animation.Animator import android.animation.AnimatorListenerAdapter @@ -14,10 +14,10 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.customview.view.AbsSavedState import androidx.interpolator.view.animation.FastOutLinearInInterpolator import androidx.interpolator.view.animation.LinearOutSlowInInterpolator -import com.google.android.material.R as materialR import com.google.android.material.bottomnavigation.BottomNavigationView -import org.koitharu.kotatsu.utils.ext.applySystemAnimatorScale -import org.koitharu.kotatsu.utils.ext.measureHeight +import org.koitharu.kotatsu.core.util.ext.applySystemAnimatorScale +import org.koitharu.kotatsu.core.util.ext.measureHeight +import com.google.android.material.R as materialR private const val STATE_DOWN = 1 private const val STATE_UP = 2 diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/TwoLinesItemView.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/TwoLinesItemView.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/TwoLinesItemView.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/TwoLinesItemView.kt index f7f8d44e1..37058bac2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/TwoLinesItemView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/TwoLinesItemView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.annotation.SuppressLint import android.content.Context @@ -23,8 +23,8 @@ import com.google.android.material.ripple.RippleUtils import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.resolveDp import org.koitharu.kotatsu.databinding.ViewTwoLinesItemBinding -import org.koitharu.kotatsu.utils.ext.resolveDp @SuppressLint("RestrictedApi") class TwoLinesItemView @JvmOverloads constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/WindowInsetHolder.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt rename to app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/WindowInsetHolder.kt index 3279dfc06..57870cf19 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/widgets/WindowInsetHolder.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.base.ui.widgets +package org.koitharu.kotatsu.core.ui.widgets import android.content.Context import android.util.AttributeSet diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/AlphanumComparator.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/AlphanumComparator.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/AlphanumComparator.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/AlphanumComparator.kt index cee0626c0..46867633e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/AlphanumComparator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/AlphanumComparator.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util class AlphanumComparator : Comparator { @@ -60,4 +60,4 @@ class AlphanumComparator : Comparator { } return chunk.toString() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/BufferedObserver.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/BufferedObserver.kt similarity index 64% rename from app/src/main/java/org/koitharu/kotatsu/utils/BufferedObserver.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/BufferedObserver.kt index bc806ec7a..ccebce668 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/BufferedObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/BufferedObserver.kt @@ -1,6 +1,6 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util fun interface BufferedObserver { fun onChanged(t: T, previous: T?) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/CancellableSource.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/CancellableSource.kt similarity index 90% rename from app/src/main/java/org/koitharu/kotatsu/utils/CancellableSource.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/CancellableSource.kt index 9830d86b6..d06daa6ea 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/CancellableSource.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/CancellableSource.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import kotlinx.coroutines.Job import kotlinx.coroutines.ensureActive diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/CompositeMutex.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/CompositeMutex.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/CompositeMutex.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/CompositeMutex.kt index 99f69e11a..9c9c9f0d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/CompositeMutex.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/CompositeMutex.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import androidx.collection.ArrayMap import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/EditTextValidator.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/EditTextValidator.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/EditTextValidator.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/EditTextValidator.kt index 37ca77618..3554fc194 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/EditTextValidator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/EditTextValidator.kt @@ -1,11 +1,11 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.content.Context import android.text.Editable import android.text.TextWatcher import android.widget.EditText import androidx.annotation.CallSuper -import org.koitharu.kotatsu.utils.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import java.lang.ref.WeakReference abstract class EditTextValidator : TextWatcher { @@ -51,4 +51,4 @@ abstract class EditTextValidator : TextWatcher { class Failed(val message: CharSequence) : ValidationResult() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/FileSize.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/FileSize.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/utils/FileSize.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/FileSize.kt index cb558edfe..6325c3dec 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/FileSize.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/FileSize.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.content.Context import org.koitharu.kotatsu.R @@ -22,8 +22,8 @@ enum class FileSize(private val multiplier: Int) { return buildString { append( DecimalFormat("#,##0.#").format( - bytes / 1024.0.pow(digitGroups.toDouble()) - ) + bytes / 1024.0.pow(digitGroups.toDouble()), + ), ) val unit = units.getOrNull(digitGroups) if (unit != null) { @@ -32,4 +32,4 @@ enum class FileSize(private val multiplier: Int) { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/FlowLiveData.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/FlowLiveData.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/utils/FlowLiveData.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/FlowLiveData.kt index 797893609..7b3693902 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/FlowLiveData.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/FlowLiveData.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import androidx.lifecycle.LiveData import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/GoneOnInvisibleListener.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/GoneOnInvisibleListener.kt index 46de769c6..25ab3717f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/GoneOnInvisibleListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.view.View import android.view.ViewTreeObserver diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/GridTouchHelper.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/GridTouchHelper.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/GridTouchHelper.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/GridTouchHelper.kt index 9605fb93b..6608c719e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/GridTouchHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/GridTouchHelper.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.content.Context import android.view.GestureDetector @@ -44,6 +44,7 @@ class GridTouchHelper( else -> return false } } + 2 -> AREA_RIGHT else -> return false }, diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/IdlingDetector.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/IdlingDetector.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/utils/IdlingDetector.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/IdlingDetector.kt index 0501a3da6..d9cbedfdc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/IdlingDetector.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/IdlingDetector.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.os.Handler import android.os.Looper diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/IncognitoModeIndicator.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/IncognitoModeIndicator.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/utils/IncognitoModeIndicator.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/IncognitoModeIndicator.kt index 8ca72f3eb..7dc2ee1ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/IncognitoModeIndicator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/IncognitoModeIndicator.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.app.Activity import android.os.Bundle @@ -11,10 +11,10 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.DefaultActivityLifecycleCallbacks import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow -import org.koitharu.kotatsu.utils.ext.getThemeColor +import org.koitharu.kotatsu.core.ui.DefaultActivityLifecycleCallbacks +import org.koitharu.kotatsu.core.util.ext.getThemeColor import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/MediatorStateFlow.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/MediatorStateFlow.kt index 0f4fda663..7bee7ffc2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/MediatorStateFlow.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/RecyclerViewScrollCallback.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/RecyclerViewScrollCallback.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/RecyclerViewScrollCallback.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/RecyclerViewScrollCallback.kt index 075126db2..f8815ae6e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/RecyclerViewScrollCallback.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/RecyclerViewScrollCallback.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import androidx.annotation.Px import androidx.recyclerview.widget.LinearLayoutManager @@ -23,4 +23,4 @@ class RecyclerViewScrollCallback( lm.scrollToPosition(position) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/RetainedLifecycleCoroutineScope.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/RetainedLifecycleCoroutineScope.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/RetainedLifecycleCoroutineScope.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/RetainedLifecycleCoroutineScope.kt index 66a232922..cf5645f1c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/RetainedLifecycleCoroutineScope.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/RetainedLifecycleCoroutineScope.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import dagger.hilt.android.lifecycle.RetainedLifecycle import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ScreenOrientationHelper.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ScreenOrientationHelper.kt index 4cecbd2a8..8f062e247 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ScreenOrientationHelper.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.app.Activity import android.content.pm.ActivityInfo @@ -18,7 +18,7 @@ class ScreenOrientationHelper(private val activity: Activity) { get() = Settings.System.getInt( activity.contentResolver, Settings.System.ACCELEROMETER_ROTATION, - 0 + 0, ) == 1 var isLandscape: Boolean @@ -42,7 +42,7 @@ class ScreenOrientationHelper(private val activity: Activity) { } } activity.contentResolver.registerContentObserver( - Settings.System.CONTENT_URI, true, observer + Settings.System.CONTENT_URI, true, observer, ) awaitClose { activity.contentResolver.unregisterContentObserver(observer) @@ -50,4 +50,4 @@ class ScreenOrientationHelper(private val activity: Activity) { }.onStart { emit(isAutoRotationEnabled) }.distinctUntilChanged() -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ShareHelper.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ShareHelper.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/utils/ShareHelper.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ShareHelper.kt index 3bdbc5ce3..57d5e7c80 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ShareHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ShareHelper.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.content.Context import android.net.Uri diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/SingleLiveEvent.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/SingleLiveEvent.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/SingleLiveEvent.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/SingleLiveEvent.kt index cbc89d96b..504690d6f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/SingleLiveEvent.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/SingleLiveEvent.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import androidx.annotation.AnyThread import androidx.annotation.MainThread diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/TaggedActivityResult.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/TaggedActivityResult.kt similarity index 63% rename from app/src/main/java/org/koitharu/kotatsu/utils/TaggedActivityResult.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/TaggedActivityResult.kt index ee84cffb2..8fba053eb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/TaggedActivityResult.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/TaggedActivityResult.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.app.Activity @@ -8,4 +8,4 @@ class TaggedActivityResult( ) val TaggedActivityResult.isSuccess: Boolean - get() = this.result == Activity.RESULT_OK \ No newline at end of file + get() = this.result == Activity.RESULT_OK diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/Throttler.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/Throttler.kt similarity index 88% rename from app/src/main/java/org/koitharu/kotatsu/utils/Throttler.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/Throttler.kt index b026cf15e..5748c79bb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/Throttler.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/Throttler.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.os.SystemClock diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ViewBadge.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ViewBadge.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/ViewBadge.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ViewBadge.kt index 90f7a94d7..e8aa4263d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ViewBadge.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ViewBadge.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.view.View import androidx.annotation.OptIn diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/WorkManagerHelper.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/WorkManagerHelper.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/WorkManagerHelper.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/WorkManagerHelper.kt index 0b768d3f5..95e7aaa4e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/WorkManagerHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/WorkManagerHelper.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.annotation.SuppressLint import androidx.work.WorkInfo diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/WorkServiceStopHelper.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/WorkServiceStopHelper.kt similarity index 91% rename from app/src/main/java/org/koitharu/kotatsu/utils/WorkServiceStopHelper.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/WorkServiceStopHelper.kt index b0c426cc2..533c407a2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/WorkServiceStopHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/WorkServiceStopHelper.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils +package org.koitharu.kotatsu.core.util import android.annotation.SuppressLint import android.content.Context @@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import org.koitharu.kotatsu.utils.ext.processLifecycleScope +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope /** * Workaround for issue diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Android.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Android.kt index 7a1872739..02c0f3ba0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Android.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.app.Activity import android.app.ActivityManager @@ -41,6 +41,8 @@ import org.json.JSONException import org.jsoup.internal.StringUtil.StringJoiner import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParserException import kotlin.math.roundToLong @@ -134,8 +136,8 @@ fun Context.getAnimationDuration(@IntegerRes resId: Int): Long { return (resources.getInteger(resId) * animatorDurationScale).roundToLong() } -fun isLowRamDevice(context: Context): Boolean { - return context.activityManager?.isLowRamDevice ?: false +fun Context.isLowRamDevice(): Boolean { + return activityManager?.isLowRamDevice ?: false } fun scaleUpActivityOptionsOf(view: View): ActivityOptions = ActivityOptions.makeScaleUpAnimation( diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Bundle.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Bundle.kt index 1dcead8e2..d17233c25 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Bundle.kt @@ -1,6 +1,6 @@ @file:Suppress("DEPRECATION") -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.Intent import android.os.Build diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Coil.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Coil.kt index 8837856bc..d870f8d3b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Coil.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.Context import android.widget.ImageView @@ -12,9 +12,9 @@ import coil.request.SuccessResult import coil.util.CoilUtils import com.google.android.material.progressindicator.BaseProgressIndicator import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.ui.image.RegionBitmapDecoder +import org.koitharu.kotatsu.core.util.progress.ImageRequestIndicatorListener import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.image.RegionBitmapDecoder -import org.koitharu.kotatsu.utils.progress.ImageRequestIndicatorListener fun ImageView.newImageRequest(lifecycleOwner: LifecycleOwner, data: Any?): ImageRequest.Builder? { val current = CoilUtils.result(this) @@ -23,6 +23,7 @@ fun ImageView.newImageRequest(lifecycleOwner: LifecycleOwner, data: Any?): Image return null } } + disposeImageRequest() return ImageRequest.Builder(context) .data(data) .lifecycle(lifecycleOwner) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Collections.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Collections.kt index 879704445..9cb967878 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Collections.kt @@ -1,9 +1,10 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import androidx.collection.ArrayMap import androidx.collection.ArraySet import java.util.Collections +@Deprecated("TODO: remove") fun MutableList.move(sourceIndex: Int, targetIndex: Int) { if (sourceIndex <= targetIndex) { Collections.rotate(subList(sourceIndex, targetIndex + 1), -1) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Coroutines.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Coroutines.kt index 3120f2f68..632030e09 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Coroutines.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleCoroutineScope diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CursorExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Cursor.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/CursorExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Cursor.kt index eeab153b0..3cec3da3b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CursorExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Cursor.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.ContentValues import android.database.Cursor @@ -36,4 +36,4 @@ fun JSONObject.toContentValues(): ContentValues { return cv } -private fun String.escapeName() = "`$this`" \ No newline at end of file +private fun String.escapeName() = "`$this`" diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/DateExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Date.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/DateExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Date.kt index 0a78f0341..e75842410 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/DateExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Date.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.annotation.SuppressLint import android.text.format.DateUtils @@ -10,7 +10,7 @@ import java.util.concurrent.TimeUnit fun Date.format(pattern: String): String = SimpleDateFormat(pattern).format(this) fun Date.formatRelative(minResolution: Long): CharSequence = DateUtils.getRelativeTimeSpanString( - time, System.currentTimeMillis(), minResolution + time, System.currentTimeMillis(), minResolution, ) fun Date.daysDiff(other: Long): Int { @@ -27,4 +27,4 @@ fun Date.startOfDay(): Long { calendar[Calendar.SECOND] = 0 calendar[Calendar.MILLISECOND] = 0 return calendar.timeInMillis -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/DisplayExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Display.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/DisplayExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Display.kt index 6f917ac1e..b8ca902d4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/DisplayExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Display.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.app.Activity import android.graphics.Rect diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/File.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/File.kt index f2800f68c..ac98e2b48 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/File.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.ContentResolver import android.content.Context diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FlowExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Flow.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/FlowExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Flow.kt index 0ed270991..3db3bb15e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FlowExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Flow.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.os.SystemClock import kotlinx.coroutines.delay diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FragmentExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Fragment.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/FragmentExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Fragment.kt index 1b696422e..d755911aa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FragmentExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Fragment.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.os.Bundle import androidx.annotation.MainThread diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/GraphicsExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Graphics.kt similarity index 85% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/GraphicsExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Graphics.kt index 94dc692a3..2e59b582f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/GraphicsExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Graphics.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.graphics.Rect import kotlin.math.roundToInt @@ -10,4 +10,4 @@ fun Rect.scale(factor: Double) { (width() - newWidth) / 2, (height() - newHeight) / 2, ) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/HttpExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Http.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/HttpExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Http.kt index a38596cb0..f5a23453e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/HttpExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Http.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.toRequestBody diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/IO.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/IO.kt similarity index 80% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/IO.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/IO.kt index 82a3780ce..d41e0ba38 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/IO.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/IO.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -8,8 +8,8 @@ import kotlinx.coroutines.withContext import okhttp3.ResponseBody import okio.BufferedSink import okio.Source -import org.koitharu.kotatsu.utils.CancellableSource -import org.koitharu.kotatsu.utils.progress.ProgressResponseBody +import org.koitharu.kotatsu.core.util.CancellableSource +import org.koitharu.kotatsu.core.util.progress.ProgressResponseBody fun ResponseBody.withProgress(progressState: MutableStateFlow): ResponseBody { return ProgressResponseBody(this, progressState) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Insets.kt similarity index 83% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Insets.kt index af2ddca22..eef3a3b45 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Insets.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.view.View import androidx.core.graphics.Insets diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/LiveData.kt similarity index 88% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/LiveData.kt index 7f23b9487..ed8d96b62 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/LiveData.kt @@ -1,11 +1,11 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.koitharu.kotatsu.utils.BufferedObserver +import org.koitharu.kotatsu.core.util.BufferedObserver import kotlin.coroutines.EmptyCoroutineContext fun LiveData.requireValue(): T = checkNotNull(value) { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LocaleListExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/LocaleList.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/LocaleListExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/LocaleList.kt index b6ae2535c..1c093a2d8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LocaleListExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/LocaleList.kt @@ -1,7 +1,7 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import androidx.core.os.LocaleListCompat -import java.util.* +import java.util.Locale operator fun LocaleListCompat.iterator(): ListIterator = LocaleListCompatIterator(this) @@ -32,4 +32,4 @@ private class LocaleListCompatIterator(private val list: LocaleListCompat) : Lis override fun previous() = list.get(--index) ?: throw NoSuchElementException() override fun previousIndex() = index - 1 -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/Network.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Network.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/Network.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Network.kt index 07bdd0304..9f73ecfbf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/Network.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Network.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.Context import android.net.ConnectivityManager diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Other.kt similarity index 77% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Other.kt index 61066cd5d..baf078b7f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Other.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext @Suppress("UNCHECKED_CAST") fun Class.castOrNull(obj: Any?): T? { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PreferencesExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Preferences.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/PreferencesExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Preferences.kt index d20c1eca6..72b7fc3bd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PreferencesExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Preferences.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.SharedPreferences import androidx.preference.ListPreference @@ -22,4 +22,4 @@ fun > SharedPreferences.getEnumValue(key: String, defaultValue: E): fun > SharedPreferences.Editor.putEnumValue(key: String, value: E?) { putString(key, value?.name) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Primitive.kt similarity index 81% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Primitive.kt index dee4a06d7..85fe52e38 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Primitive.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext inline fun Int.ifZero(defaultValue: () -> Int): Int = if (this == 0) defaultValue() else this diff --git a/app/src/main/java/org/koitharu/kotatsu/core/util/ext/RecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/RecyclerView.kt new file mode 100644 index 000000000..0dd4d0cf2 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/RecyclerView.kt @@ -0,0 +1,81 @@ +package org.koitharu.kotatsu.core.util.ext + +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewBindingViewHolder +import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewHolder + +fun RecyclerView.clearItemDecorations() { + suppressLayout(true) + while (itemDecorationCount > 0) { + removeItemDecorationAt(0) + } + suppressLayout(false) +} + +fun RecyclerView.removeItemDecoration(cls: Class) { + repeat(itemDecorationCount) { i -> + if (cls.isInstance(getItemDecorationAt(i))) { + removeItemDecorationAt(i) + return + } + } +} + +var RecyclerView.firstVisibleItemPosition: Int + get() = (layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() + ?: RecyclerView.NO_POSITION + set(value) { + if (value != RecyclerView.NO_POSITION) { + (layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(value, 0) + } + } + +val RecyclerView.visibleItemCount: Int + get() = (layoutManager as? LinearLayoutManager)?.run { + findLastVisibleItemPosition() - findFirstVisibleItemPosition() + } ?: 0 + +fun RecyclerView.findCenterViewPosition(): Int { + val centerX = width / 2f + val centerY = height / 2f + val view = findChildViewUnder(centerX, centerY) ?: return RecyclerView.NO_POSITION + return getChildAdapterPosition(view) +} + +fun RecyclerView.ViewHolder.getItem(clazz: Class): T? { + val rawItem = when (this) { + is AdapterDelegateViewBindingViewHolder<*, *> -> item + is AdapterDelegateViewHolder<*> -> item + else -> null + } ?: return null + return if (clazz.isAssignableFrom(rawItem.javaClass)) { + clazz.cast(rawItem) + } else { + null + } +} + +val RecyclerView.isScrolledToTop: Boolean + get() { + if (childCount == 0) { + return true + } + val holder = findViewHolderForAdapterPosition(0) + return holder != null && holder.itemView.top >= 0 + } + +val RecyclerView.LayoutManager?.firstVisibleItemPosition + get() = when (this) { + is LinearLayoutManager -> findFirstVisibleItemPosition() + is StaggeredGridLayoutManager -> findFirstVisibleItemPositions(null)[0] + else -> 0 + } + +val RecyclerView.LayoutManager?.isLayoutReversed + get() = when (this) { + is LinearLayoutManager -> reverseLayout + is StaggeredGridLayoutManager -> reverseLayout + else -> false + } diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ResourcesExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Resources.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/ResourcesExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Resources.kt index 187642b5b..6e75afee3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ResourcesExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Resources.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/String.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/String.kt index 5e4056a5d..bc43c656e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/String.kt @@ -1,7 +1,8 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import androidx.annotation.FloatRange import org.koitharu.kotatsu.parsers.util.levenshteinDistance +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.util.UUID inline fun String?.ifNullOrEmpty(defaultValue: () -> String): String { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/TextViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/TextView.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/TextViewExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/TextView.kt index 305b1e5df..424e1e77c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/TextViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/TextView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.graphics.Typeface import android.graphics.drawable.Drawable diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThemeExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Theme.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/ThemeExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Theme.kt index 7896da2e5..102b9bdb1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThemeExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Theme.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.Context import android.graphics.Color diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Throwable.kt similarity index 90% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/Throwable.kt index c205ca939..3623d56d1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/Throwable.kt @@ -1,10 +1,9 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.content.ActivityNotFoundException import android.content.res.Resources import android.util.AndroidRuntimeException import androidx.collection.arraySetOf -import kotlinx.coroutines.CancellationException import okio.FileNotFoundException import okio.IOException import org.acra.ktx.sendWithAcra @@ -84,18 +83,6 @@ private val reportableExceptions = arraySetOf>( UnsupportedOperationException::class.java, ) -inline fun runCatchingCancellable(block: () -> R): Result { - return try { - Result.success(block()) - } catch (e: InterruptedException) { - throw e - } catch (e: CancellationException) { - throw e - } catch (e: Throwable) { - Result.failure(e) - } -} - fun Throwable.isWebViewUnavailable(): Boolean { return (this is AndroidRuntimeException && message?.contains("WebView") == true) || cause?.isWebViewUnavailable() == true diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/View.kt similarity index 65% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/View.kt index 599aff2e7..70816e0b1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/View.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import android.app.Activity import android.graphics.Rect @@ -9,13 +9,9 @@ import android.view.ViewParent import android.view.inputmethod.InputMethodManager import android.widget.Checkable import androidx.core.view.children -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.slider.Slider -import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewBindingViewHolder -import com.hannesdorfmann.adapterdelegates4.dsl.AdapterDelegateViewHolder import kotlin.math.roundToInt fun View.hideKeyboard() { @@ -28,37 +24,6 @@ fun View.showKeyboard() { imm.showSoftInput(this, 0) } -fun RecyclerView.clearItemDecorations() { - suppressLayout(true) - while (itemDecorationCount > 0) { - removeItemDecorationAt(0) - } - suppressLayout(false) -} - -fun RecyclerView.removeItemDecoration(cls: Class) { - repeat(itemDecorationCount) { i -> - if (cls.isInstance(getItemDecorationAt(i))) { - removeItemDecorationAt(i) - return - } - } -} - -var RecyclerView.firstVisibleItemPosition: Int - get() = (layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() - ?: RecyclerView.NO_POSITION - set(value) { - if (value != RecyclerView.NO_POSITION) { - (layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(value, 0) - } - } - -val RecyclerView.visibleItemCount: Int - get() = (layoutManager as? LinearLayoutManager)?.run { - findLastVisibleItemPosition() - findFirstVisibleItemPosition() - } ?: 0 - fun View.hasGlobalPoint(x: Int, y: Int): Boolean { if (visibility != View.VISIBLE) { return false @@ -111,26 +76,6 @@ fun View.resetTransformations() { rotationY = 0f } -fun RecyclerView.findCenterViewPosition(): Int { - val centerX = width / 2f - val centerY = height / 2f - val view = findChildViewUnder(centerX, centerY) ?: return RecyclerView.NO_POSITION - return getChildAdapterPosition(view) -} - -fun RecyclerView.ViewHolder.getItem(clazz: Class): T? { - val rawItem = when (this) { - is AdapterDelegateViewBindingViewHolder<*, *> -> item - is AdapterDelegateViewHolder<*> -> item - else -> null - } ?: return null - return if (clazz.isAssignableFrom(rawItem.javaClass)) { - clazz.cast(rawItem) - } else { - null - } -} - fun Slider.setValueRounded(newValue: Float) { val step = stepSize val roundedValue = if (step <= 0f) { @@ -141,15 +86,6 @@ fun Slider.setValueRounded(newValue: Float) { value = roundedValue.coerceIn(valueFrom, valueTo) } -val RecyclerView.isScrolledToTop: Boolean - get() { - if (childCount == 0) { - return true - } - val holder = findViewHolderForAdapterPosition(0) - return holder != null && holder.itemView.top >= 0 - } - fun ViewGroup.findViewsByType(clazz: Class): Sequence { if (childCount == 0) { return emptySequence() diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/ViewModel.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewModel.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/ext/ViewModel.kt index 3b840ade1..27108dc26 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/ext/ViewModel.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.ext +package org.koitharu.kotatsu.core.util.ext import androidx.annotation.MainThread import androidx.fragment.app.Fragment diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ImageRequestIndicatorListener.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ImageRequestIndicatorListener.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/ImageRequestIndicatorListener.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/ImageRequestIndicatorListener.kt index 1f1dc1b40..5b2d5bee8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ImageRequestIndicatorListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ImageRequestIndicatorListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import coil.request.ErrorResult import coil.request.ImageRequest diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/IntPercentLabelFormatter.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/IntPercentLabelFormatter.kt similarity index 88% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/IntPercentLabelFormatter.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/IntPercentLabelFormatter.kt index d9f4ff533..e9882986d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/IntPercentLabelFormatter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/IntPercentLabelFormatter.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import android.content.Context import com.google.android.material.slider.LabelFormatter diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/PausingProgressJob.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/PausingProgressJob.kt index eba6501d9..7641646f8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/PausingProgressJob.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import androidx.annotation.AnyThread import kotlinx.coroutines.Job diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressDeferred.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressDeferred.kt similarity index 87% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressDeferred.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressDeferred.kt index 7fd1a9357..c1bad74c6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressDeferred.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressDeferred.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import kotlinx.coroutines.Deferred import kotlinx.coroutines.flow.Flow @@ -13,4 +13,4 @@ class ProgressDeferred( get() = progress.value fun progressAsFlow(): Flow

= progress -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressJob.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressJob.kt similarity index 85% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressJob.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressJob.kt index 919d952ab..826916ddf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressJob.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressJob.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow @@ -13,4 +13,4 @@ open class ProgressJob

( get() = progress.value fun progressAsFlow(): Flow

= progress -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressResponseBody.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressResponseBody.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressResponseBody.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressResponseBody.kt index 20327a272..b66e5cd2a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/ProgressResponseBody.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/ProgressResponseBody.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import kotlinx.coroutines.flow.MutableStateFlow import okhttp3.MediaType diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/TimeLeftEstimator.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt rename to app/src/main/java/org/koitharu/kotatsu/core/util/progress/TimeLeftEstimator.kt index 97b83f52d..e83507ef1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/util/progress/TimeLeftEstimator.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.utils.progress +package org.koitharu.kotatsu.core.util.progress import android.os.SystemClock import java.util.concurrent.TimeUnit diff --git a/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt b/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt index 993894bfd..4a549c6e7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt @@ -4,18 +4,18 @@ import android.content.Context import android.content.Intent import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors -import org.koitharu.kotatsu.base.ui.CoroutineIntentService import org.koitharu.kotatsu.core.cache.ContentCache import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaChapters import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.ui.CoroutineIntentService +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersBottomSheetMediator.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersBottomSheetMediator.kt index d40cb7195..c6921d6e8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersBottomSheetMediator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersBottomSheetMediator.kt @@ -5,8 +5,8 @@ import android.view.View.OnLayoutChangeListener import androidx.activity.OnBackPressedCallback import androidx.appcompat.view.ActionMode import com.google.android.material.bottomsheet.BottomSheetBehavior -import org.koitharu.kotatsu.base.ui.util.ActionModeListener -import org.koitharu.kotatsu.base.ui.widgets.BottomSheetHeaderBar +import org.koitharu.kotatsu.core.ui.util.ActionModeListener +import org.koitharu.kotatsu.core.ui.widgets.BottomSheetHeaderBar class ChaptersBottomSheetMediator( bottomSheet: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index 4915d3221..93d79c01e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -12,9 +12,11 @@ import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.list.ListSelectionController -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.RecyclerViewScrollCallback +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf import org.koitharu.kotatsu.databinding.FragmentChaptersBinding import org.koitharu.kotatsu.details.ui.adapter.ChaptersAdapter import org.koitharu.kotatsu.details.ui.adapter.ChaptersSelectionDecoration @@ -23,8 +25,6 @@ import org.koitharu.kotatsu.local.ui.LocalChaptersRemoveService import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState -import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf import kotlin.math.roundToInt class ChaptersFragment : @@ -37,17 +37,17 @@ class ChaptersFragment : private var chaptersAdapter: ChaptersAdapter? = null private var selectionController: ListSelectionController? = null - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentChaptersBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentChaptersBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) chaptersAdapter = ChaptersAdapter(this) selectionController = ListSelectionController( activity = requireActivity(), - decoration = ChaptersSelectionDecoration(view.context), + decoration = ChaptersSelectionDecoration(binding.root.context), registryOwner = this, callback = this, ) @@ -108,7 +108,7 @@ class ChaptersFragment : else -> { LocalChaptersRemoveService.start(requireContext(), manga, ids) Snackbar.make( - binding.recyclerViewChapters, + requireViewBinding().recyclerViewChapters, R.string.chapters_will_removed_background, Snackbar.LENGTH_LONG, ).show() @@ -185,7 +185,7 @@ class ChaptersFragment : } override fun onSelectionChanged(controller: ListSelectionController, count: Int) { - binding.recyclerViewChapters.invalidateItemDecorations() + requireViewBinding().recyclerViewChapters.invalidateItemDecorations() } override fun onWindowInsetsChanged(insets: Insets) = Unit @@ -196,7 +196,10 @@ class ChaptersFragment : val position = list.indexOfFirst { it.hasFlag(ChapterListItem.FLAG_CURRENT) } - 1 if (position > 0) { val offset = (resources.getDimensionPixelSize(R.dimen.chapter_list_item_height) * 0.6).roundToInt() - adapter.setItems(list, RecyclerViewScrollCallback(binding.recyclerViewChapters, position, offset)) + adapter.setItems( + list, + RecyclerViewScrollCallback(requireViewBinding().recyclerViewChapters, position, offset), + ) } else { adapter.items = list } @@ -206,6 +209,6 @@ class ChaptersFragment : } private fun onLoadingStateChanged(isLoading: Boolean) { - binding.progressBar.isVisible = isLoading + requireViewBinding().progressBar.isVisible = isLoading } } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index b2c3e08ae..0a97180c6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -24,14 +24,17 @@ import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaIntent -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.dialog.RecyclerViewAlertDialog -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.widgets.BottomSheetHeaderBar import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.os.ShortcutsUpdater +import org.koitharu.kotatsu.core.parser.MangaIntent +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.dialog.RecyclerViewAlertDialog +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.widgets.BottomSheetHeaderBar +import org.koitharu.kotatsu.core.util.ViewBadge +import org.koitharu.kotatsu.core.util.ext.setNavigationBarTransparentCompat +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ActivityDetailsBinding import org.koitharu.kotatsu.details.service.MangaPrefetchService import org.koitharu.kotatsu.details.ui.adapter.branchAD @@ -44,9 +47,6 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.thumbnails.PagesThumbnailsSheet -import org.koitharu.kotatsu.utils.ViewBadge -import org.koitharu.kotatsu.utils.ext.setNavigationBarTransparentCompat -import org.koitharu.kotatsu.utils.ext.textAndVisible import javax.inject.Inject @AndroidEntryPoint @@ -59,7 +59,7 @@ class DetailsActivity : PopupMenu.OnMenuItemClickListener { override val bsHeader: BottomSheetHeaderBar? - get() = binding.headerChapters + get() = viewBinding.headerChapters @Inject lateinit var shortcutsUpdater: ShortcutsUpdater @@ -76,16 +76,16 @@ class DetailsActivity : setDisplayHomeAsUpEnabled(true) setDisplayShowTitleEnabled(false) } - binding.buttonRead.setOnClickListener(this) - binding.buttonRead.setOnLongClickListener(this) - binding.buttonDropdown.setOnClickListener(this) - viewBadge = ViewBadge(binding.buttonRead, this) + viewBinding.buttonRead.setOnClickListener(this) + viewBinding.buttonRead.setOnLongClickListener(this) + viewBinding.buttonDropdown.setOnClickListener(this) + viewBadge = ViewBadge(viewBinding.buttonRead, this) - chaptersMenuProvider = if (binding.layoutBottom != null) { - val bsMediator = ChaptersBottomSheetMediator(checkNotNull(binding.layoutBottom)) + chaptersMenuProvider = if (viewBinding.layoutBottom != null) { + val bsMediator = ChaptersBottomSheetMediator(checkNotNull(viewBinding.layoutBottom)) actionModeDelegate.addListener(bsMediator) - checkNotNull(binding.headerChapters).addOnExpansionChangeListener(bsMediator) - checkNotNull(binding.headerChapters).addOnLayoutChangeListener(bsMediator) + checkNotNull(viewBinding.headerChapters).addOnExpansionChangeListener(bsMediator) + checkNotNull(viewBinding.headerChapters).addOnLayoutChangeListener(bsMediator) onBackPressedDispatcher.addCallback(bsMediator) ChaptersMenuProvider(viewModel, bsMediator) } else { @@ -98,7 +98,7 @@ class DetailsActivity : viewModel.onError.observe( this, SnackbarErrorObserver( - host = binding.containerDetails, + host = viewBinding.containerDetails, fragment = null, resolver = exceptionResolver, onResolved = { isResolved -> @@ -113,30 +113,30 @@ class DetailsActivity : } viewModel.historyInfo.observe(this, ::onHistoryChanged) viewModel.selectedBranchName.observe(this) { - binding.headerChapters?.subtitle = it - binding.textViewSubtitle?.textAndVisible = it + viewBinding.headerChapters?.subtitle = it + viewBinding.textViewSubtitle?.textAndVisible = it } viewModel.isChaptersReversed.observe(this) { - binding.headerChapters?.invalidateMenu() ?: invalidateOptionsMenu() + viewBinding.headerChapters?.invalidateMenu() ?: invalidateOptionsMenu() } viewModel.favouriteCategories.observe(this) { invalidateOptionsMenu() } viewModel.branches.observe(this) { - binding.buttonDropdown.isVisible = it.size > 1 + viewBinding.buttonDropdown.isVisible = it.size > 1 } viewModel.chapters.observe(this, PrefetchObserver(this)) - viewModel.onDownloadStarted.observe(this, DownloadStartedObserver(binding.containerDetails)) + viewModel.onDownloadStarted.observe(this, DownloadStartedObserver(viewBinding.containerDetails)) addMenuProvider( DetailsMenuProvider( activity = this, viewModel = viewModel, - snackbarHost = binding.containerChapters, + snackbarHost = viewBinding.containerChapters, shortcutsUpdater = shortcutsUpdater, ), ) - binding.headerChapters?.addOnExpansionChangeListener(this) ?: addMenuProvider(chaptersMenuProvider) + viewBinding.headerChapters?.addOnExpansionChangeListener(this) ?: addMenuProvider(chaptersMenuProvider) } override fun onClick(v: View) { @@ -189,16 +189,16 @@ class DetailsActivity : } else { headerBar.removeMenuProvider(chaptersMenuProvider) } - binding.buttonRead.isGone = isExpanded + viewBinding.buttonRead.isGone = isExpanded } private fun onMangaUpdated(manga: Manga) { title = manga.title val hasChapters = !manga.chapters.isNullOrEmpty() - binding.buttonRead.isEnabled = hasChapters + viewBinding.buttonRead.isEnabled = hasChapters invalidateOptionsMenu() showBottomSheet(manga.chapters != null) - binding.groupHeader?.isVisible = hasChapters + viewBinding.groupHeader?.isVisible = hasChapters } private fun onMangaRemoved(manga: Manga) { @@ -211,17 +211,17 @@ class DetailsActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) if (insets.bottom > 0) { - window.setNavigationBarTransparentCompat(this, binding.layoutBottom?.elevation ?: 0f, 0.9f) + window.setNavigationBarTransparentCompat(this, viewBinding.layoutBottom?.elevation ?: 0f, 0.9f) } } private fun onHistoryChanged(info: HistoryInfo) { - with(binding.buttonRead) { + with(viewBinding.buttonRead) { if (info.history != null) { setText(R.string._continue) setIconResource(if (info.isIncognitoMode) R.drawable.ic_incognito else R.drawable.ic_play) @@ -236,8 +236,8 @@ class DetailsActivity : info.totalChapters == 0 -> getString(R.string.no_chapters) else -> resources.getQuantityString(R.plurals.chapters, info.totalChapters, info.totalChapters) } - binding.headerChapters?.title = text - binding.textViewTitle?.text = text + viewBinding.headerChapters?.title = text + viewBinding.textViewTitle?.text = text } private fun onNewChaptersChanged(newChapters: Int) { @@ -307,22 +307,22 @@ class DetailsActivity : } } - private fun isTabletLayout() = binding.layoutBottom == null + private fun isTabletLayout() = viewBinding.layoutBottom == null private fun showBottomSheet(isVisible: Boolean) { - val view = binding.layoutBottom ?: return + val view = viewBinding.layoutBottom ?: return if (view.isVisible == isVisible) return val transition = Slide(Gravity.BOTTOM) transition.addTarget(view) transition.interpolator = AccelerateDecelerateInterpolator() - TransitionManager.beginDelayedTransition(binding.root as ViewGroup, transition) + TransitionManager.beginDelayedTransition(viewBinding.root as ViewGroup, transition) view.isVisible = isVisible } private fun makeSnackbar(text: CharSequence, @BaseTransientBottomBar.Duration duration: Int): Snackbar { - val sb = Snackbar.make(binding.containerDetails, text, duration) - if (binding.layoutBottom?.isVisible == true) { - sb.anchorView = binding.headerChapters + val sb = Snackbar.make(viewBinding.containerDetails, text, duration) + if (viewBinding.layoutBottom?.isVisible == true) { + sb.anchorView = viewBinding.headerChapters } return sb } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index f8ed4aa69..875e7fb7a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -19,14 +19,24 @@ import coil.util.CoilUtils import com.google.android.material.chip.Chip import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration -import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.adapter.BookmarksAdapter import org.koitharu.kotatsu.core.model.countChaptersByBranch import org.koitharu.kotatsu.core.parser.MangaTagHighlighter +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.image.CoverSizeResolver +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.util.FileSize +import org.koitharu.kotatsu.core.util.ext.crossfade +import org.koitharu.kotatsu.core.util.ext.drawableTop +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty +import org.koitharu.kotatsu.core.util.ext.measureHeight +import org.koitharu.kotatsu.core.util.ext.resolveDp +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.FragmentDetailsBinding import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.HistoryInfo @@ -43,16 +53,6 @@ import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.search.ui.MangaListActivity import org.koitharu.kotatsu.search.ui.SearchActivity -import org.koitharu.kotatsu.utils.FileSize -import org.koitharu.kotatsu.utils.ext.crossfade -import org.koitharu.kotatsu.utils.ext.drawableTop -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.ifNullOrEmpty -import org.koitharu.kotatsu.utils.ext.measureHeight -import org.koitharu.kotatsu.utils.ext.resolveDp -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf -import org.koitharu.kotatsu.utils.ext.textAndVisible -import org.koitharu.kotatsu.utils.image.CoverSizeResolver import javax.inject.Inject @AndroidEntryPoint @@ -70,13 +70,13 @@ class DetailsFragment : private val viewModel by activityViewModels() - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentDetailsBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentDetailsBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) binding.textViewAuthor.setOnClickListener(this) binding.imageViewCover.setOnClickListener(this) binding.infoLayout.textViewSource.setOnClickListener(this) @@ -114,7 +114,7 @@ class DetailsFragment : } private fun onMangaUpdated(manga: Manga) { - with(binding) { + with(requireViewBinding()) { // Main loadCover(manga) textViewTitle.text = manga.title @@ -159,7 +159,7 @@ class DetailsFragment : } private fun onChaptersChanged(chapters: List?) { - val infoLayout = binding.infoLayout + val infoLayout = requireViewBinding().infoLayout if (chapters.isNullOrEmpty()) { infoLayout.textViewChapters.isVisible = false } else { @@ -171,14 +171,14 @@ class DetailsFragment : private fun onDescriptionChanged(description: CharSequence?) { if (description.isNullOrBlank()) { - binding.textViewDescription.setText(R.string.no_description) + requireViewBinding().textViewDescription.setText(R.string.no_description) } else { - binding.textViewDescription.text = description + requireViewBinding().textViewDescription.text = description } } private fun onLocalSizeChanged(size: Long) { - val textView = binding.infoLayout.textViewSize + val textView = requireViewBinding().infoLayout.textViewSize if (size == 0L) { textView.isVisible = false } else { @@ -188,41 +188,41 @@ class DetailsFragment : } private fun onHistoryChanged(history: HistoryInfo) { - binding.progressView.setPercent(history.history?.percent ?: PROGRESS_NONE, animate = true) + requireViewBinding().progressView.setPercent(history.history?.percent ?: PROGRESS_NONE, animate = true) } private fun onLoadingStateChanged(isLoading: Boolean) { if (isLoading) { - binding.progressBar.show() + requireViewBinding().progressBar.show() } else { - binding.progressBar.hide() + requireViewBinding().progressBar.hide() } } private fun onBookmarksChanged(bookmarks: List) { - var adapter = binding.recyclerViewBookmarks.adapter as? BookmarksAdapter - binding.groupBookmarks.isGone = bookmarks.isEmpty() + var adapter = requireViewBinding().recyclerViewBookmarks.adapter as? BookmarksAdapter + requireViewBinding().groupBookmarks.isGone = bookmarks.isEmpty() if (adapter != null) { adapter.items = bookmarks } else { adapter = BookmarksAdapter(coil, viewLifecycleOwner, this) adapter.items = bookmarks - binding.recyclerViewBookmarks.adapter = adapter + requireViewBinding().recyclerViewBookmarks.adapter = adapter val spacing = resources.getDimensionPixelOffset(R.dimen.bookmark_list_spacing) - binding.recyclerViewBookmarks.addItemDecoration(SpacingItemDecoration(spacing)) + requireViewBinding().recyclerViewBookmarks.addItemDecoration(SpacingItemDecoration(spacing)) } } private fun onScrobblingInfoChanged(scrobblings: List) { - var adapter = binding.recyclerViewScrobbling.adapter as? ScrollingInfoAdapter - binding.recyclerViewScrobbling.isGone = scrobblings.isEmpty() + var adapter = requireViewBinding().recyclerViewScrobbling.adapter as? ScrollingInfoAdapter + requireViewBinding().recyclerViewScrobbling.isGone = scrobblings.isEmpty() if (adapter != null) { adapter.items = scrobblings } else { adapter = ScrollingInfoAdapter(viewLifecycleOwner, coil, childFragmentManager) adapter.items = scrobblings - binding.recyclerViewScrobbling.adapter = adapter - binding.recyclerViewScrobbling.addItemDecoration(ScrobblingItemDecoration()) + requireViewBinding().recyclerViewScrobbling.adapter = adapter + requireViewBinding().recyclerViewScrobbling.addItemDecoration(ScrobblingItemDecoration()) } } @@ -267,7 +267,7 @@ class DetailsFragment : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + requireViewBinding().root.updatePadding( bottom = ( (activity as? NoModalBottomSheetOwner)?.bsHeader?.measureHeight() ?.plus(insets.bottom)?.plus(resources.resolveDp(16)) @@ -277,7 +277,7 @@ class DetailsFragment : } private fun bindTags(manga: Manga) { - binding.chipsTags.setChips( + requireViewBinding().chipsTags.setChips( manga.tags.map { tag -> ChipsView.ChipModel( title = tag.title, @@ -292,13 +292,13 @@ class DetailsFragment : private fun loadCover(manga: Manga) { val imageUrl = manga.largeCoverUrl.ifNullOrEmpty { manga.coverUrl } - val lastResult = CoilUtils.result(binding.imageViewCover) + val lastResult = CoilUtils.result(requireViewBinding().imageViewCover) if (lastResult?.request?.data == imageUrl) { return } val request = ImageRequest.Builder(context ?: return) - .target(binding.imageViewCover) - .size(CoverSizeResolver(binding.imageViewCover)) + .target(requireViewBinding().imageViewCover) + .size(CoverSizeResolver(requireViewBinding().imageViewCover)) .data(imageUrl) .tag(manga.source) .crossfade(requireContext()) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt index 73ff6a880..0f20ad3e0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.launch import org.koitharu.kotatsu.R import org.koitharu.kotatsu.browser.BrowserActivity import org.koitharu.kotatsu.core.os.ShortcutsUpdater +import org.koitharu.kotatsu.core.util.ShareHelper import org.koitharu.kotatsu.details.ui.model.MangaBranch import org.koitharu.kotatsu.favourites.ui.categories.select.FavouriteCategoriesBottomSheet import org.koitharu.kotatsu.parsers.model.Manga @@ -23,7 +24,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.mapNotNullToSet import org.koitharu.kotatsu.scrobbling.common.ui.selector.ScrobblingSelectorBottomSheet import org.koitharu.kotatsu.search.ui.multi.MultiSearchActivity -import org.koitharu.kotatsu.utils.ShareHelper class DetailsMenuProvider( private val activity: FragmentActivity, diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index ecb76143b..69f666b20 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -28,11 +28,15 @@ import kotlinx.coroutines.flow.transformLatest import kotlinx.coroutines.launch import kotlinx.coroutines.plus import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.computeSize +import org.koitharu.kotatsu.core.util.ext.toFileOrNull import org.koitharu.kotatsu.details.domain.BranchComparator import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.HistoryInfo @@ -45,16 +49,12 @@ import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.computeSize -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.toFileOrNull +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.IOException import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt index b0072f4a8..c866a2c52 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt @@ -4,10 +4,10 @@ import androidx.lifecycle.SavedStateHandle import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import org.koitharu.kotatsu.base.domain.MangaDataRepository -import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.core.model.getPreferredBranch +import org.koitharu.kotatsu.core.parser.MangaDataRepository +import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.toListItem @@ -17,8 +17,8 @@ import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @ViewModelScoped diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchAD.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchAD.kt index 5e11ad8d2..d471a5c0b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchAD.kt @@ -7,11 +7,11 @@ import android.text.style.RelativeSizeSpan import androidx.core.text.buildSpannedString import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.databinding.ItemCheckableNewBinding import org.koitharu.kotatsu.details.ui.model.MangaBranch -import org.koitharu.kotatsu.utils.ext.getThemeColor fun branchAD( clickListener: OnListItemClickListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchesAdapter.kt index cc3f73f73..add2a583f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/BranchesAdapter.kt @@ -1,7 +1,7 @@ package org.koitharu.kotatsu.details.ui.adapter import com.hannesdorfmann.adapterdelegates4.ListDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.details.ui.model.MangaBranch class BranchesAdapter( diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChapterListItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChapterListItemAD.kt index ab051c176..ea7dcdd54 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChapterListItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChapterListItemAD.kt @@ -3,8 +3,10 @@ package org.koitharu.kotatsu.details.ui.adapter import androidx.core.view.isVisible import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.getThemeColor +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemChapterBinding import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_CURRENT @@ -12,13 +14,11 @@ import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_DOWN import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_MISSING import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_NEW import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_UNREAD -import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.textAndVisible fun chapterListItemAD( clickListener: OnListItemClickListener, ) = adapterDelegateViewBinding( - { inflater, parent -> ItemChapterBinding.inflate(inflater, parent, false) } + { inflater, parent -> ItemChapterBinding.inflate(inflater, parent, false) }, ) { val eventListener = AdapterDelegateClickListenerAdapter(this, clickListener) @@ -36,10 +36,12 @@ fun chapterListItemAD( binding.textViewNumber.setBackgroundResource(R.drawable.bg_badge_default) binding.textViewNumber.setTextColor(context.getThemeColor(com.google.android.material.R.attr.colorOnTertiary)) } + FLAG_CURRENT -> { binding.textViewNumber.setBackgroundResource(R.drawable.bg_badge_accent) binding.textViewNumber.setTextColor(context.getThemeColor(android.R.attr.textColorPrimaryInverse)) } + else -> { binding.textViewNumber.setBackgroundResource(R.drawable.bg_badge_outline) binding.textViewNumber.setTextColor(context.getThemeColor(android.R.attr.textColorTertiary)) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersAdapter.kt index 7b91abef5..d1de826d9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersAdapter.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.details.ui.adapter import android.content.Context import androidx.recyclerview.widget.DiffUtil import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.fastscroll.FastScroller +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller import org.koitharu.kotatsu.details.ui.model.ChapterListItem import kotlin.jvm.internal.Intrinsics diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersSelectionDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersSelectionDecoration.kt index 469ae6514..505de1c4b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersSelectionDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/adapter/ChaptersSelectionDecoration.kt @@ -8,9 +8,9 @@ import android.graphics.RectF import android.view.View import androidx.core.graphics.ColorUtils import androidx.recyclerview.widget.RecyclerView +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.util.ext.getThemeColor import com.google.android.material.R as materialR -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration -import org.koitharu.kotatsu.utils.ext.getThemeColor class ChaptersSelectionDecoration(context: Context) : AbstractSelectionItemDecoration() { diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt index 93f32add9..7b73a0277 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoAD.kt @@ -5,11 +5,11 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest import org.koitharu.kotatsu.databinding.ItemScrobblingInfoBinding import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest fun scrobblingInfoAD( lifecycleOwner: LifecycleOwner, diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt index dfaae62fd..96950f5ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt @@ -17,18 +17,18 @@ import androidx.fragment.app.activityViewModels import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.SheetScrobblingBinding import org.koitharu.kotatsu.details.ui.DetailsViewModel import org.koitharu.kotatsu.image.ui.ImageActivity import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus import org.koitharu.kotatsu.scrobbling.common.ui.selector.ScrobblingSelectorBottomSheet -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf -import org.koitharu.kotatsu.utils.ext.withArgs import javax.inject.Inject @AndroidEntryPoint @@ -52,15 +52,16 @@ class ScrobblingInfoBottomSheet : scrobblerIndex = requireArguments().getInt(ARG_INDEX, scrobblerIndex) } - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingBinding { return SheetScrobblingBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetScrobblingBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) viewModel.scrobblingInfo.observe(viewLifecycleOwner, ::onScrobblingInfoChanged) viewModel.onError.observe(viewLifecycleOwner) { - Toast.makeText(view.context, it.getDisplayMessage(view.resources), Toast.LENGTH_SHORT).show() + Toast.makeText(binding.root.context, it.getDisplayMessage(binding.root.resources), Toast.LENGTH_SHORT) + .show() } binding.spinnerStatus.onItemSelectedListener = this @@ -69,7 +70,7 @@ class ScrobblingInfoBottomSheet : binding.imageViewCover.setOnClickListener(this) binding.textViewDescription.movementMethod = LinkMovementMethod.getInstance() - menu = PopupMenu(view.context, binding.buttonMenu).apply { + menu = PopupMenu(binding.root.context, binding.buttonMenu).apply { inflate(R.menu.opt_scrobbling) setOnMenuItemClickListener(this@ScrobblingInfoBottomSheet) } @@ -83,7 +84,7 @@ class ScrobblingInfoBottomSheet : override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { viewModel.updateScrobbling( index = scrobblerIndex, - rating = binding.ratingBar.rating / binding.ratingBar.numStars, + rating = requireViewBinding().ratingBar.rating / requireViewBinding().ratingBar.numStars, status = enumValues().getOrNull(position), ) } @@ -95,7 +96,7 @@ class ScrobblingInfoBottomSheet : viewModel.updateScrobbling( index = scrobblerIndex, rating = rating / ratingBar.numStars, - status = enumValues().getOrNull(binding.spinnerStatus.selectedItemPosition), + status = enumValues().getOrNull(requireViewBinding().spinnerStatus.selectedItemPosition), ) } } @@ -117,13 +118,13 @@ class ScrobblingInfoBottomSheet : dismissAllowingStateLoss() return } - binding.textViewTitle.text = scrobbling.title - binding.ratingBar.rating = scrobbling.rating * binding.ratingBar.numStars - binding.textViewDescription.text = scrobbling.description - binding.spinnerStatus.setSelection(scrobbling.status?.ordinal ?: -1) - binding.imageViewLogo.contentDescription = getString(scrobbling.scrobbler.titleResId) - binding.imageViewLogo.setImageResource(scrobbling.scrobbler.iconResId) - binding.imageViewCover.newImageRequest(viewLifecycleOwner, scrobbling.coverUrl)?.apply { + requireViewBinding().textViewTitle.text = scrobbling.title + requireViewBinding().ratingBar.rating = scrobbling.rating * requireViewBinding().ratingBar.numStars + requireViewBinding().textViewDescription.text = scrobbling.description + requireViewBinding().spinnerStatus.setSelection(scrobbling.status?.ordinal ?: -1) + requireViewBinding().imageViewLogo.contentDescription = getString(scrobbling.scrobbler.titleResId) + requireViewBinding().imageViewLogo.setImageResource(scrobbling.scrobbler.iconResId) + requireViewBinding().imageViewCover.newImageRequest(viewLifecycleOwner, scrobbling.coverUrl)?.apply { placeholder(R.drawable.ic_placeholder) fallback(R.drawable.ic_placeholder) error(R.drawable.ic_error_placeholder) diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemAD.kt index 7517cb0d1..e2150152a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemAD.kt @@ -7,14 +7,14 @@ import androidx.work.WorkInfo import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemDownloadBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.util.format -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.ext.textAndVisible fun downloadItemAD( lifecycleOwner: LifecycleOwner, diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemListener.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemListener.kt index c4dd45699..d72a541c2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadItemListener.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.download.ui.list -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener interface DownloadItemListener : OnListItemClickListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsActivity.kt index ddc1e9154..6fb8ecb9d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsActivity.kt @@ -15,10 +15,10 @@ import androidx.lifecycle.Observer import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.list.ListSelectionController -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration -import org.koitharu.kotatsu.base.ui.util.ReversibleActionObserver +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.util.ReversibleActionObserver import org.koitharu.kotatsu.databinding.ActivityDownloadsBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.download.ui.worker.PausingReceiver @@ -51,7 +51,7 @@ class DownloadsActivity : BaseActivity(), registryOwner = this, callback = this, ) - with(binding.recyclerView) { + with(viewBinding.recyclerView) { setHasFixedSize(true) addItemDecoration(decoration) adapter = downloadsAdapter @@ -61,7 +61,7 @@ class DownloadsActivity : BaseActivity(), viewModel.items.observe(this) { downloadsAdapter.items = it } - viewModel.onActionDone.observe(this, ReversibleActionObserver(binding.recyclerView)) + viewModel.onActionDone.observe(this, ReversibleActionObserver(viewBinding.recyclerView)) val menuObserver = Observer { _ -> invalidateOptionsMenu() } viewModel.hasActiveWorks.observe(this, menuObserver) viewModel.hasPausedWorks.observe(this, menuObserver) @@ -69,12 +69,12 @@ class DownloadsActivity : BaseActivity(), } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + viewBinding.recyclerView.updatePadding( left = insets.left + listSpacing, right = insets.right + listSpacing, bottom = insets.bottom, ) - binding.toolbar.updatePadding( + viewBinding.toolbar.updatePadding( left = insets.left, right = insets.right, ) @@ -104,7 +104,7 @@ class DownloadsActivity : BaseActivity(), } override fun onSelectionChanged(controller: ListSelectionController, count: Int) { - binding.recyclerView.invalidateItemDecorations() + viewBinding.recyclerView.invalidateItemDecorations() } override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean { diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsAdapter.kt index 2778efdc4..16fa29387 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsAdapter.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD import org.koitharu.kotatsu.list.ui.adapter.relatedDateItemAD diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsSelectionDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsSelectionDecoration.kt index 0ca62de1b..eb47bc515 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsSelectionDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsSelectionDecoration.kt @@ -12,9 +12,9 @@ import androidx.core.graphics.ColorUtils import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.NO_ID import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration -import org.koitharu.kotatsu.utils.ext.getItem -import org.koitharu.kotatsu.utils.ext.getThemeColor +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.util.ext.getItem +import org.koitharu.kotatsu.core.util.ext.getThemeColor import com.google.android.material.R as materialR class DownloadsSelectionDecoration(context: Context) : AbstractSelectionItemDecoration() { diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt index cdcf5c4db..fb6e455ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/list/DownloadsViewModel.kt @@ -16,10 +16,13 @@ import kotlinx.coroutines.plus import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaDataRepository -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.util.ReversibleAction -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.parser.MangaDataRepository +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.daysDiff import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -27,9 +30,6 @@ import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.util.mapToSet -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.daysDiff import java.util.Date import java.util.UUID import java.util.concurrent.TimeUnit diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadNotificationFactory.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadNotificationFactory.kt index 21f57cf3d..d7985849c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadNotificationFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadNotificationFactory.kt @@ -23,6 +23,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.getDrawableOrThrow import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.download.ui.list.DownloadsActivity @@ -31,8 +32,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.format import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.search.ui.MangaListActivity -import org.koitharu.kotatsu.utils.ext.getDrawableOrThrow -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.util.UUID import com.google.android.material.R as materialR diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadStartedObserver.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadStartedObserver.kt index 69453b711..10dbb2292 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadStartedObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadStartedObserver.kt @@ -4,9 +4,9 @@ import android.view.View import androidx.lifecycle.Observer import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.findActivity import org.koitharu.kotatsu.download.ui.list.DownloadsActivity import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner -import org.koitharu.kotatsu.utils.ext.findActivity class DownloadStartedObserver( private val snackbarHost: View, diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt index 49c285fa1..bb26b9614 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt @@ -35,10 +35,17 @@ import okio.IOException import okio.buffer import okio.sink import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.core.network.CommonHeaders +import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.Throttler +import org.koitharu.kotatsu.core.util.WorkManagerHelper +import org.koitharu.kotatsu.core.util.ext.deleteAwait +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty +import org.koitharu.kotatsu.core.util.ext.writeAllCancellable +import org.koitharu.kotatsu.core.util.progress.TimeLeftEstimator import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.local.data.LocalManga import org.koitharu.kotatsu.local.data.LocalStorageChanges @@ -51,15 +58,8 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.parsers.util.mapToSet -import org.koitharu.kotatsu.utils.Throttler -import org.koitharu.kotatsu.utils.WorkManagerHelper -import org.koitharu.kotatsu.utils.ext.deleteAwait -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.ifNullOrEmpty -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.writeAllCancellable -import org.koitharu.kotatsu.utils.progress.TimeLeftEstimator +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import java.util.UUID import java.util.concurrent.TimeUnit diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/PausingReceiver.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/PausingReceiver.kt index 353911801..71dc7aa4c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/PausingReceiver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/worker/PausingReceiver.kt @@ -7,7 +7,7 @@ import android.content.IntentFilter import android.net.Uri import android.os.PatternMatcher import androidx.core.app.PendingIntentCompat -import org.koitharu.kotatsu.utils.ext.toUUIDOrNull +import org.koitharu.kotatsu.core.util.ext.toUUIDOrNull import java.util.UUID class PausingReceiver( diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/domain/ExploreRepository.kt b/app/src/main/java/org/koitharu/kotatsu/explore/domain/ExploreRepository.kt index 5fbce6f56..e3ea1c156 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/domain/ExploreRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/domain/ExploreRepository.kt @@ -2,14 +2,14 @@ package org.koitharu.kotatsu.explore.domain import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.almostEquals +import org.koitharu.kotatsu.core.util.ext.asArrayList import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.suggestions.domain.TagsBlacklist -import org.koitharu.kotatsu.utils.ext.almostEquals -import org.koitharu.kotatsu.utils.ext.asArrayList -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject class ExploreRepository @Inject constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt index 618dc4763..d0159e851 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt @@ -16,14 +16,15 @@ import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.dialog.TwoButtonsAlertDialog -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner -import org.koitharu.kotatsu.base.ui.util.ReversibleActionObserver -import org.koitharu.kotatsu.base.ui.util.SpanSizeResolver import org.koitharu.kotatsu.bookmarks.ui.BookmarksActivity import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.dialog.TwoButtonsAlertDialog +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.ui.util.ReversibleActionObserver +import org.koitharu.kotatsu.core.ui.util.SpanSizeResolver +import org.koitharu.kotatsu.core.util.ext.addMenuProvider import org.koitharu.kotatsu.databinding.FragmentExploreBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.explore.ui.adapter.ExploreAdapter @@ -36,7 +37,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.search.ui.MangaListActivity import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.suggestions.ui.SuggestionsActivity -import org.koitharu.kotatsu.utils.ext.addMenuProvider import javax.inject.Inject @AndroidEntryPoint @@ -54,14 +54,14 @@ class ExploreFragment : private var paddingHorizontal = 0 override val recyclerView: RecyclerView - get() = binding.recyclerView + get() = requireViewBinding().recyclerView - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): FragmentExploreBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentExploreBinding { return FragmentExploreBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentExploreBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) exploreAdapter = ExploreAdapter(coil, viewLifecycleOwner, this, this) with(binding.recyclerView) { adapter = exploreAdapter @@ -70,7 +70,7 @@ class ExploreFragment : val spacing = resources.getDimensionPixelOffset(R.dimen.list_spacing) paddingHorizontal = spacing } - addMenuProvider(ExploreMenuProvider(view.context, viewModel)) + addMenuProvider(ExploreMenuProvider(binding.root.context, viewModel)) viewModel.content.observe(viewLifecycleOwner) { exploreAdapter?.items = it } @@ -89,7 +89,7 @@ class ExploreFragment : } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + requireViewBinding().recyclerView.updatePadding( bottom = insets.bottom, ) } @@ -138,7 +138,7 @@ class ExploreFragment : } private fun onGridModeChanged(isGrid: Boolean) { - binding.recyclerView.layoutManager = if (isGrid) { + requireViewBinding().recyclerView.layoutManager = if (isGrid) { GridLayoutManager(requireContext(), 4).also { lm -> lm.spanSizeLookup = ExploreGridSpanSizeLookup(checkNotNull(exploreAdapter), lm) } diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreViewModel.kt index d81472ba3..6ee8eb2b8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreViewModel.kt @@ -13,17 +13,17 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.plus import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.ReversibleHandle -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsStateFlow +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.ui.util.ReversibleHandle +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.explore.domain.ExploreRepository import org.koitharu.kotatsu.explore.ui.model.ExploreItem import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject private const val TIP_SUGGESTIONS = "suggestions" diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapter.kt index 51f5ccc13..f8386cda1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapter.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.explore.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.explore.ui.model.ExploreItem class ExploreAdapter( diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt index a502d6931..bccedb039 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/ui/adapter/ExploreAdapterDelegates.kt @@ -7,9 +7,15 @@ import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.parser.favicon.faviconUri +import org.koitharu.kotatsu.core.ui.image.FaviconFallbackDrawable +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemEmptyCardBinding import org.koitharu.kotatsu.databinding.ItemExploreButtonsBinding import org.koitharu.kotatsu.databinding.ItemExploreSourceGridBinding @@ -17,12 +23,6 @@ import org.koitharu.kotatsu.databinding.ItemExploreSourceListBinding import org.koitharu.kotatsu.databinding.ItemHeaderButtonBinding import org.koitharu.kotatsu.explore.ui.model.ExploreItem import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.setTextAndVisible -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable fun exploreButtonsAD( clickListener: View.OnClickListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt index 72fb8d48c..e99653964 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt @@ -7,12 +7,13 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map -import org.koitharu.kotatsu.base.domain.ReversibleHandle import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.SortOrder import org.koitharu.kotatsu.core.db.entity.toEntities import org.koitharu.kotatsu.core.db.entity.toEntity import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.util.ReversibleHandle +import org.koitharu.kotatsu.core.util.ext.mapItems import org.koitharu.kotatsu.favourites.data.FavouriteCategoryEntity import org.koitharu.kotatsu.favourites.data.FavouriteEntity import org.koitharu.kotatsu.favourites.data.toFavouriteCategory @@ -21,7 +22,6 @@ import org.koitharu.kotatsu.favourites.data.toMangaList import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.tracker.work.TrackerNotificationChannels -import org.koitharu.kotatsu.utils.ext.mapItems import javax.inject.Inject @Reusable diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesActivity.kt index 3118a4618..dd275369d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesActivity.kt @@ -8,12 +8,11 @@ import androidx.core.view.updatePadding import androidx.fragment.app.commit import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivityContainerBinding import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment.Companion.NO_ID -import kotlin.text.Typography.dagger @AndroidEntryPoint class FavouritesActivity : BaseActivity() { @@ -37,7 +36,7 @@ class FavouritesActivity : BaseActivity() { } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionCallback.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionCallback.kt index c6cbd4be7..c62b36b1c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionCallback.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionCallback.kt @@ -6,7 +6,7 @@ import androidx.appcompat.view.ActionMode import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.ListSelectionController import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity import com.google.android.material.R as materialR @@ -41,10 +41,12 @@ class CategoriesSelectionCallback( mode.finish() true } + R.id.action_remove -> { confirmDeleteCategories(controller.snapshot(), mode) true } + else -> false } } @@ -61,4 +63,4 @@ class CategoriesSelectionCallback( mode.finish() }.show() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionDecoration.kt index ebeaf648a..3ee6833f0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesSelectionDecoration.kt @@ -9,10 +9,10 @@ import android.view.View import androidx.core.graphics.ColorUtils import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.util.ext.getItem +import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.favourites.ui.categories.adapter.CategoryListModel -import org.koitharu.kotatsu.utils.ext.getItem -import org.koitharu.kotatsu.utils.ext.getThemeColor import com.google.android.material.R as materialR class CategoriesSelectionDecoration(context: Context) : AbstractSelectionItemDecoration() { @@ -22,7 +22,7 @@ class CategoriesSelectionDecoration(context: Context) : AbstractSelectionItemDec private val strokeColor = context.getThemeColor(materialR.attr.colorPrimary, Color.RED) private val fillColor = ColorUtils.setAlphaComponent( ColorUtils.blendARGB(strokeColor, context.getThemeColor(materialR.attr.colorSurface), 0.8f), - 0x74 + 0x74, ) private val padding = context.resources.getDimension(R.dimen.grid_spacing_outer) @@ -54,4 +54,4 @@ class CategoriesSelectionDecoration(context: Context) : AbstractSelectionItemDec paint.style = Paint.Style.STROKE canvas.drawRoundRect(bounds, radius, radius, paint) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt index 3be5f542f..66901002d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt @@ -20,10 +20,11 @@ import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.list.ListSelectionController import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf import org.koitharu.kotatsu.databinding.ActivityCategoriesBinding import org.koitharu.kotatsu.favourites.ui.FavouritesActivity import org.koitharu.kotatsu.favourites.ui.categories.adapter.CategoriesAdapter @@ -31,7 +32,6 @@ import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEdit import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf import javax.inject.Inject @AndroidEntryPoint @@ -61,17 +61,17 @@ class FavouriteCategoriesActivity : activity = this, decoration = CategoriesSelectionDecoration(this), registryOwner = this, - callback = CategoriesSelectionCallback(binding.recyclerView, viewModel), + callback = CategoriesSelectionCallback(viewBinding.recyclerView, viewModel), ) - binding.buttonDone.setOnClickListener(this) - selectionController.attachToRecyclerView(binding.recyclerView) - binding.recyclerView.setHasFixedSize(true) - binding.recyclerView.adapter = adapter - binding.fabAdd.setOnClickListener(this) + viewBinding.buttonDone.setOnClickListener(this) + selectionController.attachToRecyclerView(viewBinding.recyclerView) + viewBinding.recyclerView.setHasFixedSize(true) + viewBinding.recyclerView.adapter = adapter + viewBinding.fabAdd.setOnClickListener(this) onBackPressedDispatcher.addCallback(exitReorderModeCallback) viewModel.detalizedCategories.observe(this, ::onCategoriesChanged) - viewModel.onError.observe(this, SnackbarErrorObserver(binding.recyclerView, null)) + viewModel.onError.observe(this, SnackbarErrorObserver(viewBinding.recyclerView, null)) viewModel.isInReorderMode.observe(this, ::onReorderModeChanged) } @@ -126,16 +126,16 @@ class FavouriteCategoriesActivity : override fun onEmptyActionClick() = Unit override fun onWindowInsetsChanged(insets: Insets) { - binding.fabAdd.updateLayoutParams { + viewBinding.fabAdd.updateLayoutParams { rightMargin = topMargin + insets.right leftMargin = topMargin + insets.left bottomMargin = topMargin + insets.bottom } - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) - binding.recyclerView.updatePadding( + viewBinding.recyclerView.updatePadding( bottom = insets.bottom, ) } @@ -149,21 +149,21 @@ class FavouriteCategoriesActivity : val transition = Fade().apply { duration = resources.getInteger(android.R.integer.config_shortAnimTime).toLong() } - TransitionManager.beginDelayedTransition(binding.toolbar, transition) + TransitionManager.beginDelayedTransition(viewBinding.toolbar, transition) reorderHelper?.attachToRecyclerView(null) reorderHelper = if (isReorderMode) { selectionController.clear() - binding.fabAdd.hide() + viewBinding.fabAdd.hide() ItemTouchHelper(ReorderHelperCallback()).apply { - attachToRecyclerView(binding.recyclerView) + attachToRecyclerView(viewBinding.recyclerView) } } else { - binding.fabAdd.show() + viewBinding.fabAdd.show() null } - binding.recyclerView.isNestedScrollingEnabled = !isReorderMode + viewBinding.recyclerView.isNestedScrollingEnabled = !isReorderMode invalidateOptionsMenu() - binding.buttonDone.isVisible = isReorderMode + viewBinding.buttonDone.isVisible = isReorderMode exitReorderModeCallback.isEnabled = isReorderMode } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt index 7819d0112..f85ff122e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt @@ -1,10 +1,10 @@ package org.koitharu.kotatsu.favourites.ui.categories import androidx.recyclerview.widget.RecyclerView -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener interface FavouriteCategoriesListListener : OnListItemClickListener { fun onDragHandleTouch(holder: RecyclerView.ViewHolder): Boolean -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt index 6c8d48798..e2057a28c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt @@ -8,15 +8,15 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.mapItems +import org.koitharu.kotatsu.core.util.ext.requireValue import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.categories.adapter.CategoryListModel import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.LoadingState -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.mapItems -import org.koitharu.kotatsu.utils.ext.requireValue import java.util.Collections import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt index d69ea5ec1..57d73ad5e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt @@ -15,14 +15,14 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.animatorDurationScale +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.getThemeColor +import org.koitharu.kotatsu.core.util.ext.newImageRequest import org.koitharu.kotatsu.databinding.ItemCategoryBinding import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesListListener import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.animatorDurationScale -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.newImageRequest fun categoryAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditActivity.kt index a9a99305b..d7980dfcb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditActivity.kt @@ -16,16 +16,16 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.util.DefaultTextWatcher import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.model.titleRes +import org.koitharu.kotatsu.core.ui.util.DefaultTextWatcher +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.getSerializableCompat +import org.koitharu.kotatsu.core.util.ext.setChecked import org.koitharu.kotatsu.databinding.ActivityCategoryEditBinding import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.getSerializableCompat -import org.koitharu.kotatsu.utils.ext.setChecked import com.google.android.material.R as materialR @AndroidEntryPoint @@ -46,16 +46,16 @@ class FavouritesCategoryEditActivity : setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } initSortSpinner() - binding.buttonDone.setOnClickListener(this) - binding.editName.addTextChangedListener(this) - afterTextChanged(binding.editName.text) + viewBinding.buttonDone.setOnClickListener(this) + viewBinding.editName.addTextChangedListener(this) + afterTextChanged(viewBinding.editName.text) viewModel.onSaved.observe(this) { finishAfterTransition() } viewModel.category.observe(this, ::onCategoryChanged) viewModel.isLoading.observe(this, ::onLoadingStateChanged) viewModel.onError.observe(this, ::onError) viewModel.isTrackerEnabled.observe(this) { - binding.switchTracker.isVisible = it + viewBinding.switchTracker.isVisible = it } } @@ -75,27 +75,27 @@ class FavouritesCategoryEditActivity : override fun onClick(v: View) { when (v.id) { R.id.button_done -> viewModel.save( - title = binding.editName.text?.toString()?.trim().orEmpty(), + title = viewBinding.editName.text?.toString()?.trim().orEmpty(), sortOrder = getSelectedSortOrder(), - isTrackerEnabled = binding.switchTracker.isChecked, - isVisibleOnShelf = binding.switchShelf.isChecked, + isTrackerEnabled = viewBinding.switchTracker.isChecked, + isVisibleOnShelf = viewBinding.switchShelf.isChecked, ) } } override fun afterTextChanged(s: Editable?) { - binding.buttonDone.isEnabled = !s.isNullOrBlank() + viewBinding.buttonDone.isEnabled = !s.isNullOrBlank() } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) - binding.scrollView.updatePadding( + viewBinding.scrollView.updatePadding( bottom = insets.bottom, ) - binding.toolbar.updateLayoutParams { + viewBinding.toolbar.updateLayoutParams { topMargin = insets.top } } @@ -109,40 +109,40 @@ class FavouritesCategoryEditActivity : if (selectedSortOrder != null) { return } - binding.editName.setText(category?.title) + viewBinding.editName.setText(category?.title) selectedSortOrder = category?.order val sortText = getString((category?.order ?: SortOrder.NEWEST).titleRes) - binding.editSort.setText(sortText, false) - binding.switchTracker.setChecked(category?.isTrackingEnabled ?: true, false) - binding.switchShelf.setChecked(category?.isVisibleInLibrary ?: true, false) + viewBinding.editSort.setText(sortText, false) + viewBinding.switchTracker.setChecked(category?.isTrackingEnabled ?: true, false) + viewBinding.switchShelf.setChecked(category?.isVisibleInLibrary ?: true, false) } private fun onError(e: Throwable) { - binding.textViewError.text = e.getDisplayMessage(resources) - binding.textViewError.isVisible = true + viewBinding.textViewError.text = e.getDisplayMessage(resources) + viewBinding.textViewError.isVisible = true } private fun onLoadingStateChanged(isLoading: Boolean) { - binding.editSort.isEnabled = !isLoading - binding.editName.isEnabled = !isLoading - binding.switchTracker.isEnabled = !isLoading - binding.switchShelf.isEnabled = !isLoading + viewBinding.editSort.isEnabled = !isLoading + viewBinding.editName.isEnabled = !isLoading + viewBinding.switchTracker.isEnabled = !isLoading + viewBinding.switchShelf.isEnabled = !isLoading if (isLoading) { - binding.textViewError.isVisible = false + viewBinding.textViewError.isVisible = false } } private fun initSortSpinner() { val entries = FavouriteCategoriesActivity.SORT_ORDERS.map { getString(it.titleRes) } val adapter = SortAdapter(this, entries) - binding.editSort.setAdapter(adapter) - binding.editSort.onItemClickListener = this + viewBinding.editSort.setAdapter(adapter) + viewBinding.editSort.onItemClickListener = this } private fun getSelectedSortOrder(): SortOrder { selectedSortOrder?.let { return it } val entries = FavouriteCategoriesActivity.SORT_ORDERS.map { getString(it.titleRes) } - val index = entries.indexOf(binding.editSort.text.toString()) + val index = entries.indexOf(viewBinding.editSort.text.toString()) return FavouriteCategoriesActivity.SORT_ORDERS.getOrNull(index) ?: SortOrder.NEWEST } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditViewModel.kt index 8e84a52c1..2677f1cd0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/edit/FavouritesCategoryEditViewModel.kt @@ -6,15 +6,15 @@ import androidx.lifecycle.liveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.ext.emitValue import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity.Companion.EXTRA_ID import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity.Companion.NO_ID import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.emitValue import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/FavouriteCategoriesBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/FavouriteCategoriesBottomSheet.kt index 93bf67e1d..2c9b5f4d5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/FavouriteCategoriesBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/FavouriteCategoriesBottomSheet.kt @@ -11,16 +11,16 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.SheetFavoriteCategoriesBinding import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity import org.koitharu.kotatsu.favourites.ui.categories.select.adapter.MangaCategoriesAdapter import org.koitharu.kotatsu.favourites.ui.categories.select.model.MangaCategoryItem import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.withArgs @AndroidEntryPoint class FavouriteCategoriesBottomSheet : @@ -33,13 +33,13 @@ class FavouriteCategoriesBottomSheet : private var adapter: MangaCategoriesAdapter? = null - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = SheetFavoriteCategoriesBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetFavoriteCategoriesBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) adapter = MangaCategoriesAdapter(this) binding.recyclerViewCategories.adapter = adapter binding.buttonDone.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/MangaCategoriesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/MangaCategoriesViewModel.kt index 791a79787..32a7f0f11 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/MangaCategoriesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/MangaCategoriesViewModel.kt @@ -5,13 +5,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.ids import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.categories.select.FavouriteCategoriesBottomSheet.Companion.KEY_MANGA_LIST import org.koitharu.kotatsu.favourites.ui.categories.select.model.MangaCategoryItem -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoriesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoriesAdapter.kt index df6e54ca0..351037748 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoriesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoriesAdapter.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.favourites.ui.categories.select.adapter import androidx.recyclerview.widget.DiffUtil import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.favourites.ui.categories.select.model.MangaCategoryItem class MangaCategoriesAdapter( @@ -34,4 +34,4 @@ class MangaCategoriesAdapter( return super.getChangePayload(oldItem, newItem) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoryAD.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoryAD.kt index c9ce1e8b2..3badc482b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoryAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/select/adapter/MangaCategoryAD.kt @@ -1,14 +1,14 @@ package org.koitharu.kotatsu.favourites.ui.categories.select.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.databinding.ItemCheckableNewBinding import org.koitharu.kotatsu.favourites.ui.categories.select.model.MangaCategoryItem fun mangaCategoryAD( clickListener: OnListItemClickListener ) = adapterDelegateViewBinding( - { inflater, parent -> ItemCheckableNewBinding.inflate(inflater, parent, false) } + { inflater, parent -> ItemCheckableNewBinding.inflate(inflater, parent, false) }, ) { itemView.setOnClickListener { @@ -21,4 +21,4 @@ fun mangaCategoryAD( isChecked = item.isChecked } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt index d37f33c56..77c128fe5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt @@ -9,13 +9,14 @@ import androidx.appcompat.widget.PopupMenu import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController -import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.model.titleRes +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.core.util.ext.withArgs +import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.addMenuProvider -import org.koitharu.kotatsu.utils.ext.withArgs @AndroidEntryPoint class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener { @@ -24,10 +25,10 @@ class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickLis override val isSwipeRefreshEnabled = false - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) if (viewModel.categoryId != NO_ID) { - addMenuProvider(FavouritesListMenuProvider(view.context, viewModel)) + addMenuProvider(FavouritesListMenuProvider(binding.root.context, viewModel)) } viewModel.sortOrder.observe(viewLifecycleOwner) { activity?.invalidateOptionsMenu() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt index 85e49c294..4300d3e05 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt @@ -7,7 +7,7 @@ import android.view.MenuItem import androidx.core.view.MenuProvider import androidx.core.view.forEach import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.core.ui.model.titleRes import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity import org.koitharu.kotatsu.parsers.model.SortOrder diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt index b6007cd6e..b8e310dcb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt @@ -10,9 +10,10 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment.Companion.ARG_CATEGORY_ID @@ -27,7 +28,6 @@ import org.koitharu.kotatsu.list.ui.model.toErrorState import org.koitharu.kotatsu.list.ui.model.toUi import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt b/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt index 1e84585de..784f74280 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt @@ -9,7 +9,6 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import org.koitharu.kotatsu.base.domain.ReversibleHandle import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.toEntities import org.koitharu.kotatsu.core.db.entity.toEntity @@ -19,6 +18,8 @@ import org.koitharu.kotatsu.core.db.entity.toMangaTags import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.core.ui.util.ReversibleHandle +import org.koitharu.kotatsu.core.util.ext.mapItems import org.koitharu.kotatsu.history.data.HistoryEntity import org.koitharu.kotatsu.history.data.toMangaHistory import org.koitharu.kotatsu.parsers.model.Manga @@ -26,7 +27,6 @@ import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler import org.koitharu.kotatsu.scrobbling.common.domain.tryScrobble import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.ext.mapItems import javax.inject.Inject const val PROGRESS_NONE = -1f diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt index f7e6b58ec..e9b2dcda1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryActivity.kt @@ -9,10 +9,9 @@ import androidx.fragment.app.commit import com.google.android.material.appbar.AppBarLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivityContainerBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner -import kotlin.text.Typography.dagger @AndroidEntryPoint class HistoryActivity : @@ -20,7 +19,7 @@ class HistoryActivity : AppBarOwner { override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -37,7 +36,7 @@ class HistoryActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListAdapter.kt index 4f0805690..a17e0da8f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListAdapter.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.history.ui import android.content.Context import androidx.lifecycle.LifecycleOwner import coil.ImageLoader -import org.koitharu.kotatsu.base.ui.list.fastscroll.FastScroller -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo import org.koitharu.kotatsu.list.ui.adapter.MangaListAdapter import org.koitharu.kotatsu.list.ui.adapter.MangaListListener diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt index 0ad1f5e92..de17fc3ed 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt @@ -3,15 +3,15 @@ package org.koitharu.kotatsu.history.ui import android.os.Bundle import android.view.Menu import android.view.MenuItem -import android.view.View import androidx.appcompat.view.ActionMode import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.addMenuProvider @AndroidEntryPoint class HistoryListFragment : MangaListFragment() { @@ -19,9 +19,9 @@ class HistoryListFragment : MangaListFragment() { override val viewModel by viewModels() override val isSwipeRefreshEnabled = false - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - addMenuProvider(HistoryListMenuProvider(view.context, viewModel)) + override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) + addMenuProvider(HistoryListMenuProvider(binding.root.context, viewModel)) viewModel.isGroupingEnabled.observe(viewLifecycleOwner) { activity?.invalidateOptionsMenu() } @@ -48,6 +48,7 @@ class HistoryListFragment : MangaListFragment() { mode.finish() true } + else -> super.onActionItemClicked(controller, mode, item) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index a3d5663ff..da09bea62 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -9,12 +9,16 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.observeAsFlow -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.daysDiff +import org.koitharu.kotatsu.core.util.ext.emitValue +import org.koitharu.kotatsu.core.util.ext.onFirst import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.MangaWithHistory @@ -28,10 +32,6 @@ import org.koitharu.kotatsu.list.ui.model.toGridModel import org.koitharu.kotatsu.list.ui.model.toListDetailedModel import org.koitharu.kotatsu.list.ui.model.toListModel import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.daysDiff -import org.koitharu.kotatsu.utils.ext.emitValue -import org.koitharu.kotatsu.utils.ext.onFirst import java.util.Date import java.util.concurrent.TimeUnit import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt index dc4d1e22b..dc2bd9d8e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt @@ -1,14 +1,19 @@ package org.koitharu.kotatsu.history.ui.util import android.content.Context -import android.graphics.* +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.ColorFilter +import android.graphics.Paint +import android.graphics.PixelFormat +import android.graphics.Rect import android.graphics.drawable.Drawable import androidx.annotation.StyleRes import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.ColorUtils import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.scale import org.koitharu.kotatsu.history.domain.PROGRESS_NONE -import org.koitharu.kotatsu.utils.ext.scale class ReadingProgressDrawable( context: Context, diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressView.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressView.kt index 243e8cb5d..49c05a7c5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressView.kt @@ -11,8 +11,8 @@ import android.view.animation.AccelerateDecelerateInterpolator import androidx.annotation.AttrRes import androidx.annotation.StyleRes import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.getAnimationDuration import org.koitharu.kotatsu.history.domain.PROGRESS_NONE -import org.koitharu.kotatsu.utils.ext.getAnimationDuration class ReadingProgressView @JvmOverloads constructor( context: Context, diff --git a/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt b/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt index 9794039e8..469ea71c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt @@ -17,12 +17,12 @@ import coil.target.ViewTarget import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import dagger.hilt.android.AndroidEntryPoint -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat +import org.koitharu.kotatsu.core.util.ext.indicator import org.koitharu.kotatsu.databinding.ActivityImageBinding import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.getSerializableExtraCompat -import org.koitharu.kotatsu.utils.ext.indicator import javax.inject.Inject @AndroidEntryPoint @@ -42,7 +42,7 @@ class ImageActivity : BaseActivity() { } override fun onWindowInsetsChanged(insets: Insets) { - with(binding.toolbar) { + with(viewBinding.toolbar) { updatePadding( left = insets.left, right = insets.right, @@ -59,8 +59,8 @@ class ImageActivity : BaseActivity() { .memoryCachePolicy(CachePolicy.DISABLED) .lifecycle(this) .tag(intent.getSerializableExtraCompat(EXTRA_SOURCE)) - .target(SsivTarget(binding.ssiv)) - .indicator(binding.progressBar) + .target(SsivTarget(viewBinding.ssiv)) + .indicator(viewBinding.progressBar) .enqueueWith(coil) } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt index 37339aac2..2b7141385 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.list.ui import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible import androidx.fragment.app.FragmentManager @@ -10,12 +9,12 @@ import com.google.android.material.button.MaterialButtonToggleGroup import com.google.android.material.slider.Slider import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.util.ext.setValueRounded +import org.koitharu.kotatsu.core.util.progress.IntPercentLabelFormatter import org.koitharu.kotatsu.databinding.DialogListModeBinding -import org.koitharu.kotatsu.utils.ext.setValueRounded -import org.koitharu.kotatsu.utils.progress.IntPercentLabelFormatter import javax.inject.Inject @AndroidEntryPoint @@ -27,13 +26,13 @@ class ListModeBottomSheet : @Inject lateinit var settings: AppSettings - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = DialogListModeBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogListModeBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val mode = settings.listMode binding.buttonList.isChecked = mode == ListMode.LIST binding.buttonListDetailed.isChecked = mode == ListMode.DETAILED_LIST @@ -41,7 +40,7 @@ class ListModeBottomSheet : binding.textViewGridTitle.isVisible = mode == ListMode.GRID binding.sliderGrid.isVisible = mode == ListMode.GRID - binding.sliderGrid.setLabelFormatter(IntPercentLabelFormatter(view.context)) + binding.sliderGrid.setLabelFormatter(IntPercentLabelFormatter(binding.root.context)) binding.sliderGrid.setValueRounded(settings.gridSize.toFloat()) binding.sliderGrid.addOnChangeListener(this) @@ -58,8 +57,8 @@ class ListModeBottomSheet : R.id.button_grid -> ListMode.GRID else -> return } - binding.textViewGridTitle.isVisible = mode == ListMode.GRID - binding.sliderGrid.isVisible = mode == ListMode.GRID + requireViewBinding().textViewGridTitle.isVisible = mode == ListMode.GRID + requireViewBinding().sliderGrid.isVisible = mode == ListMode.GRID settings.listMode = mode } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index 2aad241b3..c503087e3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -20,18 +20,26 @@ import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.list.FitHeightGridLayoutManager -import org.koitharu.kotatsu.base.ui.list.FitHeightLinearLayoutManager -import org.koitharu.kotatsu.base.ui.list.ListSelectionController -import org.koitharu.kotatsu.base.ui.list.PaginationScrollListener -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration -import org.koitharu.kotatsu.base.ui.list.decor.TypedSpacingItemDecoration -import org.koitharu.kotatsu.base.ui.list.fastscroll.FastScroller -import org.koitharu.kotatsu.base.ui.util.ReversibleActionObserver import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.list.FitHeightGridLayoutManager +import org.koitharu.kotatsu.core.ui.list.FitHeightLinearLayoutManager +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.PaginationScrollListener +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.TypedSpacingItemDecoration +import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller +import org.koitharu.kotatsu.core.ui.util.ReversibleActionObserver +import org.koitharu.kotatsu.core.util.ShareHelper +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.core.util.ext.clearItemDecorations +import org.koitharu.kotatsu.core.util.ext.getThemeColor +import org.koitharu.kotatsu.core.util.ext.measureHeight +import org.koitharu.kotatsu.core.util.ext.resolveDp +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.download.ui.worker.DownloadStartedObserver @@ -48,14 +56,6 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.search.ui.MangaListActivity -import org.koitharu.kotatsu.utils.ShareHelper -import org.koitharu.kotatsu.utils.ext.addMenuProvider -import org.koitharu.kotatsu.utils.ext.clearItemDecorations -import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.measureHeight -import org.koitharu.kotatsu.utils.ext.resolveDp -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import javax.inject.Inject @AndroidEntryPoint @@ -88,18 +88,18 @@ abstract class MangaListFragment : protected val selectedItems: Set get() = collectSelectedItems() - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentListBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) listAdapter = onCreateAdapter() - spanResolver = MangaListSpanResolver(view.resources) + spanResolver = MangaListSpanResolver(binding.root.resources) selectionController = ListSelectionController( activity = requireActivity(), - decoration = MangaSelectionDecoration(view.context), + decoration = MangaSelectionDecoration(binding.root.context), registryOwner = this, callback = this, ) @@ -163,7 +163,7 @@ abstract class MangaListFragment : @CallSuper override fun onRefresh() { - binding.swipeRefreshLayout.isRefreshing = true + requireViewBinding().swipeRefreshLayout.isRefreshing = true viewModel.onRefresh() } @@ -185,10 +185,10 @@ abstract class MangaListFragment : @CallSuper protected open fun onLoadingStateChanged(isLoading: Boolean) { - binding.swipeRefreshLayout.isEnabled = binding.swipeRefreshLayout.isRefreshing || + requireViewBinding().swipeRefreshLayout.isEnabled = requireViewBinding().swipeRefreshLayout.isRefreshing || isSwipeRefreshEnabled && !isLoading if (!isLoading) { - binding.swipeRefreshLayout.isRefreshing = false + requireViewBinding().swipeRefreshLayout.isRefreshing = false } } @@ -201,15 +201,15 @@ abstract class MangaListFragment : } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + requireViewBinding().recyclerView.updatePadding( bottom = insets.bottom, ) - binding.recyclerView.fastScroller.updateLayoutParams { + requireViewBinding().recyclerView.fastScroller.updateLayoutParams { bottomMargin = insets.bottom } if (activity is MainActivity) { val headerHeight = (activity as? AppBarOwner)?.appBar?.measureHeight() ?: insets.top - binding.swipeRefreshLayout.setProgressViewOffset( + requireViewBinding().swipeRefreshLayout.setProgressViewOffset( true, headerHeight + resources.resolveDp(-72), headerHeight + resources.resolveDp(10), @@ -233,12 +233,12 @@ abstract class MangaListFragment : private fun onGridScaleChanged(scale: Float) { spanSizeLookup.invalidateCache() - spanResolver?.setGridSize(scale, binding.recyclerView) + spanResolver?.setGridSize(scale, requireViewBinding().recyclerView) } private fun onListModeChanged(mode: ListMode) { spanSizeLookup.invalidateCache() - with(binding.recyclerView) { + with(requireViewBinding().recyclerView) { clearItemDecorations() removeOnLayoutChangeListener(spanResolver) when (mode) { @@ -269,7 +269,7 @@ abstract class MangaListFragment : addOnLayoutChangeListener(spanResolver) } } - selectionController?.attachToRecyclerView(binding.recyclerView) + selectionController?.attachToRecyclerView(requireViewBinding().recyclerView) } } @@ -310,16 +310,16 @@ abstract class MangaListFragment : } override fun onSelectionChanged(controller: ListSelectionController, count: Int) { - binding.recyclerView.invalidateItemDecorations() + requireViewBinding().recyclerView.invalidateItemDecorations() } override fun onFastScrollStart(fastScroller: FastScroller) { (activity as? AppBarOwner)?.appBar?.setExpanded(false, true) - binding.swipeRefreshLayout.isEnabled = false + requireViewBinding().swipeRefreshLayout.isEnabled = false } override fun onFastScrollStop(fastScroller: FastScroller) { - binding.swipeRefreshLayout.isEnabled = isSwipeRefreshEnabled + requireViewBinding().swipeRefreshLayout.isEnabled = isSwipeRefreshEnabled } private fun collectSelectedItems(): Set { @@ -343,7 +343,7 @@ abstract class MangaListFragment : override fun getSpanSize(position: Int): Int { val total = - (binding.recyclerView.layoutManager as? GridLayoutManager)?.spanCount ?: return 1 + (requireViewBinding().recyclerView.layoutManager as? GridLayoutManager)?.spanCount ?: return 1 return when (listAdapter?.getItemViewType(position)) { ITEM_TYPE_MANGA_GRID -> 1 else -> total diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt index 6ff381fe4..b123776dc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt @@ -6,17 +6,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.plus -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow import org.koitharu.kotatsu.core.prefs.observeAsLiveData +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData abstract class MangaListViewModel( private val settings: AppSettings, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaSelectionDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaSelectionDecoration.kt index b8d5e03c9..5518e15a3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaSelectionDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaSelectionDecoration.kt @@ -12,10 +12,10 @@ import androidx.core.graphics.ColorUtils import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.NO_ID import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.util.ext.getItem +import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.list.ui.model.MangaItemModel -import org.koitharu.kotatsu.utils.ext.getItem -import org.koitharu.kotatsu.utils.ext.getThemeColor import com.google.android.material.R as materialR open class MangaSelectionDecoration(context: Context) : AbstractSelectionItemDecoration() { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyHintAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyHintAD.kt index d03a7cdff..72bef49ae 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyHintAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyHintAD.kt @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible import org.koitharu.kotatsu.databinding.ItemEmptyCardBinding import org.koitharu.kotatsu.list.ui.model.EmptyHint import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun emptyHintAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt index 29a4b1dbb..745eb583e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible import org.koitharu.kotatsu.databinding.ItemEmptyStateBinding import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun emptyStateListAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorFooterAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorFooterAD.kt index 52b3db95a..4e25a5eb7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorFooterAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorFooterAD.kt @@ -1,15 +1,15 @@ package org.koitharu.kotatsu.list.ui.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import org.koitharu.kotatsu.databinding.ItemErrorFooterBinding import org.koitharu.kotatsu.list.ui.model.ErrorFooter import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.getDisplayMessage fun errorFooterAD( listener: MangaListListener, ) = adapterDelegateViewBinding( - { inflater, parent -> ItemErrorFooterBinding.inflate(inflater, parent, false) } + { inflater, parent -> ItemErrorFooterBinding.inflate(inflater, parent, false) }, ) { binding.root.setOnClickListener { @@ -20,4 +20,4 @@ fun errorFooterAD( binding.textViewTitle.text = item.exception.getDisplayMessage(context.resources) binding.imageViewIcon.setImageResource(item.icon) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorStateListAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorStateListAD.kt index a31b55d3f..03de52eb8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorStateListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ErrorStateListAD.kt @@ -2,15 +2,15 @@ package org.koitharu.kotatsu.list.ui.adapter import androidx.core.view.isVisible import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import org.koitharu.kotatsu.databinding.ItemErrorStateBinding import org.koitharu.kotatsu.list.ui.model.ErrorState import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.getDisplayMessage fun errorStateListAD( listener: ListStateHolderListener, ) = adapterDelegateViewBinding( - { inflater, parent -> ItemErrorStateBinding.inflate(inflater, parent, false) } + { inflater, parent -> ItemErrorStateBinding.inflate(inflater, parent, false) }, ) { binding.buttonRetry.setOnClickListener { @@ -27,4 +27,4 @@ fun errorStateListAD( setText(item.buttonText) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt index d8ab7ce94..4a0f8f2fe 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt @@ -1,13 +1,13 @@ package org.koitharu.kotatsu.list.ui.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding -import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.core.ui.model.titleRes +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible import org.koitharu.kotatsu.databinding.ItemHeader2Binding import org.koitharu.kotatsu.list.ui.model.ListHeader2 import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.ext.isAnimationsEnabled -import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun listHeader2AD( listener: MangaListListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt index feaa97b0d..51a58e2e0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt @@ -1,10 +1,10 @@ package org.koitharu.kotatsu.list.ui.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible import org.koitharu.kotatsu.databinding.ItemHeaderButtonBinding import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun listHeaderAD( listener: ListHeaderClickListener?, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaDetailsClickListener.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaDetailsClickListener.kt index 9bb885da4..d1cf4f20c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaDetailsClickListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaDetailsClickListener.kt @@ -1,7 +1,7 @@ package org.koitharu.kotatsu.list.ui.adapter import android.view.View -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt index 98859c239..900738327 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaGridItemAD.kt @@ -5,18 +5,18 @@ import coil.ImageLoader import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.image.CoverSizeResolver +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemMangaGridBinding import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaGridModel import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.image.CoverSizeResolver fun mangaGridItemAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt index cabf3a0e1..f471cc99a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListHeader2 import org.koitharu.kotatsu.list.ui.model.ListModel diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt index 26ced553f..645ecefa4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt @@ -8,18 +8,18 @@ import com.google.android.material.badge.BadgeDrawable import com.google.android.material.chip.Chip import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.ui.image.CoverSizeResolver +import org.koitharu.kotatsu.core.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemMangaListDetailsBinding import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaListDetailedModel import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.ext.textAndVisible -import org.koitharu.kotatsu.utils.image.CoverSizeResolver fun mangaListDetailedItemAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt index 48904c2c4..77f68418d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt @@ -5,16 +5,16 @@ import coil.ImageLoader import com.google.android.material.badge.BadgeDrawable import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemMangaListBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaListModel import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.ext.textAndVisible fun mangaListItemAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/RelatedDateItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/RelatedDateItemAD.kt index 98a4bc8f6..3a615aab5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/RelatedDateItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/RelatedDateItemAD.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.list.ui.adapter import android.widget.TextView import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo import org.koitharu.kotatsu.list.ui.model.ListModel fun relatedDateItemAD() = adapterDelegate(R.layout.item_header) { @@ -11,4 +11,4 @@ fun relatedDateItemAD() = adapterDelegate(R.layout.item_ bind { (itemView as TextView).text = item.format(context.resources) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt index e34b5ad94..5dcb3a21a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterAdapterDelegates.kt @@ -5,14 +5,14 @@ import androidx.core.view.isVisible import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.core.ui.model.titleRes import org.koitharu.kotatsu.databinding.ItemCheckableNewBinding import org.koitharu.kotatsu.databinding.ItemFilterHeaderBinding fun filterSortDelegate( listener: OnFilterChangedListener, ) = adapterDelegateViewBinding( - { layoutInflater, parent -> ItemCheckableNewBinding.inflate(layoutInflater, parent, false) } + { layoutInflater, parent -> ItemCheckableNewBinding.inflate(layoutInflater, parent, false) }, ) { itemView.setOnClickListener { @@ -28,7 +28,7 @@ fun filterSortDelegate( fun filterTagDelegate( listener: OnFilterChangedListener, ) = adapterDelegateViewBinding( - { layoutInflater, parent -> ItemCheckableNewBinding.inflate(layoutInflater, parent, false) } + { layoutInflater, parent -> ItemCheckableNewBinding.inflate(layoutInflater, parent, false) }, ) { itemView.setOnClickListener { @@ -42,7 +42,7 @@ fun filterTagDelegate( } fun filterHeaderDelegate() = adapterDelegateViewBinding( - { layoutInflater, parent -> ItemFilterHeaderBinding.inflate(layoutInflater, parent, false) } + { layoutInflater, parent -> ItemFilterHeaderBinding.inflate(layoutInflater, parent, false) }, ) { bind { @@ -63,4 +63,4 @@ fun filterErrorDelegate() = adapterDelegate(R.layo bind { (itemView as TextView).setText(item.textResId) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterBottomSheet.kt index 226d73ed6..f1dc651f7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterBottomSheet.kt @@ -3,18 +3,17 @@ package org.koitharu.kotatsu.list.ui.filter import android.os.Bundle import android.view.LayoutInflater import android.view.MenuItem -import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.LinearLayoutManager import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet -import org.koitharu.kotatsu.base.ui.util.CollapseActionViewCallback +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.util.CollapseActionViewCallback +import org.koitharu.kotatsu.core.util.ext.parentFragmentViewModels import org.koitharu.kotatsu.databinding.SheetFilterBinding import org.koitharu.kotatsu.remotelist.ui.RemoteListViewModel -import org.koitharu.kotatsu.utils.ext.parentFragmentViewModels class FilterBottomSheet : BaseBottomSheet(), @@ -25,12 +24,12 @@ class FilterBottomSheet : private val viewModel by parentFragmentViewModels() private var collapsibleActionViewCallback: CollapseActionViewCallback? = null - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetFilterBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetFilterBinding { return SheetFilterBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetFilterBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val adapter = FilterAdapter(viewModel, this) binding.recyclerView.adapter = adapter viewModel.filterItems.observe(viewLifecycleOwner, adapter::setItems) @@ -65,13 +64,13 @@ class FilterBottomSheet : override fun onCurrentListChanged(previousList: MutableList, currentList: MutableList) { if (currentList.size > previousList.size && view != null) { - (binding.recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, 0) + (requireViewBinding().recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, 0) } } private fun initOptionsMenu() { - binding.headerBar.inflateMenu(R.menu.opt_filter) - val searchMenuItem = binding.headerBar.menu.findItem(R.id.action_search) + requireViewBinding().headerBar.inflateMenu(R.menu.opt_filter) + val searchMenuItem = requireViewBinding().headerBar.menu.findItem(R.id.action_search) searchMenuItem.setOnActionExpandListener(this) val searchView = searchMenuItem.actionView as SearchView searchView.setOnQueryTextListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt index 96fb630ae..b8c04d96d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt @@ -13,12 +13,12 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.update import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaDataRepository +import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.text.Collator import java.util.Locale import java.util.TreeSet @@ -188,9 +188,7 @@ class FilterCoordinator( if (tags != other.tags) return false if (isLoading != other.isLoading) return false - if (isError != other.isError) return false - - return true + return isError == other.isError } override fun hashCode(): Int { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader.kt index 5d9682d75..1be8b5b74 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.list.ui.model import android.content.Context import androidx.annotation.StringRes -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo class ListHeader private constructor( val text: CharSequence?, @@ -46,9 +46,7 @@ class ListHeader private constructor( if (textRes != other.textRes) return false if (dateTimeAgo != other.dateTimeAgo) return false if (buttonTextRes != other.buttonTextRes) return false - if (payload != other.payload) return false - - return true + return payload == other.payload } override fun hashCode(): Int { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt index 0f053bfd6..dab335ee2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.list.ui.model -import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.ui.widgets.ChipsView import org.koitharu.kotatsu.parsers.model.SortOrder class ListHeader2( @@ -16,10 +16,9 @@ class ListHeader2( other as ListHeader2 if (chips != other.chips) return false - if (sortOrder != other.sortOrder) return false + return sortOrder == other.sortOrder // Not need to check hasSelectedTags - return true } override fun hashCode(): Int { @@ -27,4 +26,4 @@ class ListHeader2( result = 31 * result + (sortOrder?.hashCode() ?: 0) return result } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt index 20fba3c37..89cd7eee1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt @@ -1,16 +1,16 @@ package org.koitharu.kotatsu.list.ui.model import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.util.ext.ifZero import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.domain.ListExtraProvider import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.ifZero import java.net.SocketTimeoutException import java.net.UnknownHostException diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/MangaListDetailedModel.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/MangaListDetailedModel.kt index d1f40dc46..1d246ebb2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/MangaListDetailedModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/MangaListDetailedModel.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.list.ui.model -import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.ui.widgets.ChipsView import org.koitharu.kotatsu.parsers.model.Manga data class MangaListDetailedModel( diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt index 7653dbf07..9684dd63c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt @@ -11,9 +11,9 @@ import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.withContext import okhttp3.Cache import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.computeSize +import org.koitharu.kotatsu.core.util.ext.getStorageName import org.koitharu.kotatsu.parsers.util.mapToSet -import org.koitharu.kotatsu.utils.ext.computeSize -import org.koitharu.kotatsu.utils.ext.getStorageName import java.io.File import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt index eb216a140..6d08885af 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt @@ -14,7 +14,6 @@ import org.koitharu.kotatsu.parsers.util.json.getLongOrDefault import org.koitharu.kotatsu.parsers.util.json.getStringOrNull import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet import org.koitharu.kotatsu.parsers.util.toTitleCase -import org.koitharu.kotatsu.utils.AlphanumComparator import java.io.File class MangaIndex(source: String?) { @@ -126,7 +125,7 @@ class MangaIndex(source: String?) { item.put("id", id) list.add(item) } - val comparator = AlphanumComparator() + val comparator = org.koitharu.kotatsu.core.util.AlphanumComparator() list.sortWith(compareBy(comparator) { it.getString("name") }) val newJo = JSONObject() list.forEachIndexed { i, obj -> diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt index 255bfdda6..755ed222b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt @@ -9,15 +9,15 @@ import kotlinx.coroutines.withContext import okio.Source import okio.buffer import okio.sink +import org.koitharu.kotatsu.core.util.FileSize +import org.koitharu.kotatsu.core.util.ext.longHashCode +import org.koitharu.kotatsu.core.util.ext.subdir +import org.koitharu.kotatsu.core.util.ext.takeIfReadable +import org.koitharu.kotatsu.core.util.ext.takeIfWriteable +import org.koitharu.kotatsu.core.util.ext.writeAllCancellable import org.koitharu.kotatsu.parsers.util.SuspendLazy -import org.koitharu.kotatsu.utils.FileSize -import org.koitharu.kotatsu.utils.ext.longHashCode -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.subdir -import org.koitharu.kotatsu.utils.ext.takeIfReadable -import org.koitharu.kotatsu.utils.ext.takeIfWriteable -import org.koitharu.kotatsu.utils.ext.writeAllCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/importer/SingleMangaImporter.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/importer/SingleMangaImporter.kt index 70307defa..e5c9bf9e1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/importer/SingleMangaImporter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/importer/SingleMangaImporter.kt @@ -13,13 +13,13 @@ import okio.buffer import okio.sink import okio.source import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException +import org.koitharu.kotatsu.core.util.ext.resolveName +import org.koitharu.kotatsu.core.util.ext.writeAllCancellable import org.koitharu.kotatsu.local.data.CbzFilter import org.koitharu.kotatsu.local.data.LocalManga import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.local.data.input.LocalMangaInput -import org.koitharu.kotatsu.utils.ext.resolveName -import org.koitharu.kotatsu.utils.ext.writeAllCancellable import java.io.File import java.io.IOException import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt index 9dc597eb0..e383da294 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt @@ -4,6 +4,9 @@ import androidx.core.net.toFile import androidx.core.net.toUri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import org.koitharu.kotatsu.core.util.ext.listFilesRecursive +import org.koitharu.kotatsu.core.util.ext.longHashCode +import org.koitharu.kotatsu.core.util.ext.toListSorted import org.koitharu.kotatsu.local.data.CbzFilter import org.koitharu.kotatsu.local.data.ImageFileFilter import org.koitharu.kotatsu.local.data.LocalManga @@ -14,10 +17,6 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.toCamelCase -import org.koitharu.kotatsu.utils.AlphanumComparator -import org.koitharu.kotatsu.utils.ext.listFilesRecursive -import org.koitharu.kotatsu.utils.ext.longHashCode -import org.koitharu.kotatsu.utils.ext.toListSorted import java.io.File import java.util.zip.ZipFile @@ -89,7 +88,7 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) { val file = chapter.url.toUri().toFile() if (file.isDirectory) { file.listFilesRecursive(ImageFileFilter()) - .toListSorted(compareBy(AlphanumComparator()) { x -> x.name }) + .toListSorted(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) .map { val pageUri = it.toUri().toString() MangaPage( @@ -105,7 +104,7 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) { .asSequence() .filter { x -> !x.isDirectory } .map { it.name } - .toListSorted(AlphanumComparator()) + .toListSorted(org.koitharu.kotatsu.core.util.AlphanumComparator()) .map { val pageUri = zipUri(file, it) MangaPage( @@ -122,7 +121,7 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) { private fun String.toHumanReadable() = replace("_", " ").toCamelCase() private fun getChaptersFiles(): List = root.listFilesRecursive(CbzFilter()) - .toListSorted(compareBy(AlphanumComparator()) { x -> x.name }) + .toListSorted(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) private fun findFirstImageEntry(): String? { val filter = ImageFileFilter() diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt index 7c01e50b8..e768e5b9b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt @@ -7,6 +7,9 @@ import androidx.core.net.toFile import androidx.core.net.toUri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import org.koitharu.kotatsu.core.util.ext.longHashCode +import org.koitharu.kotatsu.core.util.ext.readText +import org.koitharu.kotatsu.core.util.ext.toListSorted import org.koitharu.kotatsu.local.data.LocalManga import org.koitharu.kotatsu.local.data.MangaIndex import org.koitharu.kotatsu.local.data.output.LocalMangaOutput @@ -15,10 +18,6 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.toCamelCase -import org.koitharu.kotatsu.utils.AlphanumComparator -import org.koitharu.kotatsu.utils.ext.longHashCode -import org.koitharu.kotatsu.utils.ext.readText -import org.koitharu.kotatsu.utils.ext.toListSorted import java.io.File import java.util.Enumeration import java.util.zip.ZipEntry @@ -71,18 +70,19 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) { publicUrl = fileUri, source = MangaSource.LOCAL, coverUrl = zipUri(root, findFirstImageEntry(zip.entries())?.name.orEmpty()), - chapters = chapters.sortedWith(AlphanumComparator()).mapIndexed { i, s -> - MangaChapter( - id = "$i$s".longHashCode(), - name = s.ifEmpty { title }, - number = i + 1, - source = MangaSource.LOCAL, - uploadDate = 0L, - url = uriBuilder.fragment(s).build().toString(), - scanlator = null, - branch = null, - ) - }, + chapters = chapters.sortedWith(org.koitharu.kotatsu.core.util.AlphanumComparator()) + .mapIndexed { i, s -> + MangaChapter( + id = "$i$s".longHashCode(), + name = s.ifEmpty { title }, + number = i + 1, + source = MangaSource.LOCAL, + uploadDate = 0L, + url = uriBuilder.fragment(s).build().toString(), + scanlator = null, + branch = null, + ) + }, altTitle = null, rating = -1f, isNsfw = false, @@ -125,7 +125,7 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) { } } entries - .toListSorted(compareBy(AlphanumComparator()) { x -> x.name }) + .toListSorted(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) .map { x -> val entryUri = zipUri(file, x.name) MangaPage( @@ -141,7 +141,7 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) { private fun findFirstImageEntry(entries: Enumeration): ZipEntry? { val list = entries.toList() .filterNot { it.isDirectory } - .sortedWith(compareBy(AlphanumComparator()) { x -> x.name }) + .sortedWith(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) val map = MimeTypeMap.getSingleton() return list.firstOrNull { map.getMimeTypeFromExtension(it.name.substringAfterLast('.')) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt index 4e97b188e..ef050f1cc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt @@ -2,13 +2,13 @@ package org.koitharu.kotatsu.local.data.output import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import org.koitharu.kotatsu.core.util.ext.deleteAwait +import org.koitharu.kotatsu.core.util.ext.takeIfReadable import org.koitharu.kotatsu.core.zip.ZipOutput import org.koitharu.kotatsu.local.data.MangaIndex import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.toFileNameSafe -import org.koitharu.kotatsu.utils.ext.deleteAwait -import org.koitharu.kotatsu.utils.ext.takeIfReadable import java.io.File class LocalMangaDirOutput( diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt index 6c1fda62e..23caca4fa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt @@ -3,12 +3,12 @@ package org.koitharu.kotatsu.local.data.output import androidx.annotation.WorkerThread import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import org.koitharu.kotatsu.core.util.ext.deleteAwait +import org.koitharu.kotatsu.core.util.ext.readText import org.koitharu.kotatsu.core.zip.ZipOutput import org.koitharu.kotatsu.local.data.MangaIndex import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.utils.ext.deleteAwait -import org.koitharu.kotatsu.utils.ext.readText import java.io.File import java.util.zip.ZipFile diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index 2ca31d0e5..9763882a7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -12,6 +12,8 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.runInterruptible import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.util.CompositeMutex +import org.koitharu.kotatsu.core.util.ext.deleteAwait import org.koitharu.kotatsu.local.data.LocalManga import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.data.LocalStorageManager @@ -25,11 +27,8 @@ import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.utils.AlphanumComparator -import org.koitharu.kotatsu.utils.CompositeMutex -import org.koitharu.kotatsu.utils.ext.deleteAwait -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import javax.inject.Inject import javax.inject.Singleton @@ -65,7 +64,7 @@ class LocalMangaRepository @Inject constructor( list.retainAll { x -> x.containsTags(tags) } } when (sortOrder) { - SortOrder.ALPHABETICAL -> list.sortWith(compareBy(AlphanumComparator()) { x -> x.manga.title }) + SortOrder.ALPHABETICAL -> list.sortWith(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.manga.title }) SortOrder.RATING -> list.sortByDescending { it.manga.rating } SortOrder.NEWEST, SortOrder.UPDATED, diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt index b72f82200..6ff59f3a3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt @@ -10,7 +10,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.FragmentManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.ui.AlertDialogFragment import org.koitharu.kotatsu.databinding.DialogImportBinding import org.koitharu.kotatsu.settings.backup.BackupDialogFragment import org.koitharu.kotatsu.settings.backup.RestoreDialogFragment @@ -27,7 +27,7 @@ class ImportDialogFragment : AlertDialogFragment(), View.On restoreBackup(it) } - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): DialogImportBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): DialogImportBinding { return DialogImportBinding.inflate(inflater, container, false) } @@ -38,8 +38,8 @@ class ImportDialogFragment : AlertDialogFragment(), View.On .setCancelable(true) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogImportBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) binding.buttonDir.setOnClickListener(this) binding.buttonFile.setOnClickListener(this) binding.buttonBackup.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportWorker.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportWorker.kt index dc2af369a..fc719ae5b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/ImportWorker.kt @@ -23,13 +23,13 @@ import coil.request.ImageRequest import dagger.assisted.Assisted import dagger.assisted.AssistedInject import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.toBitmapOrNull +import org.koitharu.kotatsu.core.util.ext.toUriOrNull import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.local.data.importer.SingleMangaImporter import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.util.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.toBitmapOrNull -import org.koitharu.kotatsu.utils.ext.toUriOrNull @HiltWorker class ImportWorker @AssistedInject constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt index e7606dfcf..d63ea1100 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt @@ -11,14 +11,14 @@ import androidx.core.content.ContextCompat import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.MutableSharedFlow import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.CoroutineIntentService import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.ui.CoroutineIntentService +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat import org.koitharu.kotatsu.local.data.LocalManga import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt index 4d88b6663..d451b3936 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt @@ -12,18 +12,19 @@ import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.util.ShareHelper +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.utils.ShareHelper -import org.koitharu.kotatsu.utils.ext.addMenuProvider class LocalListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener { override val viewModel by viewModels() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) addMenuProvider(LocalListMenuProvider(this::onEmptyActionClick)) viewModel.onMangaRemoved.observe(viewLifecycleOwner) { onItemRemoved() } } @@ -34,7 +35,7 @@ class LocalListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener override fun onFilterClick(view: View?) { super.onFilterClick(view) - val menu = PopupMenu(requireContext(), view ?: binding.recyclerView) + val menu = PopupMenu(requireContext(), view ?: requireViewBinding().recyclerView) menu.inflate(R.menu.popup_order) menu.setOnMenuItemClickListener(this) menu.show() @@ -53,12 +54,14 @@ class LocalListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener showDeletionConfirm(selectedItemsIds, mode) true } + R.id.action_share -> { val files = selectedItems.map { it.url.toUri().toFile() } ShareHelper(requireContext()).shareCbz(files) mode.finish() true } + else -> super.onActionItemClicked(controller, mode, item) } } @@ -87,7 +90,7 @@ class LocalListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener } private fun onItemRemoved() { - Snackbar.make(binding.recyclerView, R.string.removal_completed, Snackbar.LENGTH_SHORT).show() + Snackbar.make(requireViewBinding().recyclerView, R.string.removal_completed, Snackbar.LENGTH_SHORT).show() } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index d8c7b4967..0439423eb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -14,9 +14,11 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.PROGRESS_NONE @@ -33,10 +35,8 @@ import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable import java.io.IOException import java.util.LinkedList import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActionButtonBehavior.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActionButtonBehavior.kt index 8d66aee1b..0c912e54e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActionButtonBehavior.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActionButtonBehavior.kt @@ -6,8 +6,8 @@ import android.view.View import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.ViewCompat import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton -import org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior -import org.koitharu.kotatsu.base.ui.widgets.SlidingBottomNavigationView +import org.koitharu.kotatsu.core.ui.util.ShrinkOnScrollBehavior +import org.koitharu.kotatsu.core.ui.widgets.SlidingBottomNavigationView class MainActionButtonBehavior : ShrinkOnScrollBehavior { diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index e60500113..9f34e0c61 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -38,10 +38,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.widgets.SlidingBottomNavigationView import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver +import org.koitharu.kotatsu.core.os.VoiceInputContract import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.widgets.SlidingBottomNavigationView +import org.koitharu.kotatsu.core.util.ext.drawableEnd +import org.koitharu.kotatsu.core.util.ext.hideKeyboard +import org.koitharu.kotatsu.core.util.ext.resolve +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf +import org.koitharu.kotatsu.core.util.ext.setNavigationBarTransparentCompat +import org.koitharu.kotatsu.core.util.ext.tryLaunch import org.koitharu.kotatsu.databinding.ActivityMainBinding import org.koitharu.kotatsu.details.service.MangaPrefetchService import org.koitharu.kotatsu.details.ui.DetailsActivity @@ -62,13 +69,6 @@ import org.koitharu.kotatsu.settings.onboard.OnboardDialogFragment import org.koitharu.kotatsu.shelf.ui.ShelfFragment import org.koitharu.kotatsu.suggestions.ui.SuggestionsWorker import org.koitharu.kotatsu.tracker.work.TrackWorker -import org.koitharu.kotatsu.utils.VoiceInputContract -import org.koitharu.kotatsu.utils.ext.drawableEnd -import org.koitharu.kotatsu.utils.ext.hideKeyboard -import org.koitharu.kotatsu.utils.ext.resolve -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf -import org.koitharu.kotatsu.utils.ext.setNavigationBarTransparentCompat -import org.koitharu.kotatsu.utils.ext.tryLaunch import javax.inject.Inject import com.google.android.material.R as materialR @@ -94,41 +94,42 @@ class MainActivity : private lateinit var navigationDelegate: MainNavigationDelegate override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override val bottomNav: SlidingBottomNavigationView? - get() = binding.bottomNav + get() = viewBinding.bottomNav override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater)) if (bottomNav != null) { - ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> + ViewCompat.setOnApplyWindowInsetsListener(viewBinding.root) { _, insets -> if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) { val elevation = bottomNav?.elevation ?: 0f window.setNavigationBarTransparentCompat(this@MainActivity, elevation) } insets } - ViewCompat.requestApplyInsets(binding.root) + ViewCompat.requestApplyInsets(viewBinding.root) } - with(binding.searchView) { + with(viewBinding.searchView) { onFocusChangeListener = this@MainActivity searchSuggestionListener = this@MainActivity } window.statusBarColor = ContextCompat.getColor(this, R.color.dim_statusbar) - binding.fab?.setOnClickListener(this) - binding.navRail?.headerView?.setOnClickListener(this) - binding.searchView.isVoiceSearchEnabled = voiceInputLauncher.resolve(this, null) != null + viewBinding.fab?.setOnClickListener(this) + viewBinding.navRail?.headerView?.setOnClickListener(this) + viewBinding.searchView.isVoiceSearchEnabled = voiceInputLauncher.resolve(this, null) != null - navigationDelegate = MainNavigationDelegate(checkNotNull(bottomNav ?: binding.navRail), supportFragmentManager) + navigationDelegate = + MainNavigationDelegate(checkNotNull(bottomNav ?: viewBinding.navRail), supportFragmentManager) navigationDelegate.addOnFragmentChangedListener(this) navigationDelegate.onCreate(savedInstanceState) - onBackPressedDispatcher.addCallback(ExitCallback(this, binding.container)) + onBackPressedDispatcher.addCallback(ExitCallback(this, viewBinding.container)) onBackPressedDispatcher.addCallback(navigationDelegate) onBackPressedDispatcher.addCallback(closeSearchCallback) @@ -137,7 +138,7 @@ class MainActivity : } viewModel.onOpenReader.observe(this, this::onOpenReader) - viewModel.onError.observe(this, SnackbarErrorObserver(binding.container, null)) + viewModel.onError.observe(this, SnackbarErrorObserver(viewBinding.container, null)) viewModel.isLoading.observe(this, this::onLoadingStateChanged) viewModel.isResumeEnabled.observe(this, this::onResumeEnabledChanged) viewModel.counters.observe(this, ::onCountersChanged) @@ -153,13 +154,13 @@ class MainActivity : override fun onFragmentChanged(fragment: Fragment, fromUser: Boolean) { adjustFabVisibility(topFragment = fragment) if (fromUser) { - binding.appbar.setExpanded(true) + viewBinding.appbar.setExpanded(true) } } override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home && !isSearchOpened()) { - binding.searchView.requestFocus() + viewBinding.searchView.requestFocus() return true } return super.onOptionsItemSelected(item) @@ -173,7 +174,7 @@ class MainActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) @@ -198,7 +199,7 @@ class MainActivity : } override fun onQueryClick(query: String, submit: Boolean) { - binding.searchView.query = query + viewBinding.searchView.query = query if (submit) { if (query.isNotEmpty()) { startActivity(MultiSearchActivity.newIntent(this, query)) @@ -216,16 +217,16 @@ class MainActivity : } override fun onVoiceSearchClick() { - val options = binding.searchView.drawableEnd?.bounds?.let { bounds -> + val options = viewBinding.searchView.drawableEnd?.bounds?.let { bounds -> ActivityOptionsCompat.makeScaleUpAnimation( - binding.searchView, + viewBinding.searchView, bounds.centerX(), bounds.centerY(), bounds.width(), bounds.height(), ) } - voiceInputLauncher.tryLaunch(binding.searchView.hint?.toString(), options) + voiceInputLauncher.tryLaunch(viewBinding.searchView.hint?.toString(), options) } override fun onSourceToggle(source: MangaSource, isEnabled: Boolean) { @@ -250,7 +251,7 @@ class MainActivity : } private fun onOpenReader(manga: Manga) { - val fab = binding.fab ?: binding.navRail?.headerView + val fab = viewBinding.fab ?: viewBinding.navRail?.headerView val options = fab?.let { scaleUpActivityOptionsOf(it).toBundle() } @@ -270,17 +271,17 @@ class MainActivity : } private fun onIncognitoModeChanged(isIncognito: Boolean) { - var options = binding.searchView.imeOptions + var options = viewBinding.searchView.imeOptions options = if (isIncognito) { options or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING } else { options and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() } - binding.searchView.imeOptions = options + viewBinding.searchView.imeOptions = options } private fun onLoadingStateChanged(isLoading: Boolean) { - binding.fab?.isEnabled = !isLoading + viewBinding.fab?.isEnabled = !isLoading } private fun onResumeEnabledChanged(isEnabled: Boolean) { @@ -293,7 +294,7 @@ class MainActivity : } private fun onSearchClosed() { - binding.searchView.hideKeyboard() + viewBinding.searchView.hideKeyboard() adjustSearchUI(isOpened = false, animate = true) closeSearchCallback.isEnabled = false } @@ -306,7 +307,7 @@ class MainActivity : hide() } } - binding.navRail?.isVisible = visible + viewBinding.navRail?.isVisible = visible } private fun isSearchOpened(): Boolean { @@ -341,7 +342,7 @@ class MainActivity : topFragment: Fragment? = navigationDelegate.primaryFragment, isSearchOpened: Boolean = isSearchOpened(), ) { - val fab = binding.fab ?: return + val fab = viewBinding.fab ?: return if ( isResumeEnabled && !actionModeDelegate.isActionModeStarted && @@ -360,22 +361,22 @@ class MainActivity : private fun adjustSearchUI(isOpened: Boolean, animate: Boolean) { if (animate) { - TransitionManager.beginDelayedTransition(binding.appbar) + TransitionManager.beginDelayedTransition(viewBinding.appbar) } val appBarScrollFlags = if (isOpened) { SCROLL_FLAG_NO_SCROLL } else { SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS or SCROLL_FLAG_SNAP } - binding.toolbarCard.updateLayoutParams { scrollFlags = appBarScrollFlags } - binding.insetsHolder.updateLayoutParams { scrollFlags = appBarScrollFlags } - binding.toolbarCard.background = if (isOpened) { + viewBinding.toolbarCard.updateLayoutParams { scrollFlags = appBarScrollFlags } + viewBinding.insetsHolder.updateLayoutParams { scrollFlags = appBarScrollFlags } + viewBinding.toolbarCard.background = if (isOpened) { null } else { ContextCompat.getDrawable(this, R.drawable.toolbar_background) } val padding = if (isOpened) 0 else resources.getDimensionPixelOffset(R.dimen.margin_normal) - binding.appbar.updatePadding(left = padding, right = padding) + viewBinding.appbar.updatePadding(left = padding, right = padding) adjustFabVisibility(isSearchOpened = isOpened) supportActionBar?.setHomeAsUpIndicator( if (isOpened) materialR.drawable.abc_ic_ab_back_material else materialR.drawable.abc_ic_search_api_material, @@ -396,7 +397,7 @@ class MainActivity : override fun onActivityResult(result: String?) { if (result != null) { - binding.searchView.query = result + viewBinding.searchView.query = result } } } @@ -405,7 +406,7 @@ class MainActivity : override fun handleOnBackPressed() { val fragment = supportFragmentManager.findFragmentByTag(TAG_SEARCH) - binding.searchView.clearFocus() + viewBinding.searchView.clearFocus() if (fragment == null) { // this should not happen but who knows isEnabled = false diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt index 92d71241d..fe23e3cc2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt @@ -10,13 +10,13 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import com.google.android.material.navigation.NavigationBarView import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled import org.koitharu.kotatsu.explore.ui.ExploreFragment import org.koitharu.kotatsu.settings.tools.ToolsFragment import org.koitharu.kotatsu.shelf.ui.ShelfFragment import org.koitharu.kotatsu.tracker.ui.feed.FeedFragment -import org.koitharu.kotatsu.utils.ext.firstVisibleItemPosition -import org.koitharu.kotatsu.utils.ext.isAnimationsEnabled import java.util.LinkedList private const val TAG_PRIMARY = "primary" diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt index 054b4cf5a..f6482dce8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt @@ -7,17 +7,17 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException import org.koitharu.kotatsu.core.github.AppUpdateRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow import org.koitharu.kotatsu.core.prefs.observeAsLiveData +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/BottomNavOwner.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/BottomNavOwner.kt index 5174b97f4..ac6d1f0c6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/BottomNavOwner.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/BottomNavOwner.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.main.ui.owners -import org.koitharu.kotatsu.base.ui.widgets.SlidingBottomNavigationView +import org.koitharu.kotatsu.core.ui.widgets.SlidingBottomNavigationView interface BottomNavOwner { diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/NoModalBottomSheetOwner.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/NoModalBottomSheetOwner.kt index 78c4f29a2..e03f90ad2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/NoModalBottomSheetOwner.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/owners/NoModalBottomSheetOwner.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.main.ui.owners -import org.koitharu.kotatsu.base.ui.widgets.BottomSheetHeaderBar +import org.koitharu.kotatsu.core.ui.widgets.BottomSheetHeaderBar interface NoModalBottomSheetOwner { diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt index 4d09d621a..8a9f8ed3c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/AppProtectHelper.kt @@ -4,13 +4,14 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import org.acra.dialog.CrashReportDialog -import org.koitharu.kotatsu.base.ui.DefaultActivityLifecycleCallbacks import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.DefaultActivityLifecycleCallbacks import javax.inject.Inject import javax.inject.Singleton @Singleton -class AppProtectHelper @Inject constructor(private val settings: AppSettings) : DefaultActivityLifecycleCallbacks { +class AppProtectHelper @Inject constructor(private val settings: AppSettings) : + DefaultActivityLifecycleCallbacks { private var isUnlocked = settings.appPassword.isNullOrEmpty() diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt index d249c493a..a4a693cf5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt @@ -19,10 +19,10 @@ import androidx.biometric.BiometricPrompt.AuthenticationCallback import androidx.core.graphics.Insets import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat import org.koitharu.kotatsu.databinding.ActivityProtectBinding -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat @AndroidEntryPoint class ProtectActivity : @@ -37,10 +37,10 @@ class ProtectActivity : super.onCreate(savedInstanceState) window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) setContentView(ActivityProtectBinding.inflate(layoutInflater)) - binding.editPassword.setOnEditorActionListener(this) - binding.editPassword.addTextChangedListener(this) - binding.buttonNext.setOnClickListener(this) - binding.buttonCancel.setOnClickListener(this) + viewBinding.editPassword.setOnEditorActionListener(this) + viewBinding.editPassword.addTextChangedListener(this) + viewBinding.buttonNext.setOnClickListener(this) + viewBinding.buttonCancel.setOnClickListener(this) viewModel.onError.observe(this, this::onError) viewModel.isLoading.observe(this, this::onLoadingStateChanged) @@ -54,13 +54,13 @@ class ProtectActivity : override fun onStart() { super.onStart() if (!useFingerprint()) { - binding.editPassword.requestFocus() + viewBinding.editPassword.requestFocus() } } override fun onWindowInsetsChanged(insets: Insets) { val basePadding = resources.getDimensionPixelOffset(R.dimen.screen_padding) - binding.root.setPadding( + viewBinding.root.setPadding( basePadding + insets.left, basePadding + insets.top, basePadding + insets.right, @@ -70,14 +70,14 @@ class ProtectActivity : override fun onClick(v: View) { when (v.id) { - R.id.button_next -> viewModel.tryUnlock(binding.editPassword.text?.toString().orEmpty()) + R.id.button_next -> viewModel.tryUnlock(viewBinding.editPassword.text?.toString().orEmpty()) R.id.button_cancel -> finish() } } override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { - return if (actionId == EditorInfo.IME_ACTION_DONE && binding.buttonNext.isEnabled) { - binding.buttonNext.performClick() + return if (actionId == EditorInfo.IME_ACTION_DONE && viewBinding.buttonNext.isEnabled) { + viewBinding.buttonNext.performClick() true } else { false @@ -89,16 +89,16 @@ class ProtectActivity : override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit override fun afterTextChanged(s: Editable?) { - binding.layoutPassword.error = null - binding.buttonNext.isEnabled = !s.isNullOrEmpty() + viewBinding.layoutPassword.error = null + viewBinding.buttonNext.isEnabled = !s.isNullOrEmpty() } private fun onError(e: Throwable) { - binding.layoutPassword.error = e.getDisplayMessage(resources) + viewBinding.layoutPassword.error = e.getDisplayMessage(resources) } private fun onLoadingStateChanged(isLoading: Boolean) { - binding.layoutPassword.isEnabled = !isLoading + viewBinding.layoutPassword.isEnabled = !isLoading } private fun useFingerprint(): Boolean { diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt index a55d15c84..e530a2a7d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt @@ -1,14 +1,14 @@ package org.koitharu.kotatsu.main.ui.protect import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.Job import kotlinx.coroutines.delay -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.exceptions.WrongPasswordException import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent import org.koitharu.kotatsu.parsers.util.md5 -import org.koitharu.kotatsu.utils.SingleLiveEvent +import javax.inject.Inject private const val PASSWORD_COMPARE_DELAY = 1_000L diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt index e4f5c1269..d59ee6788 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt @@ -25,16 +25,16 @@ import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.RetainedLifecycleCoroutineScope +import org.koitharu.kotatsu.core.util.ext.withProgress +import org.koitharu.kotatsu.core.util.progress.ProgressDeferred import org.koitharu.kotatsu.local.data.CbzFilter import org.koitharu.kotatsu.local.data.PagesCache import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.RetainedLifecycleCoroutineScope -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.withProgress -import org.koitharu.kotatsu.utils.progress.ProgressDeferred +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import java.util.LinkedList import java.util.concurrent.atomic.AtomicInteger diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersBottomSheet.kt index 87b92acd5..29caaca0a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersBottomSheet.kt @@ -7,18 +7,18 @@ import android.view.ViewGroup import androidx.fragment.app.FragmentManager import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaChapters import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.RecyclerViewScrollCallback +import org.koitharu.kotatsu.core.util.ext.getParcelableCompat +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.SheetChaptersBinding import org.koitharu.kotatsu.details.ui.adapter.ChaptersAdapter import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.toListItem import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback -import org.koitharu.kotatsu.utils.ext.getParcelableCompat -import org.koitharu.kotatsu.utils.ext.withArgs import javax.inject.Inject import kotlin.math.roundToInt @@ -28,12 +28,12 @@ class ChaptersBottomSheet : BaseBottomSheet(), OnListItemC @Inject lateinit var settings: AppSettings - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetChaptersBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetChaptersBinding { return SheetChaptersBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetChaptersBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val chapters = arguments?.getParcelableCompat(ARG_CHAPTERS)?.chapters if (chapters.isNullOrEmpty()) { dismissAllowingStateLoss() diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt index 9f89886e9..d8382a543 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt @@ -15,11 +15,11 @@ import okio.IOException import okio.buffer import okio.sink import okio.source -import org.koitharu.kotatsu.base.domain.MangaDataRepository +import org.koitharu.kotatsu.core.parser.MangaDataRepository +import org.koitharu.kotatsu.core.util.ext.writeAllCancellable import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.util.toFileNameSafe import org.koitharu.kotatsu.reader.domain.PageLoader -import org.koitharu.kotatsu.utils.ext.writeAllCancellable import java.io.File import javax.inject.Inject import kotlin.coroutines.Continuation diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index b3deab1df..3fff9ab9a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -30,13 +30,21 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaIntent -import org.koitharu.kotatsu.base.ui.BaseFullscreenActivity import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.core.exceptions.resolve.DialogErrorObserver import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ReaderMode +import org.koitharu.kotatsu.core.ui.BaseFullscreenActivity +import org.koitharu.kotatsu.core.util.GridTouchHelper +import org.koitharu.kotatsu.core.util.IdlingDetector +import org.koitharu.kotatsu.core.util.ShareHelper +import org.koitharu.kotatsu.core.util.ext.hasGlobalPoint +import org.koitharu.kotatsu.core.util.ext.isRtl +import org.koitharu.kotatsu.core.util.ext.observeWithPrevious +import org.koitharu.kotatsu.core.util.ext.postDelayed +import org.koitharu.kotatsu.core.util.ext.setValueRounded import org.koitharu.kotatsu.databinding.ActivityReaderBinding import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter @@ -46,14 +54,6 @@ import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState import org.koitharu.kotatsu.reader.ui.thumbnails.OnPageSelectListener import org.koitharu.kotatsu.reader.ui.thumbnails.PagesThumbnailsSheet import org.koitharu.kotatsu.settings.SettingsActivity -import org.koitharu.kotatsu.utils.GridTouchHelper -import org.koitharu.kotatsu.utils.IdlingDetector -import org.koitharu.kotatsu.utils.ShareHelper -import org.koitharu.kotatsu.utils.ext.hasGlobalPoint -import org.koitharu.kotatsu.utils.ext.isRtl -import org.koitharu.kotatsu.utils.ext.observeWithPrevious -import org.koitharu.kotatsu.utils.ext.postDelayed -import org.koitharu.kotatsu.utils.ext.setValueRounded import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -102,16 +102,16 @@ class ReaderActivity : touchHelper = GridTouchHelper(this, this) scrollTimer = scrollTimerFactory.create(this, this) controlDelegate = ReaderControlDelegate(settings, this, this) - binding.toolbarBottom.setOnMenuItemClickListener(::onOptionsItemSelected) - binding.slider.setLabelFormatter(PageLabelFormatter()) - ReaderSliderListener(this, viewModel).attachToSlider(binding.slider) + viewBinding.toolbarBottom.setOnMenuItemClickListener(::onOptionsItemSelected) + viewBinding.slider.setLabelFormatter(PageLabelFormatter()) + ReaderSliderListener(this, viewModel).attachToSlider(viewBinding.slider) insetsDelegate.interceptingWindowInsetsListener = this idlingDetector.bindToLifecycle(this) viewModel.onError.observe( this, DialogErrorObserver( - host = binding.container, + host = viewBinding.container, fragment = null, resolver = exceptionResolver, onResolved = { isResolved -> @@ -134,8 +134,8 @@ class ReaderActivity : viewModel.isInfoBarEnabled.observe(this, ::onReaderBarChanged) viewModel.isBookmarkAdded.observe(this, this::onBookmarkStateChanged) viewModel.onShowToast.observe(this) { msgId -> - Snackbar.make(binding.container, msgId, Snackbar.LENGTH_SHORT) - .setAnchorView(binding.appbarBottom) + Snackbar.make(viewBinding.container, msgId, Snackbar.LENGTH_SHORT) + .setAnchorView(viewBinding.appbarBottom) .show() } } @@ -154,10 +154,10 @@ class ReaderActivity : if (readerManager.currentMode != mode) { readerManager.replace(mode) } - if (binding.appbarTop.isVisible) { + if (viewBinding.appbarTop.isVisible) { lifecycle.postDelayed(hideUiRunnable, TimeUnit.SECONDS.toMillis(1)) } - binding.slider.isRtl = mode == ReaderMode.REVERSED + viewBinding.slider.isRtl = mode == ReaderMode.REVERSED } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -210,29 +210,29 @@ class ReaderActivity : private fun onLoadingStateChanged(isLoading: Boolean) { val hasPages = !viewModel.content.value?.pages.isNullOrEmpty() - binding.layoutLoading.isVisible = isLoading && !hasPages + viewBinding.layoutLoading.isVisible = isLoading && !hasPages if (isLoading && hasPages) { - binding.toastView.show(R.string.loading_) + viewBinding.toastView.show(R.string.loading_) } else { - binding.toastView.hide() + viewBinding.toastView.hide() } - val menu = binding.toolbarBottom.menu + val menu = viewBinding.toolbarBottom.menu menu.findItem(R.id.action_bookmark).isVisible = hasPages menu.findItem(R.id.action_pages_thumbs).isVisible = hasPages } override fun onGridTouch(area: Int) { - controlDelegate.onGridTouch(area, binding.container) + controlDelegate.onGridTouch(area, viewBinding.container) } override fun onProcessTouch(rawX: Int, rawY: Int): Boolean { return if ( rawX <= gestureInsets.left || rawY <= gestureInsets.top || - rawX >= binding.root.width - gestureInsets.right || - rawY >= binding.root.height - gestureInsets.bottom || - binding.appbarTop.hasGlobalPoint(rawX, rawY) || - binding.appbarBottom?.hasGlobalPoint(rawX, rawY) == true + rawX >= viewBinding.root.width - gestureInsets.right || + rawY >= viewBinding.root.height - gestureInsets.bottom || + viewBinding.appbarTop.hasGlobalPoint(rawX, rawY) || + viewBinding.appbarBottom?.hasGlobalPoint(rawX, rawY) == true ) { false } else { @@ -279,14 +279,14 @@ class ReaderActivity : private fun onPageSaved(uri: Uri?) { if (uri != null) { - Snackbar.make(binding.container, R.string.page_saved, Snackbar.LENGTH_LONG) - .setAnchorView(binding.appbarBottom) + Snackbar.make(viewBinding.container, R.string.page_saved, Snackbar.LENGTH_LONG) + .setAnchorView(viewBinding.appbarBottom) .setAction(R.string.share) { ShareHelper(this).shareImage(uri) }.show() } else { - Snackbar.make(binding.container, R.string.error_occurred, Snackbar.LENGTH_SHORT) - .setAnchorView(binding.appbarBottom) + Snackbar.make(viewBinding.container, R.string.error_occurred, Snackbar.LENGTH_SHORT) + .setAnchorView(viewBinding.appbarBottom) .show() } } @@ -300,18 +300,18 @@ class ReaderActivity : } private fun setUiIsVisible(isUiVisible: Boolean) { - if (binding.appbarTop.isVisible != isUiVisible) { + if (viewBinding.appbarTop.isVisible != isUiVisible) { val transition = TransitionSet() .setOrdering(TransitionSet.ORDERING_TOGETHER) - .addTransition(Slide(Gravity.TOP).addTarget(binding.appbarTop)) - .addTransition(Fade().addTarget(binding.infoBar)) - binding.appbarBottom?.let { bottomBar -> + .addTransition(Slide(Gravity.TOP).addTarget(viewBinding.appbarTop)) + .addTransition(Fade().addTarget(viewBinding.infoBar)) + viewBinding.appbarBottom?.let { bottomBar -> transition.addTransition(Slide(Gravity.BOTTOM).addTarget(bottomBar)) } - TransitionManager.beginDelayedTransition(binding.root, transition) - binding.appbarTop.isVisible = isUiVisible - binding.appbarBottom?.isVisible = isUiVisible - binding.infoBar.isGone = isUiVisible || (viewModel.isInfoBarEnabled.value == false) + TransitionManager.beginDelayedTransition(viewBinding.root, transition) + viewBinding.appbarTop.isVisible = isUiVisible + viewBinding.appbarBottom?.isVisible = isUiVisible + viewBinding.infoBar.isGone = isUiVisible || (viewModel.isInfoBarEnabled.value == false) if (isUiVisible) { showSystemUI() } else { @@ -323,12 +323,12 @@ class ReaderActivity : override fun onApplyWindowInsets(v: View, insets: WindowInsetsCompat): WindowInsetsCompat { gestureInsets = insets.getInsets(WindowInsetsCompat.Type.systemGestures()) val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - binding.appbarTop.updatePadding( + viewBinding.appbarTop.updatePadding( top = systemBars.top, right = systemBars.right, left = systemBars.left, ) - binding.appbarBottom?.updatePadding( + viewBinding.appbarBottom?.updatePadding( bottom = systemBars.bottom, right = systemBars.right, left = systemBars.left, @@ -349,7 +349,7 @@ class ReaderActivity : } override fun toggleUiVisibility() { - setUiIsVisible(!binding.appbarTop.isVisible) + setUiIsVisible(!viewBinding.appbarTop.isVisible) } override fun isReaderResumed(): Boolean { @@ -358,21 +358,21 @@ class ReaderActivity : } private fun onReaderBarChanged(isBarEnabled: Boolean) { - binding.infoBar.isVisible = isBarEnabled && binding.appbarTop.isGone + viewBinding.infoBar.isVisible = isBarEnabled && viewBinding.appbarTop.isGone } private fun onBookmarkStateChanged(isAdded: Boolean) { - val menuItem = binding.toolbarBottom.menu.findItem(R.id.action_bookmark) ?: return + val menuItem = viewBinding.toolbarBottom.menu.findItem(R.id.action_bookmark) ?: return menuItem.setTitle(if (isAdded) R.string.bookmark_remove else R.string.bookmark_add) menuItem.setIcon(if (isAdded) R.drawable.ic_bookmark_added else R.drawable.ic_bookmark) } private fun onUiStateChanged(uiState: ReaderUiState?, previous: ReaderUiState?) { title = uiState?.chapterName ?: uiState?.mangaName ?: getString(R.string.loading_) - binding.infoBar.update(uiState) + viewBinding.infoBar.update(uiState) if (uiState == null) { supportActionBar?.subtitle = null - binding.slider.isVisible = false + viewBinding.slider.isVisible = false return } supportActionBar?.subtitle = if (uiState.chapterNumber in 1..uiState.chaptersTotal) { @@ -382,15 +382,15 @@ class ReaderActivity : } if (previous?.chapterName != null && uiState.chapterName != previous.chapterName) { if (!uiState.chapterName.isNullOrEmpty()) { - binding.toastView.showTemporary(uiState.chapterName, TOAST_DURATION) + viewBinding.toastView.showTemporary(uiState.chapterName, TOAST_DURATION) } } if (uiState.isSliderAvailable()) { - binding.slider.valueTo = uiState.totalPages.toFloat() - 1 - binding.slider.setValueRounded(uiState.currentPage.toFloat()) - binding.slider.isVisible = true + viewBinding.slider.valueTo = uiState.totalPages.toFloat() - 1 + viewBinding.slider.setValueRounded(uiState.currentPage.toFloat()) + viewBinding.slider.isVisible = true } else { - binding.slider.isVisible = false + viewBinding.slider.isVisible = false } } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt index 3791ac5c4..62c6cd431 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ReaderMode -import org.koitharu.kotatsu.utils.GridTouchHelper +import org.koitharu.kotatsu.core.util.GridTouchHelper class ReaderControlDelegate( private val settings: AppSettings, diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt index f4fd28289..7c2eb733a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt @@ -17,12 +17,12 @@ import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.getThemeColor +import org.koitharu.kotatsu.core.util.ext.measureDimension +import org.koitharu.kotatsu.core.util.ext.resolveDp import org.koitharu.kotatsu.parsers.util.format import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState -import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.measureDimension -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.resolveDp +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.text.SimpleDateFormat import java.util.Date import com.google.android.material.R as materialR diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index c4d6bdc5b..f092a5c06 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -31,36 +31,36 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.plus import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaDataRepository -import org.koitharu.kotatsu.base.domain.MangaIntent -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository import org.koitharu.kotatsu.core.os.ShortcutsUpdater +import org.koitharu.kotatsu.core.parser.MangaDataRepository +import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ReaderMode import org.koitharu.kotatsu.core.prefs.ScreenshotsPolicy import org.koitharu.kotatsu.core.prefs.observeAsFlow import org.koitharu.kotatsu.core.prefs.observeAsLiveData +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.emitValue +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope +import org.koitharu.kotatsu.core.util.ext.requireValue import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.reader.data.filterChapters import org.koitharu.kotatsu.reader.domain.ChaptersLoader import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.config.ReaderSettings import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.emitValue -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.processLifecycleScope -import org.koitharu.kotatsu.utils.ext.requireValue -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.util.Date import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt index 471ade52d..02a6b00ea 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt @@ -18,18 +18,18 @@ import com.google.android.material.slider.LabelFormatter import com.google.android.material.slider.Slider import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPages +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.decodeRegion +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.indicator +import org.koitharu.kotatsu.core.util.ext.setValueRounded import org.koitharu.kotatsu.databinding.ActivityColorFilterBinding import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.util.format import org.koitharu.kotatsu.reader.domain.ReaderColorFilter -import org.koitharu.kotatsu.utils.ext.decodeRegion -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.indicator -import org.koitharu.kotatsu.utils.ext.setValueRounded import javax.inject.Inject import com.google.android.material.R as materialR @@ -51,13 +51,13 @@ class ColorFilterConfigActivity : setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } - binding.sliderBrightness.addOnChangeListener(this) - binding.sliderContrast.addOnChangeListener(this) + viewBinding.sliderBrightness.addOnChangeListener(this) + viewBinding.sliderContrast.addOnChangeListener(this) val formatter = PercentLabelFormatter(resources) - binding.sliderContrast.setLabelFormatter(formatter) - binding.sliderBrightness.setLabelFormatter(formatter) - binding.buttonDone.setOnClickListener(this) - binding.buttonReset.setOnClickListener(this) + viewBinding.sliderContrast.setLabelFormatter(formatter) + viewBinding.sliderBrightness.setLabelFormatter(formatter) + viewBinding.buttonDone.setOnClickListener(this) + viewBinding.buttonReset.setOnClickListener(this) onBackPressedDispatcher.addCallback(ColorFilterConfigBackPressedDispatcher(this, viewModel)) @@ -86,22 +86,22 @@ class ColorFilterConfigActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) - binding.scrollView.updatePadding( + viewBinding.scrollView.updatePadding( bottom = insets.bottom, ) - binding.toolbar.updateLayoutParams { + viewBinding.toolbar.updateLayoutParams { topMargin = insets.top } } private fun onColorFilterChanged(readerColorFilter: ReaderColorFilter?) { - binding.sliderBrightness.setValueRounded(readerColorFilter?.brightness ?: 0f) - binding.sliderContrast.setValueRounded(readerColorFilter?.contrast ?: 0f) - binding.imageViewAfter.colorFilter = readerColorFilter?.toColorFilter() + viewBinding.sliderBrightness.setValueRounded(readerColorFilter?.brightness ?: 0f) + viewBinding.sliderContrast.setValueRounded(readerColorFilter?.contrast ?: 0f) + viewBinding.imageViewAfter.colorFilter = readerColorFilter?.toColorFilter() } private fun onPreviewChanged(preview: MangaPage?) { @@ -111,18 +111,18 @@ class ColorFilterConfigActivity : .scale(Scale.FILL) .decodeRegion() .tag(preview.source) - .indicator(listOf(binding.progressBefore, binding.progressAfter)) + .indicator(listOf(viewBinding.progressBefore, viewBinding.progressAfter)) .error(R.drawable.ic_error_placeholder) - .size(ViewSizeResolver(binding.imageViewBefore)) + .size(ViewSizeResolver(viewBinding.imageViewBefore)) .allowRgb565(false) - .target(ShadowViewTarget(binding.imageViewBefore, binding.imageViewAfter)) + .target(ShadowViewTarget(viewBinding.imageViewBefore, viewBinding.imageViewAfter)) .enqueueWith(coil) } private fun onLoadingChanged(isLoading: Boolean) { - binding.sliderContrast.isEnabled = !isLoading - binding.sliderBrightness.isEnabled = !isLoading - binding.buttonDone.isEnabled = !isLoading + viewBinding.sliderContrast.isEnabled = !isLoading + viewBinding.sliderBrightness.isEnabled = !isLoading + viewBinding.buttonDone.isEnabled = !isLoading } private class PercentLabelFormatter(resources: Resources) : LabelFormatter { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt index d5b3e517f..22ef8497b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt @@ -4,16 +4,16 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers -import org.koitharu.kotatsu.base.domain.MangaDataRepository -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPages +import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.ext.emitValue import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.reader.domain.ReaderColorFilter import org.koitharu.kotatsu.reader.ui.colorfilter.ColorFilterConfigActivity.Companion.EXTRA_MANGA -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.emitValue import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt index 51c55af04..d83552079 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt @@ -19,18 +19,18 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ReaderMode import org.koitharu.kotatsu.core.prefs.observeAsLiveData +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.util.ScreenOrientationHelper +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.SheetReaderConfigBinding import org.koitharu.kotatsu.reader.ui.PageSaveContract import org.koitharu.kotatsu.reader.ui.ReaderViewModel import org.koitharu.kotatsu.reader.ui.colorfilter.ColorFilterConfigActivity import org.koitharu.kotatsu.settings.SettingsActivity -import org.koitharu.kotatsu.utils.ScreenOrientationHelper -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope -import org.koitharu.kotatsu.utils.ext.withArgs import javax.inject.Inject @AndroidEntryPoint @@ -56,12 +56,12 @@ class ReaderConfigBottomSheet : ?: ReaderMode.STANDARD } - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetReaderConfigBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetReaderConfigBinding { return SheetReaderConfigBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetReaderConfigBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) observeScreenOrientation() binding.buttonStandard.isChecked = mode == ReaderMode.STANDARD binding.buttonReversed.isChecked = mode == ReaderMode.REVERSED @@ -118,8 +118,8 @@ class ReaderConfigBottomSheet : when (buttonView.id) { R.id.switch_scroll_timer -> { findCallback()?.isAutoScrollEnabled = isChecked - binding.labelTimer.isVisible = isChecked - binding.sliderTimer.isVisible = isChecked + requireViewBinding().labelTimer.isVisible = isChecked + requireViewBinding().sliderTimer.isVisible = isChecked } } } @@ -157,7 +157,7 @@ class ReaderConfigBottomSheet : orientationHelper = helper helper.observeAutoOrientation() .onEach { - binding.buttonScreenRotate.isGone = it + requireViewBinding().buttonScreenRotate.isGone = it }.launchIn(viewLifecycleScope) } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt index 3ab378cec..7a289cbdf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt @@ -6,9 +6,9 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.ext.resetTransformations import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.config.ReaderSettings -import org.koitharu.kotatsu.utils.ext.resetTransformations import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderFragment.kt index 954c866c8..7570a9f5c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderFragment.kt @@ -1,14 +1,13 @@ package org.koitharu.kotatsu.reader.ui.pager import android.os.Bundle -import android.view.View import androidx.core.graphics.Insets import androidx.fragment.app.activityViewModels import androidx.viewbinding.ViewBinding -import org.koitharu.kotatsu.base.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.util.ext.getParcelableCompat import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.ReaderViewModel -import org.koitharu.kotatsu.utils.ext.getParcelableCompat private const val KEY_STATE = "state" @@ -17,8 +16,8 @@ abstract class BaseReaderFragment : BaseFragment() { protected val viewModel by activityViewModels() private var stateToSave: ReaderState? = null - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) var restoredState = savedInstanceState?.getParcelableCompat(KEY_STATE) viewModel.content.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt index a517f630a..21a0f4f41 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt @@ -21,7 +21,7 @@ import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.config.ReaderSettings -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import java.io.IOException diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt index 5bf30b8a5..016a7436f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt @@ -1,15 +1,18 @@ package org.koitharu.kotatsu.reader.ui.pager.reversed -import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.core.view.children import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.async import kotlinx.coroutines.launch import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.ext.doOnPageChanged +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled +import org.koitharu.kotatsu.core.util.ext.recyclerView +import org.koitharu.kotatsu.core.util.ext.resetTransformations +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.ReaderState @@ -17,11 +20,6 @@ import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment import org.koitharu.kotatsu.reader.ui.pager.ReaderPage import org.koitharu.kotatsu.reader.ui.pager.standard.PagerReaderFragment -import org.koitharu.kotatsu.utils.ext.doOnPageChanged -import org.koitharu.kotatsu.utils.ext.isAnimationsEnabled -import org.koitharu.kotatsu.utils.ext.recyclerView -import org.koitharu.kotatsu.utils.ext.resetTransformations -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import javax.inject.Inject import kotlin.math.absoluteValue @@ -36,14 +34,13 @@ class ReversedReaderFragment : BaseReaderFragment private var pagerAdapter: ReversedPagesAdapter? = null - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentReaderStandardBinding.inflate(inflater, container, false) - @SuppressLint("NotifyDataSetChanged") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentReaderStandardBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) pagerAdapter = ReversedPagesAdapter( lifecycleOwner = viewLifecycleOwner, loader = pageLoader, @@ -70,18 +67,18 @@ class ReversedReaderFragment : BaseReaderFragment override fun onDestroyView() { pagerAdapter = null - binding.pager.adapter = null + requireViewBinding().pager.adapter = null super.onDestroyView() } override fun switchPageBy(delta: Int) { - with(binding.pager) { + with(requireViewBinding().pager) { setCurrentItem(currentItem - delta, context.isAnimationsEnabled) } } override fun switchPageTo(position: Int, smooth: Boolean) { - with(binding.pager) { + with(requireViewBinding().pager) { setCurrentItem( reversed(position), smooth && context.isAnimationsEnabled && (currentItem - position).absoluteValue < PagerReaderFragment.SMOOTH_SCROLL_LIMIT, @@ -101,7 +98,7 @@ class ReversedReaderFragment : BaseReaderFragment } items.await() ?: return@launch if (position != -1) { - binding.pager.setCurrentItem(position, false) + requireViewBinding().pager.setCurrentItem(position, false) notifyPageChanged(position) } } else { @@ -110,7 +107,7 @@ class ReversedReaderFragment : BaseReaderFragment } } - override fun getCurrentState(): ReaderState? = bindingOrNull()?.run { + override fun getCurrentState(): ReaderState? = viewBinding?.run { val adapter = pager.adapter as? BaseReaderAdapter<*> val page = adapter?.getItemOrNull(pager.currentItem) ?: return@run null ReaderState( diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt index 6d8076baf..eb5927fb1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt @@ -12,12 +12,15 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.ifZero +import org.koitharu.kotatsu.core.util.ext.isLowRamDevice import org.koitharu.kotatsu.databinding.ItemPageBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.config.ReaderSettings import org.koitharu.kotatsu.reader.ui.pager.BasePageHolder import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.* +import org.koitharu.kotatsu.util.ext.* open class PageHolder( owner: LifecycleOwner, @@ -31,7 +34,7 @@ open class PageHolder( init { binding.ssiv.bindToLifecycle(owner) - binding.ssiv.isEagerLoadingEnabled = !isLowRamDevice(context) + binding.ssiv.isEagerLoadingEnabled = !context.isLowRamDevice() binding.ssiv.addOnImageEventListener(delegate) @Suppress("LeakingThis") bindingInfo.buttonRetry.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt index 75462cfb0..19815597b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt @@ -1,26 +1,24 @@ package org.koitharu.kotatsu.reader.ui.pager.standard -import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.core.view.children import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.async import kotlinx.coroutines.launch import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.ext.doOnPageChanged +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled +import org.koitharu.kotatsu.core.util.ext.recyclerView +import org.koitharu.kotatsu.core.util.ext.resetTransformations +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.doOnPageChanged -import org.koitharu.kotatsu.utils.ext.isAnimationsEnabled -import org.koitharu.kotatsu.utils.ext.recyclerView -import org.koitharu.kotatsu.utils.ext.resetTransformations -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import javax.inject.Inject import kotlin.math.absoluteValue @@ -35,14 +33,13 @@ class PagerReaderFragment : BaseReaderFragment() private var pagesAdapter: PagesAdapter? = null - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentReaderStandardBinding.inflate(inflater, container, false) - @SuppressLint("NotifyDataSetChanged") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentReaderStandardBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) pagesAdapter = PagesAdapter( lifecycleOwner = viewLifecycleOwner, loader = pageLoader, @@ -69,7 +66,7 @@ class PagerReaderFragment : BaseReaderFragment() override fun onDestroyView() { pagesAdapter = null - binding.pager.adapter = null + requireViewBinding().pager.adapter = null super.onDestroyView() } @@ -84,7 +81,7 @@ class PagerReaderFragment : BaseReaderFragment() } items.await() ?: return@launch if (position != -1) { - binding.pager.setCurrentItem(position, false) + requireViewBinding().pager.setCurrentItem(position, false) notifyPageChanged(position) } } else { @@ -94,13 +91,13 @@ class PagerReaderFragment : BaseReaderFragment() } override fun switchPageBy(delta: Int) { - with(binding.pager) { + with(requireViewBinding().pager) { setCurrentItem(currentItem + delta, context.isAnimationsEnabled) } } override fun switchPageTo(position: Int, smooth: Boolean) { - with(binding.pager) { + with(requireViewBinding().pager) { setCurrentItem( position, smooth && context.isAnimationsEnabled && (currentItem - position).absoluteValue < SMOOTH_SCROLL_LIMIT, @@ -108,7 +105,7 @@ class PagerReaderFragment : BaseReaderFragment() } } - override fun getCurrentState(): ReaderState? = bindingOrNull()?.run { + override fun getCurrentState(): ReaderState? = viewBinding?.run { val adapter = pager.adapter as? BaseReaderAdapter<*> val page = adapter?.getItemOrNull(pager.currentItem) ?: return@run null ReaderState( diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt index 1301a96b0..f5a936ad6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt @@ -10,14 +10,14 @@ import com.davemorrissey.labs.subscaleview.decoder.SkiaPooledImageRegionDecoder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.GoneOnInvisibleListener +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.ifZero import org.koitharu.kotatsu.databinding.ItemPageWebtoonBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.config.ReaderSettings import org.koitharu.kotatsu.reader.ui.pager.BasePageHolder import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.GoneOnInvisibleListener -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.ifZero class WebtoonHolder( owner: LifecycleOwner, diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt index 55aa6540a..d27a05669 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt @@ -5,8 +5,8 @@ import android.graphics.PointF import android.util.AttributeSet import androidx.recyclerview.widget.RecyclerView import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView +import org.koitharu.kotatsu.core.util.ext.parents import org.koitharu.kotatsu.parsers.util.toIntUp -import org.koitharu.kotatsu.utils.ext.parents private const val SCROLL_UNKNOWN = -1 diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt index e836c7fd0..b8f2eac37 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt @@ -2,23 +2,22 @@ package org.koitharu.kotatsu.reader.ui.pager.webtoon import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.view.animation.AccelerateDecelerateInterpolator import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.async import kotlinx.coroutines.launch import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition +import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.findCenterViewPosition -import org.koitharu.kotatsu.utils.ext.firstVisibleItemPosition -import org.koitharu.kotatsu.utils.ext.isAnimationsEnabled -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import javax.inject.Inject @AndroidEntryPoint @@ -33,13 +32,13 @@ class WebtoonReaderFragment : BaseReaderFragment() private val scrollInterpolator = AccelerateDecelerateInterpolator() private var webtoonAdapter: WebtoonAdapter? = null - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentReaderWebtoonBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentReaderWebtoonBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) webtoonAdapter = WebtoonAdapter( lifecycleOwner = viewLifecycleOwner, loader = pageLoader, @@ -60,7 +59,7 @@ class WebtoonReaderFragment : BaseReaderFragment() override fun onDestroyView() { webtoonAdapter = null - binding.recyclerView.adapter = null + requireViewBinding().recyclerView.adapter = null super.onDestroyView() } @@ -73,7 +72,7 @@ class WebtoonReaderFragment : BaseReaderFragment() } setItems.await() ?: return@launch if (position != -1) { - with(binding.recyclerView) { + with(requireViewBinding().recyclerView) { firstVisibleItemPosition = position post { (findViewHolderForAdapterPosition(position) as? WebtoonHolder) @@ -88,7 +87,7 @@ class WebtoonReaderFragment : BaseReaderFragment() } } - override fun getCurrentState(): ReaderState? = bindingOrNull()?.run { + override fun getCurrentState(): ReaderState? = viewBinding?.run { val currentItem = recyclerView.findCenterViewPosition() val adapter = recyclerView.adapter as? BaseReaderAdapter<*> val page = adapter?.getItemOrNull(currentItem) ?: return@run null @@ -105,7 +104,7 @@ class WebtoonReaderFragment : BaseReaderFragment() } override fun switchPageBy(delta: Int) { - with(binding.recyclerView) { + with(requireViewBinding().recyclerView) { if (context.isAnimationsEnabled) { smoothScrollBy(0, (height * 0.9).toInt() * delta, scrollInterpolator) } else { @@ -115,11 +114,11 @@ class WebtoonReaderFragment : BaseReaderFragment() } override fun switchPageTo(position: Int, smooth: Boolean) { - binding.recyclerView.firstVisibleItemPosition = position + requireViewBinding().recyclerView.firstVisibleItemPosition = position } override fun scrollBy(delta: Int): Boolean { - binding.recyclerView.nestedScrollBy(0, delta) + requireViewBinding().recyclerView.nestedScrollBy(0, delta) return true } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt index aa28971af..2a0acaee3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt @@ -4,8 +4,8 @@ import android.content.Context import android.util.AttributeSet import androidx.core.view.ViewCompat.TYPE_TOUCH import androidx.recyclerview.widget.RecyclerView -import org.koitharu.kotatsu.utils.ext.findCenterViewPosition -import java.util.* +import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition +import java.util.LinkedList class WebtoonRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 @@ -60,6 +60,7 @@ class WebtoonRecyclerView @JvmOverloads constructor( } return consumedByChild } + dy < 0 -> { val child = getChildAt(childCount - 1) as WebtoonFrameLayout var consumedByChild = child.dispatchVerticalScroll(dy) @@ -113,4 +114,4 @@ class WebtoonRecyclerView @JvmOverloads constructor( open fun onPageChanged(recyclerView: WebtoonRecyclerView, index: Int) = Unit } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt index 80aee22e9..b4fe13b2f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt @@ -11,15 +11,17 @@ import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet -import org.koitharu.kotatsu.base.ui.list.BoundsScrollListener -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.ScrollListenerInvalidationObserver -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration -import org.koitharu.kotatsu.base.ui.widgets.BottomSheetHeaderBar import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.list.BoundsScrollListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.ScrollListenerInvalidationObserver +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.widgets.BottomSheetHeaderBar +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.SheetPagesBinding import org.koitharu.kotatsu.list.ui.MangaListSpanResolver import org.koitharu.kotatsu.parsers.model.Manga @@ -27,9 +29,7 @@ import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.thumbnails.adapter.PageThumbnailAdapter import org.koitharu.kotatsu.reader.ui.thumbnails.adapter.TargetScrollObserver -import org.koitharu.kotatsu.utils.LoggingAdapterDataObserver -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf -import org.koitharu.kotatsu.utils.ext.withArgs +import org.koitharu.kotatsu.util.LoggingAdapterDataObserver import javax.inject.Inject @AndroidEntryPoint @@ -55,13 +55,13 @@ class PagesThumbnailsSheet : spanSizeLookup.invalidateCache() } - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetPagesBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetPagesBinding { return SheetPagesBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - spanResolver = MangaListSpanResolver(view.resources) + override fun onViewBindingCreated(binding: SheetPagesBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) + spanResolver = MangaListSpanResolver(binding.root.resources) with(binding.headerBar) { title = viewModel.title subtitle = null @@ -143,8 +143,7 @@ class PagesThumbnailsSheet : } override fun getSpanSize(position: Int): Int { - val total = - (binding.recyclerView.layoutManager as? GridLayoutManager)?.spanCount ?: return 1 + val total = (viewBinding?.recyclerView?.layoutManager as? GridLayoutManager)?.spanCount ?: return 1 return when (thumbnailsAdapter?.getItemViewType(position)) { PageThumbnailAdapter.ITEM_TYPE_THUMBNAIL -> 1 else -> total diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsViewModel.kt index 00401578b..bf9e86070 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsViewModel.kt @@ -5,16 +5,16 @@ import androidx.lifecycle.SavedStateHandle import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.ext.emitValue import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingFooter import org.koitharu.kotatsu.parsers.util.SuspendLazy import org.koitharu.kotatsu.reader.data.filterChapters import org.koitharu.kotatsu.reader.domain.ChaptersLoader -import org.koitharu.kotatsu.utils.ext.emitValue import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAD.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAD.kt index 3ec91573f..62ab44cb9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAD.kt @@ -6,17 +6,17 @@ import coil.size.Scale import coil.size.Size import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.decodeRegion +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.setTextColorAttr +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemPageThumbBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.reader.ui.thumbnails.PageThumbnail -import org.koitharu.kotatsu.utils.ext.decodeRegion -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.setTextColorAttr -import org.koitharu.kotatsu.utils.ext.source import com.google.android.material.R as materialR fun pageThumbnailAD( diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAdapter.kt index 4fffe12e3..e1169638a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/adapter/PageThumbnailAdapter.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.list.ui.adapter.listHeaderAD import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD import org.koitharu.kotatsu.list.ui.model.ListHeader diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt index e597c90a5..c441f6974 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt @@ -11,23 +11,24 @@ import androidx.core.view.MenuProvider import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.core.util.ext.withArgs +import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.list.ui.filter.FilterBottomSheet import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.search.ui.SearchActivity import org.koitharu.kotatsu.settings.SettingsActivity -import org.koitharu.kotatsu.utils.ext.addMenuProvider -import org.koitharu.kotatsu.utils.ext.withArgs @AndroidEntryPoint class RemoteListFragment : MangaListFragment() { public override val viewModel by viewModels() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) addMenuProvider(RemoteListMenuProvider()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index 6601551db..a7a1fb73d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -15,12 +15,14 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaDataRepository -import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.require import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.filter.FilterCoordinator @@ -38,9 +40,7 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.search.domain.MangaSearchRepository -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.require +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.util.LinkedList import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/anilist/data/ScoreFormat.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/anilist/data/ScoreFormat.kt index 2683d01b4..1d4e04c41 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/anilist/data/ScoreFormat.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/anilist/data/ScoreFormat.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.scrobbling.anilist.data -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug enum class ScoreFormat { diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt index 5eb3ebec7..3cd124561 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt @@ -10,7 +10,9 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import org.koitharu.kotatsu.core.db.MangaDatabase +import org.koitharu.kotatsu.core.util.ext.findKeyByValue import org.koitharu.kotatsu.parsers.model.MangaChapter +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerMangaInfo @@ -18,9 +20,7 @@ import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerUser import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus -import org.koitharu.kotatsu.utils.ext.findKeyByValue -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.util.EnumMap abstract class Scrobbler( @@ -53,7 +53,7 @@ abstract class Scrobbler( return repository.loadUser() } - suspend fun logout() { + fun logout() { repository.logout() } diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt index ccfcc2186..4cc7c0963 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigActivity.kt @@ -12,10 +12,13 @@ import coil.ImageLoader import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.decor.TypedSpacingItemDecoration import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.decor.TypedSpacingItemDecoration +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest import org.koitharu.kotatsu.databinding.ActivityScrobblerConfigBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService @@ -23,9 +26,6 @@ import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerUser import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.scrobbling.common.ui.config.adapter.ScrobblingMangaAdapter import org.koitharu.kotatsu.tracker.ui.feed.adapter.FeedAdapter -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest import javax.inject.Inject @AndroidEntryPoint @@ -47,7 +47,7 @@ class ScrobblerConfigActivity : BaseActivity(), supportActionBar?.setDisplayHomeAsUpEnabled(true) val listAdapter = ScrobblingMangaAdapter(this, coil, this) - with(binding.recyclerView) { + with(viewBinding.recyclerView) { adapter = listAdapter setHasFixedSize(true) val spacing = resources.getDimensionPixelOffset(R.dimen.list_spacing) @@ -59,12 +59,12 @@ class ScrobblerConfigActivity : BaseActivity(), ) addItemDecoration(decoration) } - binding.imageViewAvatar.setOnClickListener(this) + viewBinding.imageViewAvatar.setOnClickListener(this) viewModel.content.observe(this, listAdapter::setItems) viewModel.user.observe(this, this::onUserChanged) viewModel.isLoading.observe(this, this::onLoadingStateChanged) - viewModel.onError.observe(this, SnackbarErrorObserver(binding.recyclerView, null)) + viewModel.onError.observe(this, SnackbarErrorObserver(viewBinding.recyclerView, null)) viewModel.onLoggedOut.observe(this) { finishAfterTransition() } @@ -81,7 +81,7 @@ class ScrobblerConfigActivity : BaseActivity(), } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + viewBinding.recyclerView.updatePadding( left = insets.left + paddingHorizontal, right = insets.right + paddingHorizontal, bottom = insets.bottom + paddingVertical, @@ -112,17 +112,17 @@ class ScrobblerConfigActivity : BaseActivity(), private fun onUserChanged(user: ScrobblerUser?) { if (user == null) { - binding.imageViewAvatar.disposeImageRequest() - binding.imageViewAvatar.isVisible = false + viewBinding.imageViewAvatar.disposeImageRequest() + viewBinding.imageViewAvatar.isVisible = false return } - binding.imageViewAvatar.isVisible = true - binding.imageViewAvatar.newImageRequest(this, user.avatar) + viewBinding.imageViewAvatar.isVisible = true + viewBinding.imageViewAvatar.newImageRequest(this, user.avatar) ?.enqueueWith(coil) } private fun onLoadingStateChanged(isLoading: Boolean) { - binding.progressBar.run { + viewBinding.progressBar.run { if (isLoading) { show() } else { diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigViewModel.kt index 84826d62e..1096123eb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/ScrobblerConfigViewModel.kt @@ -13,8 +13,13 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.plus import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.emitValue +import org.koitharu.kotatsu.core.util.ext.onFirst +import org.koitharu.kotatsu.core.util.ext.require import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler @@ -22,11 +27,6 @@ import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerUser import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.emitValue -import org.koitharu.kotatsu.utils.ext.onFirst -import org.koitharu.kotatsu.utils.ext.require import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt index 04c978f66..483f90b5e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAD.kt @@ -4,14 +4,14 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest import org.koitharu.kotatsu.databinding.ItemScrobblingMangaBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest fun scrobblingMangaAD( clickListener: OnListItemClickListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt index b33887675..4e0c4e913 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/config/adapter/ScrobblingMangaAdapter.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorBottomSheet.kt index 76b5d8de0..37502d42a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorBottomSheet.kt @@ -14,12 +14,15 @@ import coil.ImageLoader import com.google.android.material.tabs.TabLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaIntent -import org.koitharu.kotatsu.base.ui.BaseBottomSheet -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.PaginationScrollListener -import org.koitharu.kotatsu.base.ui.util.CollapseActionViewCallback import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.parser.MangaIntent +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.PaginationScrollListener +import org.koitharu.kotatsu.core.ui.util.CollapseActionViewCallback +import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.SheetScrobblingSelectorBinding import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.parsers.model.Manga @@ -27,9 +30,6 @@ import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.ui.selector.adapter.ScrobblerMangaSelectionDecoration import org.koitharu.kotatsu.scrobbling.common.ui.selector.adapter.ScrobblerSelectorAdapter -import org.koitharu.kotatsu.utils.ext.firstVisibleItemPosition -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.withArgs import javax.inject.Inject @AndroidEntryPoint @@ -50,14 +50,14 @@ class ScrobblingSelectorBottomSheet : private val viewModel by viewModels() - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingSelectorBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingSelectorBinding { return SheetScrobblingSelectorBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetScrobblingSelectorBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val listAdapter = ScrobblerSelectorAdapter(viewLifecycleOwner, coil, this, this) - val decoration = ScrobblerMangaSelectionDecoration(view.context) + val decoration = ScrobblerMangaSelectionDecoration(binding.root.context) with(binding.recyclerView) { adapter = listAdapter addItemDecoration(decoration) @@ -133,7 +133,7 @@ class ScrobblingSelectorBottomSheet : return false } viewModel.search(query) - binding.headerBar.menu.findItem(R.id.action_search)?.collapseActionView() + requireViewBinding().headerBar.menu.findItem(R.id.action_search)?.collapseActionView() return true } @@ -149,11 +149,11 @@ class ScrobblingSelectorBottomSheet : if (!isExpanded) { setExpanded(isExpanded = true, isLocked = behavior?.isDraggable == false) } - binding.recyclerView.firstVisibleItemPosition = 0 + requireViewBinding().recyclerView.firstVisibleItemPosition = 0 } private fun openSearch() { - val menuItem = binding.headerBar.menu.findItem(R.id.action_search) ?: return + val menuItem = requireViewBinding().headerBar.menu.findItem(R.id.action_search) ?: return menuItem.expandActionView() } @@ -165,8 +165,8 @@ class ScrobblingSelectorBottomSheet : } private fun initOptionsMenu() { - binding.headerBar.inflateMenu(R.menu.opt_shiki_selector) - val searchMenuItem = binding.headerBar.menu.findItem(R.id.action_search) + requireViewBinding().headerBar.inflateMenu(R.menu.opt_shiki_selector) + val searchMenuItem = requireViewBinding().headerBar.menu.findItem(R.id.action_search) searchMenuItem.setOnActionExpandListener(this) val searchView = searchMenuItem.actionView as SearchView searchView.setOnQueryTextListener(this) @@ -179,7 +179,7 @@ class ScrobblingSelectorBottomSheet : private fun initTabs() { val entries = viewModel.availableScrobblers - val tabs = binding.tabs + val tabs = requireViewBinding().tabs if (entries.size <= 1) { tabs.isVisible = false return diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorViewModel.kt index 495a68883..c27419e5d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/ScrobblingSelectorViewModel.kt @@ -11,9 +11,14 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaIntent -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga +import org.koitharu.kotatsu.core.parser.MangaIntent +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.emitValue +import org.koitharu.kotatsu.core.util.ext.require +import org.koitharu.kotatsu.core.util.ext.requireValue import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingFooter import org.koitharu.kotatsu.list.ui.model.LoadingState @@ -21,12 +26,7 @@ import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga import org.koitharu.kotatsu.scrobbling.common.ui.selector.model.ScrobblerHint -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.emitValue -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.require -import org.koitharu.kotatsu.utils.ext.requireValue +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerHintAD.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerHintAD.kt index 90926f9fa..ea14d0a6c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerHintAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerHintAD.kt @@ -1,13 +1,13 @@ package org.koitharu.kotatsu.scrobbling.common.ui.selector.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemEmptyHintBinding import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.scrobbling.common.ui.selector.model.ScrobblerHint -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.setTextAndVisible -import org.koitharu.kotatsu.utils.ext.textAndVisible fun scrobblerHintAD( listener: ListStateHolderListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerMangaSelectionDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerMangaSelectionDecoration.kt index 5b74f913a..4fa7f1a6c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerMangaSelectionDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerMangaSelectionDecoration.kt @@ -7,9 +7,9 @@ import android.graphics.RectF import android.view.View import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.NO_ID +import org.koitharu.kotatsu.core.util.ext.getItem import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga -import org.koitharu.kotatsu.utils.ext.getItem class ScrobblerMangaSelectionDecoration(context: Context) : MangaSelectionDecoration(context) { diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerSelectorAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerSelectorAdapter.kt index 9ed58c8e4..c39a79846 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerSelectorAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblerSelectorAdapter.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt index 79487a484..28b73ce01 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/common/ui/selector/adapter/ScrobblingMangaAD.kt @@ -4,14 +4,14 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemMangaListBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.textAndVisible fun scrobblingMangaAD( lifecycleOwner: LifecycleOwner, diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt index 9e4c90289..9ddf0aacb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt @@ -9,6 +9,7 @@ import okhttp3.Request import org.json.JSONObject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.db.MangaDatabase +import org.koitharu.kotatsu.core.util.ext.toRequestBody import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.parsers.util.json.getStringOrNull @@ -23,7 +24,6 @@ import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerMangaInfo import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerUser -import org.koitharu.kotatsu.utils.ext.toRequestBody private const val REDIRECT_URI = "kotatsu://shikimori-auth" private const val BASE_URL = "https://shikimori.me/" diff --git a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt index 80d3dce0f..79c106a80 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt @@ -20,8 +20,8 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.util.levenshteinDistance +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable import javax.inject.Inject @Reusable diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt index c1063de8c..1dd93c2a2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt @@ -9,16 +9,16 @@ import androidx.fragment.app.commit import com.google.android.material.appbar.AppBarLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaTags +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat +import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat import org.koitharu.kotatsu.databinding.ActivityContainerBinding import org.koitharu.kotatsu.local.ui.LocalListFragment import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat -import org.koitharu.kotatsu.utils.ext.getSerializableExtraCompat @AndroidEntryPoint class MangaListActivity : @@ -26,7 +26,7 @@ class MangaListActivity : AppBarOwner { override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -57,7 +57,7 @@ class MangaListActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt index f86f82b3e..f36639dec 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt @@ -11,12 +11,12 @@ import androidx.core.view.updatePadding import androidx.fragment.app.commit import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat +import org.koitharu.kotatsu.core.util.ext.showKeyboard import org.koitharu.kotatsu.databinding.ActivitySearchBinding import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionViewModel -import org.koitharu.kotatsu.utils.ext.getSerializableExtraCompat -import org.koitharu.kotatsu.utils.ext.showKeyboard @AndroidEntryPoint class SearchActivity : BaseActivity(), SearchView.OnQueryTextListener { @@ -34,7 +34,7 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery val query = intent.getStringExtra(EXTRA_QUERY) supportActionBar?.setDisplayHomeAsUpEnabled(true) searchSuggestionViewModel.isIncognitoModeEnabled.observe(this, this::onIncognitoModeChanged) - with(binding.searchView) { + with(viewBinding.searchView) { queryHint = getString(R.string.search_on_s, source.title) setOnQueryTextListener(this@SearchActivity) @@ -48,11 +48,11 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbar.updatePadding( + viewBinding.toolbar.updatePadding( left = insets.left, right = insets.right, ) - binding.container.updatePadding( + viewBinding.container.updatePadding( bottom = insets.bottom, ) } @@ -67,7 +67,7 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery setReorderingAllowed(true) replace(R.id.container, SearchFragment.newInstance(source, q)) } - binding.searchView.clearFocus() + viewBinding.searchView.clearFocus() searchSuggestionViewModel.saveQuery(q) return true } @@ -75,13 +75,13 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery override fun onQueryTextChange(newText: String?): Boolean = false private fun onIncognitoModeChanged(isIncognito: Boolean) { - var options = binding.searchView.imeOptions + var options = viewBinding.searchView.imeOptions options = if (isIncognito) { options or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING } else { options and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() } - binding.searchView.imeOptions = options + viewBinding.searchView.imeOptions = options } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchFragment.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchFragment.kt index b5fa580fe..6e8b9683a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchFragment.kt @@ -5,10 +5,10 @@ import androidx.appcompat.view.ActionMode import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.ext.withArgs @AndroidEntryPoint class SearchFragment : MangaListFragment() { diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt index f6e1571f7..7c442d0b1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt @@ -12,6 +12,8 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.require import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -22,8 +24,6 @@ import org.koitharu.kotatsu.list.ui.model.toErrorFooter import org.koitharu.kotatsu.list.ui.model.toErrorState import org.koitharu.kotatsu.list.ui.model.toUi import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.require import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt index 96ab9c1b2..0e0c59362 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt @@ -14,11 +14,14 @@ import androidx.core.view.updatePadding import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.list.ListSelectionController -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ShareHelper +import org.koitharu.kotatsu.core.util.ext.invalidateNestedItemDecorations +import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf import org.koitharu.kotatsu.databinding.ActivitySearchMultiBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.download.ui.worker.DownloadStartedObserver @@ -33,9 +36,6 @@ import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.search.ui.MangaListActivity import org.koitharu.kotatsu.search.ui.SearchActivity import org.koitharu.kotatsu.search.ui.multi.adapter.MultiSearchAdapter -import org.koitharu.kotatsu.utils.ShareHelper -import org.koitharu.kotatsu.utils.ext.invalidateNestedItemDecorations -import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf import javax.inject.Inject @AndroidEntryPoint @@ -80,8 +80,8 @@ class MultiSearchActivity : sizeResolver = sizeResolver, selectionDecoration = selectionDecoration, ) - binding.recyclerView.adapter = adapter - binding.recyclerView.setHasFixedSize(true) + viewBinding.recyclerView.adapter = adapter + viewBinding.recyclerView.setHasFixedSize(true) supportActionBar?.run { setDisplayHomeAsUpEnabled(true) @@ -90,16 +90,16 @@ class MultiSearchActivity : viewModel.query.observe(this) { title = it } viewModel.list.observe(this) { adapter.items = it } - viewModel.onError.observe(this, SnackbarErrorObserver(binding.recyclerView, null)) - viewModel.onDownloadStarted.observe(this, DownloadStartedObserver(binding.recyclerView)) + viewModel.onError.observe(this, SnackbarErrorObserver(viewBinding.recyclerView, null)) + viewModel.onDownloadStarted.observe(this, DownloadStartedObserver(viewBinding.recyclerView)) } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) - binding.recyclerView.updatePadding( + viewBinding.recyclerView.updatePadding( bottom = insets.bottom, ) } @@ -142,7 +142,7 @@ class MultiSearchActivity : override fun onListHeaderClick(item: ListHeader, view: View) = Unit override fun onSelectionChanged(controller: ListSelectionController, count: Int) { - binding.recyclerView.invalidateNestedItemDecorations() + viewBinding.recyclerView.invalidateNestedItemDecorations() } override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean { diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt index 83c99f126..1a420e11f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt @@ -15,11 +15,14 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.exceptions.CompositeException import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.emitValue import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel @@ -28,11 +31,8 @@ import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.list.ui.model.toErrorState import org.koitharu.kotatsu.list.ui.model.toUi import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.emitValue -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject private const val MAX_PARALLELISM = 4 diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt index 05ff6f427..5abb41e8c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt @@ -5,7 +5,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration import org.koitharu.kotatsu.list.ui.adapter.MangaListListener diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/SearchResultsAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/SearchResultsAD.kt index 71b90aa10..2fdcf1b90 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/SearchResultsAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/SearchResultsAD.kt @@ -7,9 +7,9 @@ import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.ListDelegationAdapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.databinding.ItemListGroupBinding import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration @@ -27,12 +27,12 @@ fun searchResultsAD( listener: OnListItemClickListener, itemClickListener: OnListItemClickListener, ) = adapterDelegateViewBinding( - { layoutInflater, parent -> ItemListGroupBinding.inflate(layoutInflater, parent, false) } + { layoutInflater, parent -> ItemListGroupBinding.inflate(layoutInflater, parent, false) }, ) { binding.recyclerView.setRecycledViewPool(sharedPool) val adapter = ListDelegationAdapter( - mangaGridItemAD(coil, lifecycleOwner, listener, sizeResolver) + mangaGridItemAD(coil, lifecycleOwner, listener, sizeResolver), ) binding.recyclerView.addItemDecoration(selectionDecoration) binding.recyclerView.adapter = adapter @@ -47,4 +47,4 @@ fun searchResultsAD( adapter.notifyDataSetChanged() adapter.items = item.list } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionFragment.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionFragment.kt index c7162aad8..bc77594e9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionFragment.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.search.ui.suggestion import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.core.graphics.Insets import androidx.core.view.updatePadding @@ -10,12 +9,12 @@ import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.ItemTouchHelper import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.util.ext.addMenuProvider import org.koitharu.kotatsu.databinding.FragmentSearchSuggestionBinding import org.koitharu.kotatsu.search.ui.suggestion.adapter.SearchSuggestionAdapter -import org.koitharu.kotatsu.utils.ext.addMenuProvider +import javax.inject.Inject @AndroidEntryPoint class SearchSuggestionFragment : @@ -27,19 +26,19 @@ class SearchSuggestionFragment : private val viewModel by activityViewModels() - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentSearchSuggestionBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentSearchSuggestionBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val adapter = SearchSuggestionAdapter( coil = coil, lifecycleOwner = viewLifecycleOwner, listener = requireActivity() as SearchSuggestionListener, ) - addMenuProvider(SearchSuggestionMenuProvider(view.context, viewModel)) + addMenuProvider(SearchSuggestionMenuProvider(binding.root.context, viewModel)) binding.root.adapter = adapter binding.root.setHasFixedSize(true) viewModel.suggestion.observe(viewLifecycleOwner) { @@ -51,7 +50,7 @@ class SearchSuggestionFragment : override fun onWindowInsetsChanged(insets: Insets) { val extraPadding = resources.getDimensionPixelOffset(R.dimen.list_spacing) - binding.root.updatePadding( + requireViewBinding().root.updatePadding( top = extraPadding, right = insets.right, left = insets.left, diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionItemCallback.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionItemCallback.kt index 7c65c7c42..84120ad16 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionItemCallback.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionItemCallback.kt @@ -2,9 +2,9 @@ package org.koitharu.kotatsu.search.ui.suggestion import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView +import org.koitharu.kotatsu.core.util.ext.getItem import org.koitharu.kotatsu.search.ui.suggestion.adapter.SEARCH_SUGGESTION_ITEM_TYPE_QUERY import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem -import org.koitharu.kotatsu.utils.ext.getItem class SearchSuggestionItemCallback( private val listener: SuggestionItemListener, @@ -12,7 +12,7 @@ class SearchSuggestionItemCallback( private val movementFlags = makeMovementFlags( 0, - ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT, ) override fun getMovementFlags( @@ -39,4 +39,4 @@ class SearchSuggestionItemCallback( fun onRemoveQuery(query: String) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt index 6853f2d18..9862e195f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt @@ -15,16 +15,16 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.plus -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow import org.koitharu.kotatsu.core.prefs.observeAsLiveData +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.util.ext.emitValue import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem -import org.koitharu.kotatsu.utils.ext.emitValue import javax.inject.Inject private const val DEBOUNCE_TIMEOUT = 500L diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt index 5d713a300..6552643a1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionSourceAD.kt @@ -4,14 +4,14 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.core.parser.favicon.faviconUri +import org.koitharu.kotatsu.core.ui.image.FaviconFallbackDrawable +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemSearchSuggestionSourceBinding import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable fun searchSuggestionSourceAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionTagsAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionTagsAD.kt index 25e3eaf7d..7360de65c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionTagsAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionTagsAD.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.search.ui.suggestion.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.ui.widgets.ChipsView import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem @@ -20,4 +20,4 @@ fun searchSuggestionTagsAD( bind { chipGroup.setChips(item.tags) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt index 992ebfd9b..f678ca53c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/adapter/SearchSuggestionsMangaListAD.kt @@ -9,16 +9,16 @@ import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.util.RecyclerViewScrollCallback +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemSearchSuggestionMangaGridBinding import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem -import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source fun searchSuggestionMangaListAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/model/SearchSuggestionItem.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/model/SearchSuggestionItem.kt index 572d9c75b..8d720e2d1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/model/SearchSuggestionItem.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/model/SearchSuggestionItem.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.search.ui.suggestion.model -import android.net.Uri -import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.ui.widgets.ChipsView import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.areItemsEquals @@ -42,9 +41,7 @@ sealed interface SearchSuggestionItem { other as RecentQuery - if (query != other.query) return false - - return true + return query == other.query } override fun hashCode(): Int { @@ -64,9 +61,7 @@ sealed interface SearchSuggestionItem { other as Source if (source != other.source) return false - if (isEnabled != other.isEnabled) return false - - return true + return isEnabled == other.isEnabled } override fun hashCode(): Int { @@ -86,9 +81,7 @@ sealed interface SearchSuggestionItem { other as Tags - if (tags != other.tags) return false - - return true + return tags == other.tags } override fun hashCode(): Int { diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt index 2c00a1310..417e48d94 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/widget/SearchEditText.kt @@ -16,9 +16,9 @@ import androidx.annotation.AttrRes import androidx.appcompat.widget.AppCompatEditText import androidx.core.content.ContextCompat import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.drawableEnd +import org.koitharu.kotatsu.core.util.ext.drawableStart import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener -import org.koitharu.kotatsu.utils.ext.drawableEnd -import org.koitharu.kotatsu.utils.ext.drawableStart import com.google.android.material.R as materialR private const val DRAWABLE_END = 2 diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt index d46df2738..468ffb0fa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt @@ -16,19 +16,19 @@ import androidx.preference.Preference import androidx.preference.TwoStatePreference import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment -import org.koitharu.kotatsu.base.ui.util.ActivityRecreationHandle import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.ui.util.ActivityRecreationHandle +import org.koitharu.kotatsu.core.util.ext.getLocalesConfig +import org.koitharu.kotatsu.core.util.ext.map +import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat +import org.koitharu.kotatsu.core.util.ext.toList import org.koitharu.kotatsu.parsers.util.names import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity import org.koitharu.kotatsu.settings.utils.ActivityListPreference import org.koitharu.kotatsu.settings.utils.SliderPreference -import org.koitharu.kotatsu.utils.ext.getLocalesConfig -import org.koitharu.kotatsu.utils.ext.map -import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat -import org.koitharu.kotatsu.utils.ext.toList import java.util.Locale import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt index 34523393b..bad3d8632 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt @@ -11,18 +11,18 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment -import org.koitharu.kotatsu.base.ui.dialog.StorageSelectDialog import org.koitharu.kotatsu.core.cache.ContentCache import org.koitharu.kotatsu.core.network.DoHProvider import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.ui.dialog.StorageSelectDialog +import org.koitharu.kotatsu.core.util.ext.getStorageName +import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.parsers.util.names -import org.koitharu.kotatsu.utils.ext.getStorageName -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/DomainValidator.kt b/app/src/main/java/org/koitharu/kotatsu/settings/DomainValidator.kt index 8e55b27c4..0ac467edc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/DomainValidator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/DomainValidator.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.settings import okhttp3.HttpUrl import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.EditTextValidator +import org.koitharu.kotatsu.core.util.EditTextValidator class DomainValidator : EditTextValidator() { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index c0b53620a..4ced54381 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -10,18 +10,18 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CancellationException import kotlinx.coroutines.launch import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar import org.koitharu.kotatsu.core.os.ShortcutsUpdater import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.util.FileSize +import org.koitharu.kotatsu.core.util.ext.awaitStateAtLeast +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.local.data.CacheDir import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.FileSize -import org.koitharu.kotatsu.utils.ext.awaitStateAtLeast -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt index dedac9988..a75535bcc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/NotificationSettingsLegacyFragment.kt @@ -6,8 +6,8 @@ import android.os.Bundle import android.view.View import androidx.preference.Preference import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.settings.utils.RingtonePickContract class NotificationSettingsLegacyFragment : @@ -56,6 +56,7 @@ class NotificationSettingsLegacyFragment : ringtonePickContract.launch(settings.notificationSound) true } + else -> super.onPreferenceTreeClick(preference) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt index 0f1ab7c74..672073926 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt @@ -8,13 +8,13 @@ import androidx.preference.MultiSelectListPreference import androidx.preference.Preference import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ReaderMode +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat import org.koitharu.kotatsu.parsers.util.names import org.koitharu.kotatsu.settings.utils.MultiSummaryProvider -import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat @AndroidEntryPoint class ReaderSettingsFragment : diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/RootSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/RootSettingsFragment.kt index ad02acf64..7d737ee50 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/RootSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/RootSettingsFragment.kt @@ -2,11 +2,11 @@ package org.koitharu.kotatsu.settings import android.os.Bundle import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment class RootSettingsFragment : BasePreferenceFragment(R.string.settings) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_root) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt index 2cea0ee75..04bbd96ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt @@ -12,8 +12,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.scrobbling.anilist.data.AniListRepository import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.ui.config.ScrobblerConfigActivity @@ -21,9 +23,7 @@ import org.koitharu.kotatsu.scrobbling.mal.data.MALRepository import org.koitharu.kotatsu.scrobbling.shikimori.data.ShikimoriRepository import org.koitharu.kotatsu.sync.domain.SyncController import org.koitharu.kotatsu.sync.ui.SyncSettingsIntent -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt index 5cecec9ab..9b608aa96 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -18,16 +18,16 @@ import com.google.android.material.appbar.AppBarLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat +import org.koitharu.kotatsu.core.util.ext.isScrolledToTop import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.settings.about.AboutSettingsFragment import org.koitharu.kotatsu.settings.sources.SourcesListFragment import org.koitharu.kotatsu.settings.tracker.TrackerSettingsFragment -import org.koitharu.kotatsu.utils.ext.getSerializableExtraCompat -import org.koitharu.kotatsu.utils.ext.isScrolledToTop @AndroidEntryPoint class SettingsActivity : @@ -37,7 +37,7 @@ class SettingsActivity : FragmentManager.OnBackStackChangedListener { override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -51,7 +51,7 @@ class SettingsActivity : override fun onTitleChanged(title: CharSequence?, color: Int) { super.onTitleChanged(title, color) - binding.collapsingToolbarLayout?.title = title + viewBinding.collapsingToolbarLayout?.title = title } override fun onStart() { @@ -86,7 +86,7 @@ class SettingsActivity : val fragment = supportFragmentManager.findFragmentById(R.id.container) as? RecyclerViewOwner ?: return val recyclerView = fragment.recyclerView recyclerView.post { - binding.appbar.setExpanded(recyclerView.isScrolledToTop, false) + viewBinding.appbar.setExpanded(recyclerView.isScrolledToTop, false) } } @@ -104,11 +104,11 @@ class SettingsActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.appbar.updatePadding( + viewBinding.appbar.updatePadding( left = insets.left, right = insets.right, ) - binding.container.updatePadding( + viewBinding.container.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt index 43327d44a..565b8395d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsFragment.kt @@ -12,20 +12,20 @@ import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.util.ext.awaitViewLifecycle +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.requireSerializable +import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.settings.sources.auth.SourceAuthActivity -import org.koitharu.kotatsu.utils.ext.awaitViewLifecycle -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.requireSerializable -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.viewLifecycleScope -import org.koitharu.kotatsu.utils.ext.withArgs +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SuggestionsSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SuggestionsSettingsFragment.kt index 0ba19a211..f7be5bdcd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SuggestionsSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SuggestionsSettingsFragment.kt @@ -4,15 +4,15 @@ import android.content.SharedPreferences import android.os.Bundle import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import kotlinx.coroutines.launch import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.settings.utils.MultiAutoCompleteTextViewPreference import org.koitharu.kotatsu.settings.utils.TagsAutoCompleteProvider import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository import org.koitharu.kotatsu.suggestions.ui.SuggestionsWorker +import javax.inject.Inject @AndroidEntryPoint class SuggestionsSettingsFragment : diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SyncSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SyncSettingsFragment.kt index 530b8d0ea..60a609307 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SyncSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SyncSettingsFragment.kt @@ -6,7 +6,7 @@ import androidx.fragment.app.FragmentResultListener import androidx.preference.Preference import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.sync.data.SyncSettings import org.koitharu.kotatsu.sync.ui.SyncHostDialogFragment import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt index cfede729c..94051d98b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsFragment.kt @@ -11,13 +11,13 @@ import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.github.AppVersion import org.koitharu.kotatsu.core.github.VersionId import org.koitharu.kotatsu.core.github.isStable import org.koitharu.kotatsu.core.logs.FileLogger import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.utils.ShareHelper +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.util.ShareHelper import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsViewModel.kt index 5289f751c..3ee1ea9e3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/about/AboutSettingsViewModel.kt @@ -1,11 +1,11 @@ package org.koitharu.kotatsu.settings.about import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.github.AppUpdateRepository import org.koitharu.kotatsu.core.github.AppVersion -import org.koitharu.kotatsu.utils.SingleLiveEvent +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import javax.inject.Inject @HiltViewModel class AboutSettingsViewModel @Inject constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/about/AppUpdateDialog.kt b/app/src/main/java/org/koitharu/kotatsu/settings/about/AppUpdateDialog.kt index 0043a5ab2..e57058e09 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/about/AppUpdateDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/about/AppUpdateDialog.kt @@ -8,7 +8,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.noties.markwon.Markwon import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.github.AppVersion -import org.koitharu.kotatsu.utils.FileSize +import org.koitharu.kotatsu.core.util.FileSize import com.google.android.material.R as materialR class AppUpdateDialog(private val context: Context) { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt index 8acbc7a10..19362ebb2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.settings.backup import android.net.Uri import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts @@ -12,9 +11,9 @@ import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage import org.koitharu.kotatsu.databinding.DialogProgressBinding -import org.koitharu.kotatsu.utils.ext.getDisplayMessage import java.io.File import java.io.FileOutputStream import kotlin.math.roundToInt @@ -36,13 +35,13 @@ class BackupDialogFragment : AlertDialogFragment() { } } - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = DialogProgressBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogProgressBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) binding.textViewTitle.setText(R.string.create_backup) binding.textViewSubtitle.setText(R.string.processing_) @@ -67,7 +66,7 @@ class BackupDialogFragment : AlertDialogFragment() { } private fun onProgressChanged(value: Float) { - with(binding.progressBar) { + with(requireViewBinding().progressBar) { isVisible = true val wasIndeterminate = isIndeterminate isIndeterminate = value < 0 diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt index 53ad51cbc..fbeb28594 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt @@ -8,9 +8,9 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.preference.Preference import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.util.ext.printStackTraceDebug class BackupSettingsFragment : BasePreferenceFragment(R.string.backup_restore), @@ -18,7 +18,7 @@ class BackupSettingsFragment : private val backupSelectCall = registerForActivityResult( ActivityResultContracts.OpenDocument(), - this + this, ) override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -31,17 +31,19 @@ class BackupSettingsFragment : BackupDialogFragment().show(childFragmentManager, BackupDialogFragment.TAG) true } + AppSettings.KEY_RESTORE -> { try { backupSelectCall.launch(arrayOf("*/*")) } catch (e: ActivityNotFoundException) { e.printStackTraceDebug() Snackbar.make( - listView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT + listView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT, ).show() } true } + else -> super.onPreferenceTreeClick(preference) } } @@ -50,4 +52,4 @@ class BackupSettingsFragment : RestoreDialogFragment.newInstance(result ?: return) .show(childFragmentManager, BackupDialogFragment.TAG) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt index ae1cae8a4..80d9705e3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupViewModel.kt @@ -4,10 +4,10 @@ import android.content.Context import androidx.lifecycle.MutableLiveData import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.backup.BackupRepository import org.koitharu.kotatsu.core.backup.BackupZipOutput -import org.koitharu.kotatsu.utils.SingleLiveEvent +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent import java.io.File import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt index e1e3dee63..c1c7c7817 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt @@ -3,18 +3,17 @@ package org.koitharu.kotatsu.settings.backup import android.net.Uri import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment import org.koitharu.kotatsu.core.backup.CompositeResult +import org.koitharu.kotatsu.core.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.DialogProgressBinding -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.withArgs import kotlin.math.roundToInt @AndroidEntryPoint @@ -22,13 +21,13 @@ class RestoreDialogFragment : AlertDialogFragment() { private val viewModel: RestoreViewModel by viewModels() - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = DialogProgressBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogProgressBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) binding.textViewTitle.setText(R.string.restore_backup) binding.textViewSubtitle.setText(R.string.preparing_) @@ -52,7 +51,7 @@ class RestoreDialogFragment : AlertDialogFragment() { } private fun onProgressChanged(value: Float) { - with(binding.progressBar) { + with(requireViewBinding().progressBar) { isVisible = true val wasIndeterminate = isIndeterminate isIndeterminate = value < 0 diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt index 9efc859cf..cea8a7dfa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreViewModel.kt @@ -7,13 +7,13 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.backup.BackupEntry import org.koitharu.kotatsu.core.backup.BackupRepository import org.koitharu.kotatsu.core.backup.BackupZipInput import org.koitharu.kotatsu.core.backup.CompositeResult -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.toUriOrNull +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.ext.toUriOrNull import java.io.File import java.io.FileNotFoundException import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesDialogFragment.kt index 7c76e4d84..ac16391c6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesDialogFragment.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.settings.newsources import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels @@ -11,7 +10,7 @@ import coil.ImageLoader import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.ui.AlertDialogFragment import org.koitharu.kotatsu.databinding.DialogOnboardBinding import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigListener import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem @@ -28,12 +27,12 @@ class NewSourcesDialogFragment : private val viewModel by viewModels() - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): DialogOnboardBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): DialogOnboardBinding { return DialogOnboardBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogOnboardBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val adapter = SourcesSelectAdapter(this, coil, viewLifecycleOwner) binding.recyclerView.adapter = adapter binding.textViewTitle.setText(R.string.new_sources_text) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesViewModel.kt index 52151b6a3..3f631be7b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/newsources/NewSourcesViewModel.kt @@ -3,12 +3,12 @@ package org.koitharu.kotatsu.settings.newsources import androidx.core.os.LocaleListCompat import androidx.lifecycle.MutableLiveData import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.getLocaleTitle import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.ext.mapToSet import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem -import org.koitharu.kotatsu.utils.ext.mapToSet +import javax.inject.Inject @HiltViewModel class NewSourcesViewModel @Inject constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt index 51b21e2ce..295a08a90 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt @@ -3,20 +3,19 @@ package org.koitharu.kotatsu.settings.onboard import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.util.ext.showAllowStateLoss +import org.koitharu.kotatsu.core.util.ext.withArgs import org.koitharu.kotatsu.databinding.DialogOnboardBinding import org.koitharu.kotatsu.settings.onboard.adapter.SourceLocaleListener import org.koitharu.kotatsu.settings.onboard.adapter.SourceLocalesAdapter import org.koitharu.kotatsu.settings.onboard.model.SourceLocale -import org.koitharu.kotatsu.utils.ext.showAllowStateLoss -import org.koitharu.kotatsu.utils.ext.withArgs @AndroidEntryPoint class OnboardDialogFragment : @@ -33,7 +32,7 @@ class OnboardDialogFragment : } } - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = DialogOnboardBinding.inflate(inflater, container, false) @@ -52,8 +51,8 @@ class OnboardDialogFragment : return builder } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: DialogOnboardBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val adapter = SourceLocalesAdapter(this) binding.recyclerView.adapter = adapter binding.textViewTitle.setText(R.string.onboard_text) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt index 82a7400b0..4380d0163 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt @@ -3,15 +3,15 @@ package org.koitharu.kotatsu.settings.onboard import androidx.core.os.LocaleListCompat import androidx.lifecycle.MutableLiveData import dagger.hilt.android.lifecycle.HiltViewModel -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.ext.map +import org.koitharu.kotatsu.core.util.ext.mapToSet import org.koitharu.kotatsu.parsers.util.mapNotNullToSet import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.settings.onboard.model.SourceLocale -import org.koitharu.kotatsu.utils.ext.map -import org.koitharu.kotatsu.utils.ext.mapToSet import java.util.Locale import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/adapter/SourceLocaleAD.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/adapter/SourceLocaleAD.kt index f5d5f1aed..3d5dfae35 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/adapter/SourceLocaleAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/adapter/SourceLocaleAD.kt @@ -2,10 +2,10 @@ package org.koitharu.kotatsu.settings.onboard.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.setChecked +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemSourceLocaleBinding import org.koitharu.kotatsu.settings.onboard.model.SourceLocale -import org.koitharu.kotatsu.utils.ext.setChecked -import org.koitharu.kotatsu.utils.ext.textAndVisible fun sourceLocaleAD( listener: SourceLocaleListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt index 479cbdb5e..955158643 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt @@ -17,7 +17,7 @@ import androidx.core.view.isGone import androidx.core.view.isVisible import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivitySetupProtectBinding private const val MIN_PASSWORD_LENGTH = 4 @@ -36,29 +36,29 @@ class ProtectSetupActivity : super.onCreate(savedInstanceState) window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) setContentView(ActivitySetupProtectBinding.inflate(layoutInflater)) - binding.editPassword.addTextChangedListener(this) - binding.editPassword.setOnEditorActionListener(this) - binding.buttonNext.setOnClickListener(this) - binding.buttonCancel.setOnClickListener(this) + viewBinding.editPassword.addTextChangedListener(this) + viewBinding.editPassword.setOnEditorActionListener(this) + viewBinding.buttonNext.setOnClickListener(this) + viewBinding.buttonCancel.setOnClickListener(this) - binding.switchBiometric.isChecked = viewModel.isBiometricEnabled - binding.switchBiometric.setOnCheckedChangeListener(this) + viewBinding.switchBiometric.isChecked = viewModel.isBiometricEnabled + viewBinding.switchBiometric.setOnCheckedChangeListener(this) viewModel.isSecondStep.observe(this, this::onStepChanged) viewModel.onPasswordSet.observe(this) { finishAfterTransition() } viewModel.onPasswordMismatch.observe(this) { - binding.editPassword.error = getString(R.string.passwords_mismatch) + viewBinding.editPassword.error = getString(R.string.passwords_mismatch) } viewModel.onClearText.observe(this) { - binding.editPassword.text?.clear() + viewBinding.editPassword.text?.clear() } } override fun onWindowInsetsChanged(insets: Insets) { val basePadding = resources.getDimensionPixelOffset(R.dimen.screen_padding) - binding.root.setPadding( + viewBinding.root.setPadding( basePadding + insets.left, basePadding + insets.top, basePadding + insets.right, @@ -70,7 +70,7 @@ class ProtectSetupActivity : when (v.id) { R.id.button_cancel -> finish() R.id.button_next -> viewModel.onNextClick( - password = binding.editPassword.text?.toString() ?: return, + password = viewBinding.editPassword.text?.toString() ?: return, ) } } @@ -80,8 +80,8 @@ class ProtectSetupActivity : } override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { - return if (actionId == EditorInfo.IME_ACTION_DONE && binding.buttonNext.isEnabled) { - binding.buttonNext.performClick() + return if (actionId == EditorInfo.IME_ACTION_DONE && viewBinding.buttonNext.isEnabled) { + viewBinding.buttonNext.performClick() true } else { false @@ -93,22 +93,22 @@ class ProtectSetupActivity : override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit override fun afterTextChanged(s: Editable?) { - binding.editPassword.error = null + viewBinding.editPassword.error = null val isEnoughLength = (s?.length ?: 0) >= MIN_PASSWORD_LENGTH - binding.buttonNext.isEnabled = isEnoughLength - binding.layoutPassword.isHelperTextEnabled = + viewBinding.buttonNext.isEnabled = isEnoughLength + viewBinding.layoutPassword.isHelperTextEnabled = !isEnoughLength || viewModel.isSecondStep.value == true } private fun onStepChanged(isSecondStep: Boolean) { - binding.buttonCancel.isGone = isSecondStep - binding.switchBiometric.isVisible = isSecondStep && isBiometricAvailable() + viewBinding.buttonCancel.isGone = isSecondStep + viewBinding.switchBiometric.isVisible = isSecondStep && isBiometricAvailable() if (isSecondStep) { - binding.layoutPassword.helperText = getString(R.string.repeat_password) - binding.buttonNext.setText(R.string.confirm) + viewBinding.layoutPassword.helperText = getString(R.string.repeat_password) + viewBinding.buttonNext.setText(R.string.confirm) } else { - binding.layoutPassword.helperText = getString(R.string.password_length_hint) - binding.buttonNext.setText(R.string.next) + viewBinding.layoutPassword.helperText = getString(R.string.password_length_hint) + viewBinding.buttonNext.setText(R.string.next) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt index 351ccc360..387c34848 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt @@ -4,11 +4,11 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.parsers.util.md5 -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListFragment.kt index 2fdd8b92f..d34733efa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem -import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.core.graphics.Insets @@ -17,9 +16,11 @@ import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner -import org.koitharu.kotatsu.base.ui.util.ReversibleActionObserver +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.ui.util.ReversibleActionObserver +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.core.util.ext.getItem import org.koitharu.kotatsu.databinding.FragmentSettingsSourcesBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.settings.SettingsActivity @@ -28,8 +29,6 @@ import org.koitharu.kotatsu.settings.SourceSettingsFragment import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigAdapter import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigListener import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem -import org.koitharu.kotatsu.utils.ext.addMenuProvider -import org.koitharu.kotatsu.utils.ext.getItem import javax.inject.Inject @AndroidEntryPoint @@ -45,20 +44,15 @@ class SourcesListFragment : private val viewModel by viewModels() override val recyclerView: RecyclerView - get() = binding.recyclerView + get() = requireViewBinding().recyclerView - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentSettingsSourcesBinding.inflate(inflater, container, false) - override fun onResume() { - super.onResume() - activity?.setTitle(R.string.remote_sources) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentSettingsSourcesBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) val sourcesAdapter = SourceConfigAdapter(this, coil, viewLifecycleOwner) with(binding.recyclerView) { setHasFixedSize(true) @@ -74,13 +68,18 @@ class SourcesListFragment : addMenuProvider(SourcesMenuProvider()) } + override fun onResume() { + super.onResume() + activity?.setTitle(R.string.remote_sources) + } + override fun onDestroyView() { reorderHelper = null super.onDestroyView() } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + requireViewBinding().recyclerView.updatePadding( bottom = insets.bottom, left = insets.left, right = insets.right, diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListViewModel.kt index 553988dce..9eaf346c2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/SourcesListViewModel.kt @@ -9,18 +9,18 @@ import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.ReversibleHandle -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.model.getLocaleTitle import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.ui.util.ReversibleHandle +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.ext.map +import org.koitharu.kotatsu.core.util.ext.move import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.map -import org.koitharu.kotatsu.utils.ext.move import java.util.Locale import java.util.TreeMap import javax.inject.Inject @@ -65,8 +65,7 @@ class SourcesListViewModel @Inject constructor( fun canReorder(oldPos: Int, newPos: Int): Boolean { val snapshot = items.value?.toMutableList() ?: return false if ((snapshot[oldPos] as? SourceConfigItem.SourceItem)?.isEnabled != true) return false - if ((snapshot[newPos] as? SourceConfigItem.SourceItem)?.isEnabled != true) return false - return true + return (snapshot[newPos] as? SourceConfigItem.SourceItem)?.isEnabled == true } fun setEnabled(source: MangaSource, isEnabled: Boolean) { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt index 1f3aa5253..bef802851 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigAdapterDelegates.kt @@ -8,21 +8,21 @@ import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnTipCloseListener import org.koitharu.kotatsu.core.parser.favicon.faviconUri +import org.koitharu.kotatsu.core.ui.image.FaviconFallbackDrawable +import org.koitharu.kotatsu.core.ui.list.OnTipCloseListener +import org.koitharu.kotatsu.core.util.ext.crossfade +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ItemExpandableBinding import org.koitharu.kotatsu.databinding.ItemFilterHeaderBinding import org.koitharu.kotatsu.databinding.ItemSourceConfigBinding import org.koitharu.kotatsu.databinding.ItemSourceConfigCheckableBinding import org.koitharu.kotatsu.databinding.ItemTipBinding import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem -import org.koitharu.kotatsu.utils.ext.crossfade -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source -import org.koitharu.kotatsu.utils.ext.textAndVisible -import org.koitharu.kotatsu.utils.image.FaviconFallbackDrawable fun sourceConfigHeaderDelegate() = adapterDelegateViewBinding( diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigListener.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigListener.kt index d8f0be9fa..d90969f17 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/adapter/SourceConfigListener.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.settings.sources.adapter -import org.koitharu.kotatsu.base.ui.list.OnTipCloseListener +import org.koitharu.kotatsu.core.ui.list.OnTipCloseListener import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem interface SourceConfigListener : OnTipCloseListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt index b0f0ca321..68913fe55 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt @@ -13,7 +13,6 @@ import androidx.core.view.isVisible import androidx.core.view.updatePadding import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.browser.BrowserCallback import org.koitharu.kotatsu.browser.BrowserClient import org.koitharu.kotatsu.browser.ProgressChromeClient @@ -21,12 +20,13 @@ import org.koitharu.kotatsu.browser.WebViewBackPressedCallback import org.koitharu.kotatsu.core.network.CommonHeadersInterceptor import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.TaggedActivityResult +import org.koitharu.kotatsu.core.util.ext.catchingWebViewUnavailability +import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat import org.koitharu.kotatsu.databinding.ActivityBrowserBinding import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.utils.TaggedActivityResult -import org.koitharu.kotatsu.utils.ext.catchingWebViewUnavailability -import org.koitharu.kotatsu.utils.ext.getSerializableExtraCompat import javax.inject.Inject import com.google.android.material.R as materialR @@ -64,13 +64,13 @@ class SourceAuthActivity : BaseActivity(), BrowserCallba setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } - with(binding.webView.settings) { + with(viewBinding.webView.settings) { javaScriptEnabled = true userAgentString = CommonHeadersInterceptor.userAgentChrome } - binding.webView.webViewClient = BrowserClient(this) - binding.webView.webChromeClient = ProgressChromeClient(binding.progressBar) - onBackPressedCallback = WebViewBackPressedCallback(binding.webView) + viewBinding.webView.webViewClient = BrowserClient(this) + viewBinding.webView.webChromeClient = ProgressChromeClient(viewBinding.progressBar) + onBackPressedCallback = WebViewBackPressedCallback(viewBinding.webView) onBackPressedDispatcher.addCallback(onBackPressedCallback) if (savedInstanceState != null) { return @@ -80,27 +80,27 @@ class SourceAuthActivity : BaseActivity(), BrowserCallba source.title, getString(R.string.loading_), ) - binding.webView.loadUrl(url) + viewBinding.webView.loadUrl(url) } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - binding.webView.saveState(outState) + viewBinding.webView.saveState(outState) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) - binding.webView.restoreState(savedInstanceState) + viewBinding.webView.restoreState(savedInstanceState) } override fun onDestroy() { super.onDestroy() - binding.webView.destroy() + viewBinding.webView.destroy() } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { android.R.id.home -> { - binding.webView.stopLoading() + viewBinding.webView.stopLoading() setResult(Activity.RESULT_CANCELED) finishAfterTransition() true @@ -110,17 +110,17 @@ class SourceAuthActivity : BaseActivity(), BrowserCallba } override fun onPause() { - binding.webView.onPause() + viewBinding.webView.onPause() super.onPause() } override fun onResume() { super.onResume() - binding.webView.onResume() + viewBinding.webView.onResume() } override fun onLoadingStateChanged(isLoading: Boolean) { - binding.progressBar.isVisible = isLoading + viewBinding.progressBar.isVisible = isLoading if (!isLoading && authProvider.isAuthorized) { Toast.makeText(this, R.string.auth_complete, Toast.LENGTH_SHORT).show() setResult(Activity.RESULT_OK) @@ -138,8 +138,8 @@ class SourceAuthActivity : BaseActivity(), BrowserCallba } override fun onWindowInsetsChanged(insets: Insets) { - binding.appbar.updatePadding(top = insets.top) - binding.webView.updatePadding(bottom = insets.bottom) + viewBinding.appbar.updatePadding(top = insets.top) + viewBinding.webView.updatePadding(bottom = insets.bottom) } class Contract : ActivityResultContract() { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt index c7a7d4458..51ea765ef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsFragment.kt @@ -13,13 +13,13 @@ import androidx.core.view.updatePadding import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment import org.koitharu.kotatsu.core.github.AppVersion +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.util.ext.setChecked import org.koitharu.kotatsu.databinding.FragmentToolsBinding import org.koitharu.kotatsu.download.ui.list.DownloadsActivity import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.settings.about.AppUpdateDialog -import org.koitharu.kotatsu.utils.ext.setChecked @AndroidEntryPoint class ToolsFragment : @@ -29,12 +29,12 @@ class ToolsFragment : private val viewModel by viewModels() - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): FragmentToolsBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentToolsBinding { return FragmentToolsBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentToolsBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) binding.buttonSettings.setOnClickListener(this) binding.buttonDownloads.setOnClickListener(this) binding.cardUpdate.buttonChangelog.setOnClickListener(this) @@ -75,18 +75,18 @@ class ToolsFragment : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + requireViewBinding().root.updatePadding( bottom = insets.bottom, ) } private fun onAppUpdateAvailable(version: AppVersion?) { if (version == null) { - binding.cardUpdate.root.isVisible = false + requireViewBinding().cardUpdate.root.isVisible = false return } - binding.cardUpdate.textSecondary.text = getString(R.string.new_version_s, version.name) - binding.cardUpdate.root.isVisible = true + requireViewBinding().cardUpdate.textSecondary.text = getString(R.string.new_version_s, version.name) + requireViewBinding().cardUpdate.root.isVisible = true } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsViewModel.kt index cbb17dd06..b977b7996 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tools/ToolsViewModel.kt @@ -6,10 +6,10 @@ import androidx.lifecycle.liveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.github.AppUpdateRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsLiveData +import org.koitharu.kotatsu.core.ui.BaseViewModel import org.koitharu.kotatsu.local.data.CacheDir import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.settings.tools.model.StorageUsage diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tools/views/MemoryUsageView.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tools/views/MemoryUsageView.kt index a6eb2bc56..0328e5534 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tools/views/MemoryUsageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tools/views/MemoryUsageView.kt @@ -11,11 +11,11 @@ import androidx.core.graphics.ColorUtils import androidx.core.widget.TextViewCompat import com.google.android.material.color.MaterialColors import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.widgets.SegmentedBarView +import org.koitharu.kotatsu.core.ui.widgets.SegmentedBarView +import org.koitharu.kotatsu.core.util.FileSize +import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.databinding.LayoutMemoryUsageBinding import org.koitharu.kotatsu.settings.tools.model.StorageUsage -import org.koitharu.kotatsu.utils.FileSize -import org.koitharu.kotatsu.utils.ext.getThemeColor class MemoryUsageView @JvmOverloads constructor( context: Context, diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsFragment.kt index e3ee6a41d..d60d185ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsFragment.kt @@ -20,13 +20,13 @@ import androidx.preference.MultiSelectListPreference import androidx.preference.Preference import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.settings.tracker.categories.TrackerCategoriesConfigSheet import org.koitharu.kotatsu.settings.utils.MultiSummaryProvider import org.koitharu.kotatsu.tracker.work.TrackerNotificationChannels +import javax.inject.Inject private const val KEY_IGNORE_DOZE = "ignore_dose" @@ -95,24 +95,29 @@ class TrackerSettingsFragment : startActivity(intent) true } + channels.areNotificationsDisabled -> { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) .setData(Uri.fromParts("package", requireContext().packageName, null)) startActivity(intent) true } + else -> { super.onPreferenceTreeClick(preference) } } + AppSettings.KEY_TRACK_CATEGORIES -> { TrackerCategoriesConfigSheet.show(childFragmentManager) true } + KEY_IGNORE_DOZE -> { startIgnoreDoseActivity(preference.context) true } + else -> super.onPreferenceTreeClick(preference) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt index 21c75b086..b6d0f8106 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt @@ -5,12 +5,12 @@ import androidx.room.InvalidationTracker import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import okio.Closeable -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.TABLE_FAVOURITE_CATEGORIES import org.koitharu.kotatsu.core.db.removeObserverAsync +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.ext.emitValue import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.ext.emitValue import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigAdapter.kt index d70833062..af0ebbf85 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigAdapter.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.settings.tracker.categories import androidx.recyclerview.widget.DiffUtil import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener class TrackerCategoriesConfigAdapter( listener: OnListItemClickListener, diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigSheet.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigSheet.kt index a463660aa..028a22020 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigSheet.kt @@ -9,9 +9,9 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.databinding.SheetBaseBinding @AndroidEntryPoint @@ -22,12 +22,12 @@ class TrackerCategoriesConfigSheet : private val viewModel by viewModels() - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetBaseBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetBaseBinding { return SheetBaseBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: SheetBaseBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) binding.headerBar.setTitle(R.string.favourites_categories) binding.buttonDone.isVisible = true binding.buttonDone.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigViewModel.kt index 1b9c10f7f..8ec72c44c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoriesConfigViewModel.kt @@ -2,13 +2,13 @@ package org.koitharu.kotatsu.settings.tracker.categories import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.favourites.domain.FavouritesRepository -import org.koitharu.kotatsu.utils.asFlowLiveData +import javax.inject.Inject @HiltViewModel class TrackerCategoriesConfigViewModel @Inject constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoryAD.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoryAD.kt index 5e3876285..7db2f78b1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoryAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/categories/TrackerCategoryAD.kt @@ -1,9 +1,9 @@ package org.koitharu.kotatsu.settings.tracker.categories import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding -import org.koitharu.kotatsu.base.ui.list.AdapterDelegateClickListenerAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.model.FavouriteCategory +import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.databinding.ItemCategoryCheckableMultipleBinding fun trackerCategoryAD( diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/ActivityListPreference.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/ActivityListPreference.kt index 0de795a3b..950c69c2c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/ActivityListPreference.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/ActivityListPreference.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import android.util.AttributeSet import androidx.preference.ListPreference -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.util.ext.printStackTraceDebug class ActivityListPreference : ListPreference { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/EditTextBindListener.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/EditTextBindListener.kt index 50e93f24b..7f2ccdd29 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/EditTextBindListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/EditTextBindListener.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.settings.utils import android.widget.EditText import androidx.preference.EditTextPreference -import org.koitharu.kotatsu.utils.EditTextValidator +import org.koitharu.kotatsu.core.util.EditTextValidator class EditTextBindListener( private val inputType: Int, @@ -15,4 +15,4 @@ class EditTextBindListener( editText.hint = hint validator?.attachToEditText(editText) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt index e1f88b59c..9e2151f6b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt @@ -7,7 +7,7 @@ import android.net.Uri import android.provider.Settings import androidx.activity.result.contract.ActivityResultContract import androidx.annotation.StringRes -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat class RingtonePickContract(@StringRes private val titleResId: Int) : ActivityResultContract() { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/SliderPreference.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/SliderPreference.kt index b2a818caa..fbf2fcc0c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/SliderPreference.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/SliderPreference.kt @@ -11,7 +11,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import com.google.android.material.slider.Slider import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.ext.setValueRounded +import org.koitharu.kotatsu.core.util.ext.setValueRounded class SliderPreference @JvmOverloads constructor( context: Context, diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/domain/ShelfRepository.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/domain/ShelfRepository.kt index d6e9a7fac..a534c90cb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/domain/ShelfRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/domain/ShelfRepository.kt @@ -24,9 +24,9 @@ import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable import javax.inject.Inject @Reusable diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfFragment.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfFragment.kt index 0cf72a0a9..cb499a611 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfFragment.kt @@ -13,13 +13,14 @@ import androidx.fragment.app.viewModels import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.list.NestedScrollStateHandle -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController -import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner -import org.koitharu.kotatsu.base.ui.util.ReversibleActionObserver import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.list.NestedScrollStateHandle +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner +import org.koitharu.kotatsu.core.ui.util.ReversibleActionObserver +import org.koitharu.kotatsu.core.util.ext.addMenuProvider import org.koitharu.kotatsu.databinding.FragmentShelfBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.download.ui.worker.DownloadStartedObserver @@ -35,7 +36,6 @@ import org.koitharu.kotatsu.shelf.ui.adapter.ShelfListEventListener import org.koitharu.kotatsu.shelf.ui.model.ShelfSectionModel import org.koitharu.kotatsu.suggestions.ui.SuggestionsActivity import org.koitharu.kotatsu.tracker.ui.updates.UpdatesActivity -import org.koitharu.kotatsu.utils.ext.addMenuProvider import javax.inject.Inject @AndroidEntryPoint @@ -56,14 +56,14 @@ class ShelfFragment : private var selectionController: SectionedSelectionController? = null override val recyclerView: RecyclerView - get() = binding.recyclerView + get() = requireViewBinding().recyclerView - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): FragmentShelfBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentShelfBinding { return FragmentShelfBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentShelfBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) nestedScrollStateHandle = NestedScrollStateHandle(savedInstanceState, KEY_NESTED_SCROLL) val sizeResolver = ItemSizeResolver(resources, settings) selectionController = SectionedSelectionController( @@ -81,7 +81,7 @@ class ShelfFragment : ) binding.recyclerView.adapter = adapter binding.recyclerView.setHasFixedSize(true) - addMenuProvider(ShelfMenuProvider(view.context, childFragmentManager, viewModel)) + addMenuProvider(ShelfMenuProvider(binding.root.context, childFragmentManager, viewModel)) viewModel.content.observe(viewLifecycleOwner, ::onListChanged) viewModel.onError.observe(viewLifecycleOwner, SnackbarErrorObserver(binding.recyclerView, this)) @@ -136,7 +136,7 @@ class ShelfFragment : } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + requireViewBinding().recyclerView.updatePadding( bottom = insets.bottom, ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfMenuProvider.kt index d00601406..842699dfc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfMenuProvider.kt @@ -8,11 +8,11 @@ import androidx.core.view.MenuProvider import androidx.fragment.app.FragmentManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.dialog.RememberSelectionDialogListener +import org.koitharu.kotatsu.core.ui.dialog.RememberSelectionDialogListener +import org.koitharu.kotatsu.core.util.ext.startOfDay import org.koitharu.kotatsu.local.ui.ImportDialogFragment import org.koitharu.kotatsu.shelf.ui.config.ShelfSettingsActivity import org.koitharu.kotatsu.shelf.ui.config.size.ShelfSizeBottomSheet -import org.koitharu.kotatsu.utils.ext.startOfDay import java.util.Date import java.util.concurrent.TimeUnit import com.google.android.material.R as materialR diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt index 4dfa746ee..a5c5a942e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfSelectionCallback.kt @@ -8,15 +8,15 @@ import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.util.ShareHelper +import org.koitharu.kotatsu.core.util.ext.invalidateNestedItemDecorations import org.koitharu.kotatsu.favourites.ui.categories.select.FavouriteCategoriesBottomSheet import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.util.flattenTo import org.koitharu.kotatsu.shelf.ui.model.ShelfSectionModel -import org.koitharu.kotatsu.utils.ShareHelper -import org.koitharu.kotatsu.utils.ext.invalidateNestedItemDecorations class ShelfSelectionCallback( private val recyclerView: RecyclerView, diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt index 2103b208f..e48113db3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt @@ -8,13 +8,15 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.history.domain.HistoryRepository @@ -36,8 +38,6 @@ import org.koitharu.kotatsu.shelf.domain.ShelfSection import org.koitharu.kotatsu.shelf.ui.model.ShelfSectionModel import org.koitharu.kotatsu.sync.domain.SyncController import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt index 0043cd052..85baded5e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfAdapter.kt @@ -6,9 +6,9 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.NestedScrollStateHandle -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController -import org.koitharu.kotatsu.base.ui.list.fastscroll.FastScroller +import org.koitharu.kotatsu.core.ui.list.NestedScrollStateHandle +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.adapter.emptyHintAD import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfGroupAD.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfGroupAD.kt index bf2c3e0fe..c0e561475 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfGroupAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/adapter/ShelfGroupAD.kt @@ -7,19 +7,19 @@ import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.NestedScrollStateHandle -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener -import org.koitharu.kotatsu.base.ui.list.SectionedSelectionController -import org.koitharu.kotatsu.base.ui.list.decor.AbstractSelectionItemDecoration -import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.ui.list.NestedScrollStateHandle +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.SectionedSelectionController +import org.koitharu.kotatsu.core.ui.list.decor.AbstractSelectionItemDecoration +import org.koitharu.kotatsu.core.ui.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.core.util.ext.removeItemDecoration +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible import org.koitharu.kotatsu.databinding.ItemListGroupBinding import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.adapter.mangaGridItemAD import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.shelf.ui.model.ShelfSectionModel -import org.koitharu.kotatsu.utils.ext.removeItemDecoration -import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun shelfGroupAD( sharedPool: RecyclerView.RecycledViewPool, diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsActivity.kt index c4dce1804..6697d0367 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsActivity.kt @@ -12,7 +12,7 @@ import androidx.core.view.updatePadding import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivityShelfSettingsBinding import com.google.android.material.R as materialR @@ -31,9 +31,9 @@ class ShelfSettingsActivity : setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } - binding.buttonDone.setOnClickListener(this) + viewBinding.buttonDone.setOnClickListener(this) val settingsAdapter = ShelfSettingsAdapter(this) - with(binding.recyclerView) { + with(viewBinding.recyclerView) { setHasFixedSize(true) adapter = settingsAdapter reorderHelper = ItemTouchHelper(SectionsReorderCallback()).also { @@ -58,14 +58,14 @@ class ShelfSettingsActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) - binding.recyclerView.updatePadding( + viewBinding.recyclerView.updatePadding( bottom = insets.bottom, ) - binding.toolbar.updateLayoutParams { + viewBinding.toolbar.updateLayoutParams { topMargin = insets.top } } diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsAdapterDelegates.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsAdapterDelegates.kt index 4b73dc9ef..2897e3eb6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsAdapterDelegates.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsAdapterDelegates.kt @@ -7,10 +7,10 @@ import android.widget.CompoundButton import androidx.core.view.updatePaddingRelative import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.setChecked import org.koitharu.kotatsu.databinding.ItemCategoryCheckableMultipleBinding import org.koitharu.kotatsu.databinding.ItemShelfSectionDraggableBinding import org.koitharu.kotatsu.shelf.domain.ShelfSection -import org.koitharu.kotatsu.utils.ext.setChecked @SuppressLint("ClickableViewAccessibility") fun shelfSectionAD( diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsViewModel.kt index fb09af8b1..6d9ac2bde 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/ShelfSettingsViewModel.kt @@ -5,14 +5,14 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.combine -import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.favourites.domain.FavouritesRepository +import org.koitharu.kotatsu.parsers.util.move import org.koitharu.kotatsu.shelf.domain.ShelfSection -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.move import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/size/ShelfSizeBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/size/ShelfSizeBottomSheet.kt index 9677f8d4e..26f74d59b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/size/ShelfSizeBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/config/size/ShelfSizeBottomSheet.kt @@ -9,11 +9,11 @@ import com.google.android.material.slider.LabelFormatter import com.google.android.material.slider.Slider import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseBottomSheet import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BaseBottomSheet +import org.koitharu.kotatsu.core.util.ext.setValueRounded +import org.koitharu.kotatsu.core.util.progress.IntPercentLabelFormatter import org.koitharu.kotatsu.databinding.SheetShelfSizeBinding -import org.koitharu.kotatsu.utils.ext.setValueRounded -import org.koitharu.kotatsu.utils.progress.IntPercentLabelFormatter import javax.inject.Inject @AndroidEntryPoint @@ -26,13 +26,13 @@ class ShelfSizeBottomSheet : lateinit var settings: AppSettings private var labelFormatter: LabelFormatter? = null - override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetShelfSizeBinding { + override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetShelfSizeBinding { return SheetShelfSizeBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - labelFormatter = IntPercentLabelFormatter(view.context) + override fun onViewBindingCreated(binding: SheetShelfSizeBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) + labelFormatter = IntPercentLabelFormatter(binding.root.context) binding.sliderGrid.addOnChangeListener(this) binding.buttonSmall.setOnClickListener(this) binding.buttonLarge.setOnClickListener(this) @@ -47,11 +47,11 @@ class ShelfSizeBottomSheet : override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) { settings.gridSize = value.toInt() - binding.textViewLabel.text = labelFormatter?.getFormattedValue(value) + requireViewBinding().textViewLabel.text = labelFormatter?.getFormattedValue(value) } override fun onClick(v: View) { - val slider = binding.sliderGrid + val slider = requireViewBinding().sliderGrid when (v.id) { R.id.button_small -> slider.setValueRounded(slider.value - slider.stepSize) R.id.button_large -> slider.setValueRounded(slider.value + slider.stepSize) diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt index 14c4561d8..873d7750e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt @@ -7,9 +7,9 @@ import org.koitharu.kotatsu.core.db.entity.toEntities import org.koitharu.kotatsu.core.db.entity.toEntity import org.koitharu.kotatsu.core.db.entity.toManga import org.koitharu.kotatsu.core.db.entity.toMangaTags +import org.koitharu.kotatsu.core.util.ext.mapItems import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.suggestions.data.SuggestionEntity -import org.koitharu.kotatsu.utils.ext.mapItems import javax.inject.Inject class SuggestionRepository @Inject constructor( diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/TagsBlacklist.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/TagsBlacklist.kt index 691928fa8..a408dd722 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/TagsBlacklist.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/TagsBlacklist.kt @@ -1,8 +1,8 @@ package org.koitharu.kotatsu.suggestions.domain +import org.koitharu.kotatsu.core.util.ext.almostEquals import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.utils.ext.almostEquals class TagsBlacklist( private val tags: Set, diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsActivity.kt index 4e225378d..9c38cf50c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsActivity.kt @@ -9,10 +9,9 @@ import androidx.fragment.app.commit import com.google.android.material.appbar.AppBarLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivityContainerBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner -import kotlin.text.Typography.dagger @AndroidEntryPoint class SuggestionsActivity : @@ -20,7 +19,7 @@ class SuggestionsActivity : AppBarOwner { override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -37,7 +36,7 @@ class SuggestionsActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsFragment.kt index a1c8ad796..17fdb6830 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsFragment.kt @@ -4,24 +4,24 @@ import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem -import android.view.View import androidx.appcompat.view.ActionMode import androidx.core.view.MenuProvider import androidx.fragment.app.viewModels import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.ui.list.ListSelectionController +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.settings.SettingsActivity -import org.koitharu.kotatsu.utils.ext.addMenuProvider class SuggestionsFragment : MangaListFragment() { override val viewModel by viewModels() override val isSwipeRefreshEnabled = false - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) addMenuProvider(SuggestionMenuProvider()) } @@ -42,16 +42,18 @@ class SuggestionsFragment : MangaListFragment() { R.id.action_update -> { SuggestionsWorker.startNow(requireContext()) Snackbar.make( - binding.recyclerView, + requireViewBinding().recyclerView, R.string.feed_will_update_soon, Snackbar.LENGTH_LONG, ).show() true } + R.id.action_settings -> { startActivity(SettingsActivity.newSuggestionsSettingsIntent(requireContext())) true } + else -> false } } diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt index bbb548e77..acf3fe5d1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt @@ -9,6 +9,8 @@ import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.onFirst import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -16,8 +18,6 @@ import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.list.ui.model.toErrorState import org.koitharu.kotatsu.list.ui.model.toUi import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.onFirst import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt index 23f1f2766..e96b56930 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsWorker.kt @@ -38,6 +38,12 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.distinctById import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.almostEquals +import org.koitharu.kotatsu.core.util.ext.asArrayList +import org.koitharu.kotatsu.core.util.ext.flatten +import org.koitharu.kotatsu.core.util.ext.takeMostFrequent +import org.koitharu.kotatsu.core.util.ext.toBitmapOrNull +import org.koitharu.kotatsu.core.util.ext.trySetForeground import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.history.domain.HistoryRepository @@ -45,18 +51,12 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.suggestions.domain.MangaSuggestion import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository import org.koitharu.kotatsu.suggestions.domain.TagsBlacklist -import org.koitharu.kotatsu.utils.ext.almostEquals -import org.koitharu.kotatsu.utils.ext.asArrayList -import org.koitharu.kotatsu.utils.ext.flatten -import org.koitharu.kotatsu.utils.ext.printStackTraceDebug -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.takeMostFrequent -import org.koitharu.kotatsu.utils.ext.toBitmapOrNull -import org.koitharu.kotatsu.utils.ext.trySetForeground +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.util.concurrent.TimeUnit import kotlin.math.pow import kotlin.random.Random @@ -74,6 +74,10 @@ class SuggestionsWorker @AssistedInject constructor( ) : CoroutineWorker(appContext, params) { override suspend fun doWork(): Result { + if (!appSettings.isSuggestionsEnabled) { + suggestionRepository.clear() + return Result.success() + } trySetForeground() val count = doWorkImpl() val outputData = workDataOf(DATA_COUNT to count) @@ -112,10 +116,6 @@ class SuggestionsWorker @AssistedInject constructor( } private suspend fun doWorkImpl(): Int { - if (!appSettings.isSuggestionsEnabled) { - suggestionRepository.clear() - return 0 - } val seed = ( historyRepository.getList(0, 20) + favouritesRepository.getLastManga(20) diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt b/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt index a3792664f..822c5736f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncAuthApi.kt @@ -5,10 +5,10 @@ import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONObject import org.koitharu.kotatsu.core.exceptions.SyncApiException +import org.koitharu.kotatsu.core.util.ext.toRequestBody import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.parsers.util.parseJson import org.koitharu.kotatsu.parsers.util.removeSurrounding -import org.koitharu.kotatsu.utils.ext.toRequestBody import javax.inject.Inject @Reusable diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncSettings.kt b/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncSettings.kt index cee53bdb0..7e211e3d4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/data/SyncSettings.kt @@ -7,7 +7,7 @@ import androidx.annotation.WorkerThread import dagger.Reusable import dagger.hilt.android.qualifiers.ApplicationContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.utils.ext.ifNullOrEmpty +import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty import javax.inject.Inject @Reusable diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt b/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt index 32cd68134..ba00c6285 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt @@ -23,7 +23,7 @@ import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.TABLE_FAVOURITES import org.koitharu.kotatsu.core.db.TABLE_FAVOURITE_CATEGORIES import org.koitharu.kotatsu.core.db.TABLE_HISTORY -import org.koitharu.kotatsu.utils.ext.processLifecycleScope +import org.koitharu.kotatsu.core.util.ext.processLifecycleScope import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Provider diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncHelper.kt b/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncHelper.kt index 089cb6a9c..e8c740c1b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncHelper.kt @@ -26,15 +26,15 @@ import org.koitharu.kotatsu.core.db.TABLE_TAGS import org.koitharu.kotatsu.core.logs.LoggersModule import org.koitharu.kotatsu.core.network.GZipInterceptor import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.parseJsonOrNull +import org.koitharu.kotatsu.core.util.ext.toContentValues +import org.koitharu.kotatsu.core.util.ext.toJson +import org.koitharu.kotatsu.core.util.ext.toRequestBody import org.koitharu.kotatsu.parsers.util.json.mapJSONTo import org.koitharu.kotatsu.sync.data.SyncAuthApi import org.koitharu.kotatsu.sync.data.SyncAuthenticator import org.koitharu.kotatsu.sync.data.SyncInterceptor import org.koitharu.kotatsu.sync.data.SyncSettings -import org.koitharu.kotatsu.utils.ext.parseJsonOrNull -import org.koitharu.kotatsu.utils.ext.toContentValues -import org.koitharu.kotatsu.utils.ext.toJson -import org.koitharu.kotatsu.utils.ext.toRequestBody import java.util.concurrent.TimeUnit private const val FIELD_TIMESTAMP = "timestamp" diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt index cf24fb7b9..cf234eb23 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt @@ -19,12 +19,12 @@ import androidx.transition.TransitionManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat import org.koitharu.kotatsu.databinding.ActivitySyncAuthBinding import org.koitharu.kotatsu.sync.data.SyncSettings import org.koitharu.kotatsu.sync.domain.SyncAuthResult -import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat @AndroidEntryPoint class SyncAuthActivity : BaseActivity(), View.OnClickListener, FragmentResultListener { @@ -41,14 +41,14 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi accountAuthenticatorResponse = intent.getParcelableExtraCompat(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE) accountAuthenticatorResponse?.onRequestContinued() - binding.buttonCancel.setOnClickListener(this) - binding.buttonNext.setOnClickListener(this) - binding.buttonBack.setOnClickListener(this) - binding.buttonDone.setOnClickListener(this) - binding.layoutProgress.setOnClickListener(this) - binding.buttonSettings.setOnClickListener(this) - binding.editEmail.addTextChangedListener(EmailTextWatcher(binding.buttonNext)) - binding.editPassword.addTextChangedListener(PasswordTextWatcher(binding.buttonDone)) + viewBinding.buttonCancel.setOnClickListener(this) + viewBinding.buttonNext.setOnClickListener(this) + viewBinding.buttonBack.setOnClickListener(this) + viewBinding.buttonDone.setOnClickListener(this) + viewBinding.layoutProgress.setOnClickListener(this) + viewBinding.buttonSettings.setOnClickListener(this) + viewBinding.editEmail.addTextChangedListener(EmailTextWatcher(viewBinding.buttonNext)) + viewBinding.editPassword.addTextChangedListener(PasswordTextWatcher(viewBinding.buttonDone)) onBackPressedDispatcher.addCallback(pageBackCallback) @@ -65,7 +65,7 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi override fun onWindowInsetsChanged(insets: Insets) { val basePadding = resources.getDimensionPixelOffset(R.dimen.screen_padding) - binding.root.setPadding( + viewBinding.root.setPadding( basePadding + insets.left, basePadding + insets.top, basePadding + insets.right, @@ -81,21 +81,21 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi } R.id.button_next -> { - binding.groupLogin.isVisible = false - binding.groupPassword.isVisible = true + viewBinding.groupLogin.isVisible = false + viewBinding.groupPassword.isVisible = true pageBackCallback.update() } R.id.button_back -> { - binding.groupPassword.isVisible = false - binding.groupLogin.isVisible = true + viewBinding.groupPassword.isVisible = false + viewBinding.groupLogin.isVisible = true pageBackCallback.update() } R.id.button_done -> { viewModel.obtainToken( - email = binding.editEmail.text.toString(), - password = binding.editPassword.text.toString(), + email = viewBinding.editEmail.text.toString(), + password = viewBinding.editPassword.text.toString(), ) } @@ -120,11 +120,11 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi } private fun onLoadingStateChanged(isLoading: Boolean) { - if (isLoading == binding.layoutProgress.isVisible) { + if (isLoading == viewBinding.layoutProgress.isVisible) { return } - TransitionManager.beginDelayedTransition(binding.root, Fade()) - binding.layoutProgress.isVisible = isLoading + TransitionManager.beginDelayedTransition(viewBinding.root, Fade()) + viewBinding.layoutProgress.isVisible = isLoading pageBackCallback.update() } @@ -198,13 +198,13 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi private inner class PageBackCallback : OnBackPressedCallback(false) { override fun handleOnBackPressed() { - binding.groupLogin.isVisible = true - binding.groupPassword.isVisible = false + viewBinding.groupLogin.isVisible = true + viewBinding.groupPassword.isVisible = false update() } fun update() { - isEnabled = !binding.layoutProgress.isVisible && binding.groupPassword.isVisible + isEnabled = !viewBinding.layoutProgress.isVisible && viewBinding.groupPassword.isVisible } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthViewModel.kt index d86bc3c8d..6aea529a5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthViewModel.kt @@ -7,11 +7,11 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty import org.koitharu.kotatsu.sync.data.SyncAuthApi import org.koitharu.kotatsu.sync.domain.SyncAuthResult -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.ifNullOrEmpty import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncHostDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncHostDialogFragment.kt index 970c33938..735adb19a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncHostDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncHostDialogFragment.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.sync.ui import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.view.ViewGroup.MarginLayoutParams import android.widget.ArrayAdapter @@ -13,7 +12,7 @@ import androidx.fragment.app.FragmentManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.AlertDialogFragment +import org.koitharu.kotatsu.core.ui.AlertDialogFragment import org.koitharu.kotatsu.databinding.PreferenceDialogAutocompletetextviewBinding import org.koitharu.kotatsu.settings.DomainValidator import org.koitharu.kotatsu.sync.data.SyncSettings @@ -26,7 +25,7 @@ class SyncHostDialogFragment : AlertDialogFragment { - topMargin = view.resources.getDimensionPixelOffset(R.dimen.screen_padding) + topMargin = binding.root.resources.getDimensionPixelOffset(R.dimen.screen_padding) bottomMargin = topMargin } binding.message.setText(R.string.sync_host_description) - val entries = view.resources.getStringArray(R.array.sync_host_list) + val entries = binding.root.resources.getStringArray(R.array.sync_host_list) val editText = binding.edit editText.setText(syncSettings.host) editText.threshold = 0 - editText.setAdapter(ArrayAdapter(view.context, android.R.layout.simple_spinner_dropdown_item, entries)) + editText.setAdapter(ArrayAdapter(binding.root.context, android.R.layout.simple_spinner_dropdown_item, entries)) binding.dropdown.setOnClickListener { editText.showDropDown() } @@ -60,7 +62,7 @@ class SyncHostDialogFragment : AlertDialogFragment { - val result = binding.edit.text?.toString().orEmpty() + val result = requireViewBinding().edit.text?.toString().orEmpty() syncSettings.host = result parentFragmentManager.setFragmentResult(REQUEST_KEY, bundleOf(KEY_HOST to result)) } diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/favourites/FavouritesSyncAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/favourites/FavouritesSyncAdapter.kt index ff0157857..cb9dcecca 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/favourites/FavouritesSyncAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/favourites/FavouritesSyncAdapter.kt @@ -7,10 +7,10 @@ import android.content.Context import android.content.SyncResult import android.os.Bundle import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.onError +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.sync.domain.SyncController import org.koitharu.kotatsu.sync.domain.SyncHelper -import org.koitharu.kotatsu.utils.ext.onError -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable class FavouritesSyncAdapter(context: Context) : AbstractThreadedSyncAdapter(context, true) { diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/history/HistorySyncAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/history/HistorySyncAdapter.kt index 9297ea5fc..279724dd7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/history/HistorySyncAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/history/HistorySyncAdapter.kt @@ -7,10 +7,10 @@ import android.content.Context import android.content.SyncResult import android.os.Bundle import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.util.ext.onError +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.sync.domain.SyncController import org.koitharu.kotatsu.sync.domain.SyncHelper -import org.koitharu.kotatsu.utils.ext.onError -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable class HistorySyncAdapter(context: Context) : AbstractThreadedSyncAdapter(context, true) { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedFragment.kt index ac4d538af..b06b063be 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedFragment.kt @@ -12,10 +12,12 @@ import coil.ImageLoader import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseFragment -import org.koitharu.kotatsu.base.ui.list.PaginationScrollListener -import org.koitharu.kotatsu.base.ui.list.decor.TypedSpacingItemDecoration import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver +import org.koitharu.kotatsu.core.ui.BaseFragment +import org.koitharu.kotatsu.core.ui.list.PaginationScrollListener +import org.koitharu.kotatsu.core.ui.list.decor.TypedSpacingItemDecoration +import org.koitharu.kotatsu.core.util.ext.addMenuProvider +import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.databinding.FragmentFeedBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.list.ui.adapter.MangaListListener @@ -26,8 +28,6 @@ import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.tracker.ui.feed.adapter.FeedAdapter import org.koitharu.kotatsu.tracker.work.TrackWorker -import org.koitharu.kotatsu.utils.ext.addMenuProvider -import org.koitharu.kotatsu.utils.ext.getThemeColor import javax.inject.Inject @AndroidEntryPoint @@ -43,13 +43,13 @@ class FeedFragment : private var feedAdapter: FeedAdapter? = null - override fun onInflateView( + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, ) = FragmentFeedBinding.inflate(inflater, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onViewBindingCreated(binding: FragmentFeedBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) feedAdapter = FeedAdapter(coil, viewLifecycleOwner, this) with(binding.recyclerView) { adapter = feedAdapter @@ -80,7 +80,7 @@ class FeedFragment : viewModel.onFeedCleared.observe(viewLifecycleOwner) { onFeedCleared() } - TrackWorker.getIsRunningLiveData(view.context.applicationContext) + TrackWorker.getIsRunningLiveData(binding.root.context.applicationContext) .observe(viewLifecycleOwner, this::onIsTrackerRunningChanged) } @@ -90,7 +90,7 @@ class FeedFragment : } override fun onWindowInsetsChanged(insets: Insets) { - binding.recyclerView.updatePadding( + requireViewBinding().recyclerView.updatePadding( bottom = insets.bottom, ) } @@ -115,7 +115,7 @@ class FeedFragment : private fun onFeedCleared() { val snackbar = Snackbar.make( - binding.recyclerView, + requireViewBinding().recyclerView, R.string.updates_feed_cleared, Snackbar.LENGTH_LONG, ) @@ -124,7 +124,7 @@ class FeedFragment : } private fun onIsTrackerRunningChanged(isRunning: Boolean) { - binding.swipeRefreshLayout.isRefreshing = isRunning + requireViewBinding().swipeRefreshLayout.isRefreshing = isRunning } override fun onScrolledToEnd() { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedMenuProvider.kt index 3f154324c..88d888039 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedMenuProvider.kt @@ -7,7 +7,7 @@ import android.view.MenuItem import android.view.View import androidx.core.view.MenuProvider import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.dialog.CheckBoxAlertDialog +import org.koitharu.kotatsu.core.ui.dialog.CheckBoxAlertDialog import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.tracker.work.TrackWorker diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedViewModel.kt index 2a5c6bcc5..5c80f4a09 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/FeedViewModel.kt @@ -6,17 +6,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseViewModel -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo +import org.koitharu.kotatsu.core.util.SingleLiveEvent +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.daysDiff import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.tracker.domain.TrackingRepository import org.koitharu.kotatsu.tracker.domain.model.TrackingLogItem import org.koitharu.kotatsu.tracker.ui.feed.model.toFeedItem -import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.daysDiff import java.util.Date import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt index a0ddea045..64963e946 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedAdapter.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.core.ui.DateTimeAgo +import org.koitharu.kotatsu.core.ui.model.DateTimeAgo import org.koitharu.kotatsu.list.ui.adapter.MangaListListener import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD import org.koitharu.kotatsu.list.ui.adapter.errorFooterAD diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt index ce123e0b2..c7b57d4b6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/feed/adapter/FeedItemAD.kt @@ -4,16 +4,16 @@ import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.disposeImageRequest +import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.isBold +import org.koitharu.kotatsu.core.util.ext.newImageRequest +import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.databinding.ItemFeedBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.tracker.ui.feed.model.FeedItem -import org.koitharu.kotatsu.utils.ext.disposeImageRequest -import org.koitharu.kotatsu.utils.ext.enqueueWith -import org.koitharu.kotatsu.utils.ext.isBold -import org.koitharu.kotatsu.utils.ext.newImageRequest -import org.koitharu.kotatsu.utils.ext.source fun feedItemAD( coil: ImageLoader, diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesActivity.kt index 56f213dd1..047b0d7ca 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesActivity.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.commit import com.google.android.material.appbar.AppBarLayout import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivityContainerBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner @@ -19,7 +19,7 @@ class UpdatesActivity : AppBarOwner { override val appBar: AppBarLayout - get() = binding.appbar + get() = viewBinding.appbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -36,7 +36,7 @@ class UpdatesActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.root.updatePadding( + viewBinding.root.updatePadding( left = insets.left, right = insets.right, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt index bebfb7a58..bb46a503f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt @@ -10,6 +10,8 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.util.asFlowLiveData +import org.koitharu.kotatsu.core.util.ext.onFirst import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.PROGRESS_NONE @@ -23,8 +25,6 @@ import org.koitharu.kotatsu.list.ui.model.toListDetailedModel import org.koitharu.kotatsu.list.ui.model.toListModel import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.tracker.domain.TrackingRepository -import org.koitharu.kotatsu.utils.asFlowLiveData -import org.koitharu.kotatsu.utils.ext.onFirst import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt index fc32bf3ee..06e8d25c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt @@ -41,14 +41,14 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.logs.FileLogger import org.koitharu.kotatsu.core.logs.TrackerLogger import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.util.ext.toBitmapOrNull +import org.koitharu.kotatsu.core.util.ext.trySetForeground import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.tracker.domain.Tracker import org.koitharu.kotatsu.tracker.domain.model.MangaUpdates -import org.koitharu.kotatsu.utils.ext.runCatchingCancellable -import org.koitharu.kotatsu.utils.ext.toBitmapOrNull -import org.koitharu.kotatsu.utils.ext.trySetForeground import java.util.concurrent.TimeUnit @HiltWorker @@ -84,9 +84,7 @@ class TrackWorker @AssistedInject constructor( if (!settings.isTrackerEnabled) { return Result.success(workDataOf(0, 0)) } - if (TAG in tags) { // not expedited - trySetForeground() - } + trySetForeground() val tracks = tracker.getAllTracks() logger.log("Total ${tracks.size} tracks") if (tracks.isEmpty()) { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LayoutManagerExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/LayoutManagerExt.kt deleted file mode 100644 index 57e9c4a8f..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LayoutManagerExt.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.koitharu.kotatsu.utils.ext - -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.StaggeredGridLayoutManager - -internal val RecyclerView.LayoutManager?.firstVisibleItemPosition - get() = when (this) { - is LinearLayoutManager -> findFirstVisibleItemPosition() - is StaggeredGridLayoutManager -> findFirstVisibleItemPositions(null)[0] - else -> 0 - } - -internal val RecyclerView.LayoutManager?.isLayoutReversed - get() = when (this) { - is LinearLayoutManager -> reverseLayout - is StaggeredGridLayoutManager -> reverseLayout - else -> false - } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt index f88a0525a..fc263b5d7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt @@ -12,11 +12,11 @@ import coil.size.Size import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.runBlocking import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaIntent +import org.koitharu.kotatsu.core.parser.MangaIntent +import org.koitharu.kotatsu.core.util.ext.getDrawableOrThrow import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.util.replaceWith -import org.koitharu.kotatsu.utils.ext.getDrawableOrThrow class RecentListFactory( private val context: Context, diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt index b5d3f5eb0..15e453361 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt @@ -13,10 +13,10 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.BaseActivity -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver import org.koitharu.kotatsu.core.prefs.AppWidgetConfig +import org.koitharu.kotatsu.core.ui.BaseActivity +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.databinding.ActivityCategoriesBinding import org.koitharu.kotatsu.widget.shelf.adapter.CategorySelectAdapter import org.koitharu.kotatsu.widget.shelf.model.CategoryItem @@ -41,10 +41,10 @@ class ShelfConfigActivity : setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } adapter = CategorySelectAdapter(this) - binding.recyclerView.adapter = adapter - binding.buttonDone.isVisible = true - binding.buttonDone.setOnClickListener(this) - binding.fabAdd.hide() + viewBinding.recyclerView.adapter = adapter + viewBinding.buttonDone.isVisible = true + viewBinding.buttonDone.setOnClickListener(this) + viewBinding.fabAdd.hide() val appWidgetId = intent?.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID, @@ -57,7 +57,7 @@ class ShelfConfigActivity : viewModel.checkedId = config.categoryId viewModel.content.observe(this, this::onContentChanged) - viewModel.onError.observe(this, SnackbarErrorObserver(binding.recyclerView, null)) + viewModel.onError.observe(this, SnackbarErrorObserver(viewBinding.recyclerView, null)) } override fun onClick(v: View) { @@ -79,17 +79,17 @@ class ShelfConfigActivity : } override fun onWindowInsetsChanged(insets: Insets) { - binding.fabAdd.updateLayoutParams { + viewBinding.fabAdd.updateLayoutParams { rightMargin = topMargin + insets.right leftMargin = topMargin + insets.left bottomMargin = topMargin + insets.bottom } - binding.recyclerView.updatePadding( + viewBinding.recyclerView.updatePadding( left = insets.left, right = insets.right, bottom = insets.bottom, ) - with(binding.toolbar) { + with(viewBinding.toolbar) { updatePadding( left = insets.left, right = insets.right, diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigViewModel.kt index d8d2f2599..1208cb5dd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigViewModel.kt @@ -6,9 +6,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine -import org.koitharu.kotatsu.base.ui.BaseViewModel +import org.koitharu.kotatsu.core.ui.BaseViewModel +import org.koitharu.kotatsu.core.util.asFlowLiveData import org.koitharu.kotatsu.favourites.domain.FavouritesRepository -import org.koitharu.kotatsu.utils.asFlowLiveData import org.koitharu.kotatsu.widget.shelf.model.CategoryItem import javax.inject.Inject diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt index 74caff390..fb914916f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt @@ -12,12 +12,12 @@ import coil.size.Size import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.runBlocking import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.domain.MangaIntent +import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.prefs.AppWidgetConfig +import org.koitharu.kotatsu.core.util.ext.getDrawableOrThrow import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.util.replaceWith -import org.koitharu.kotatsu.utils.ext.getDrawableOrThrow class ShelfListFactory( private val context: Context, diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectAdapter.kt index 39f90c22e..10fac5806 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectAdapter.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.widget.shelf.adapter import androidx.recyclerview.widget.DiffUtil import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.widget.shelf.model.CategoryItem class CategorySelectAdapter( @@ -30,4 +30,4 @@ class CategorySelectAdapter( return super.getChangePayload(oldItem, newItem) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectItemAD.kt index ce4ded99d..9de2ab3b8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/adapter/CategorySelectItemAD.kt @@ -2,14 +2,14 @@ package org.koitharu.kotatsu.widget.shelf.adapter import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.databinding.ItemCategoryCheckableSingleBinding import org.koitharu.kotatsu.widget.shelf.model.CategoryItem fun categorySelectItemAD( clickListener: OnListItemClickListener ) = adapterDelegateViewBinding( - { inflater, parent -> ItemCategoryCheckableSingleBinding.inflate(inflater, parent, false) } + { inflater, parent -> ItemCategoryCheckableSingleBinding.inflate(inflater, parent, false) }, ) { itemView.setOnClickListener { @@ -22,4 +22,4 @@ fun categorySelectItemAD( isChecked = item.isSelected } } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout-w600dp/activity_categories.xml b/app/src/main/res/layout-w600dp/activity_categories.xml index fbd53ee8b..a7c07c39e 100644 --- a/app/src/main/res/layout-w600dp/activity_categories.xml +++ b/app/src/main/res/layout-w600dp/activity_categories.xml @@ -64,7 +64,7 @@ app:icon="@drawable/ic_add" app:layout_anchor="@id/recyclerView" app:layout_anchorGravity="bottom|end" - app:layout_behavior="org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior" + app:layout_behavior="org.koitharu.kotatsu.core.ui.util.ShrinkOnScrollBehavior" app:layout_dodgeInsetEdges="bottom" /> diff --git a/app/src/main/res/layout-w600dp/activity_main.xml b/app/src/main/res/layout-w600dp/activity_main.xml index 6e09a349a..320e64005 100644 --- a/app/src/main/res/layout-w600dp/activity_main.xml +++ b/app/src/main/res/layout-w600dp/activity_main.xml @@ -40,7 +40,7 @@ android:stateListAnimator="@null" app:liftOnScroll="false"> - - - - - diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 13d34ca0d..11ca45679 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -48,7 +48,7 @@ app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.BottomSheet" tools:visibility="visible"> - - + - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml index 086aa7c8e..84c59071a 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_list.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/app/src/main/res/layout/fragment_list_simple.xml b/app/src/main/res/layout/fragment_list_simple.xml index 49beabba9..ff3ae6128 100644 --- a/app/src/main/res/layout/fragment_list_simple.xml +++ b/app/src/main/res/layout/fragment_list_simple.xml @@ -7,7 +7,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_checkable_new.xml b/app/src/main/res/layout/item_checkable_new.xml index 6e523dad8..cc7a4847b 100644 --- a/app/src/main/res/layout/item_checkable_new.xml +++ b/app/src/main/res/layout/item_checkable_new.xml @@ -1,5 +1,5 @@ - \ No newline at end of file + tools:text="@tools:sample/full_names" /> diff --git a/app/src/main/res/layout/item_color_scheme.xml b/app/src/main/res/layout/item_color_scheme.xml index 9389a70c2..58ec38333 100644 --- a/app/src/main/res/layout/item_color_scheme.xml +++ b/app/src/main/res/layout/item_color_scheme.xml @@ -32,7 +32,7 @@ app:layout_constraintTop_toTopOf="parent" tools:ignore="HardcodedText" /> - - - - - - - - - \ No newline at end of file + app:chipSpacingVertical="6dp" /> diff --git a/app/src/main/res/layout/item_storage.xml b/app/src/main/res/layout/item_storage.xml index 3df31113f..72e9f513b 100644 --- a/app/src/main/res/layout/item_storage.xml +++ b/app/src/main/res/layout/item_storage.xml @@ -11,7 +11,7 @@ android:paddingEnd="?listPreferredItemPaddingEnd" android:paddingBottom="16dp"> - - \ No newline at end of file + diff --git a/app/src/main/res/layout/layout_memory_usage.xml b/app/src/main/res/layout/layout_memory_usage.xml index d03feaa4e..6d6212caa 100644 --- a/app/src/main/res/layout/layout_memory_usage.xml +++ b/app/src/main/res/layout/layout_memory_usage.xml @@ -32,7 +32,7 @@ - - @@ -23,7 +23,7 @@ android:visibility="gone" tools:visibility="visible" /> - + - - - - + - - diff --git a/app/src/main/res/layout/sheet_reader_config.xml b/app/src/main/res/layout/sheet_reader_config.xml index da53770e9..44e59ffee 100644 --- a/app/src/main/res/layout/sheet_reader_config.xml +++ b/app/src/main/res/layout/sheet_reader_config.xml @@ -7,7 +7,7 @@ android:layout_height="wrap_content" android:orientation="vertical"> - - - - - - - +