From 4a31a916bf31c3251f4f5e91bf792b71002d60ca Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Wed, 16 Oct 2024 23:10:35 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20ViewModel=20accessing?= =?UTF-8?q?=20reformat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Reformatted a way to get State and Event in Composables --- .../java/ua/acclorite/book_story/Activity.kt | 15 +- .../ViewModelCompositionProvider.kt | 91 --- .../core/navigation/Navigation.kt | 6 +- .../presentation/core/util/BaseViewModel.kt | 9 - .../presentation/core/util/Extensions.kt | 3 - .../presentation/core/util/UiViewModel.kt | 26 + .../book_story/presentation/data/MainEvent.kt | 6 + .../presentation/data/MainViewModel.kt | 611 +++++++++--------- .../presentation/screens/about/AboutScreen.kt | 6 +- .../about/components/AboutUpdateDialog.kt | 6 +- .../about/components/badges/AboutBadges.kt | 4 +- .../screens/about/data/AboutViewModel.kt | 23 +- .../about/nested/credits/CreditsScreen.kt | 4 +- .../nested/license_info/LicenseInfoScreen.kt | 22 +- .../license_info/data/LicenseInfoEvent.kt | 7 + .../license_info/data/LicenseInfoViewModel.kt | 44 +- .../about/nested/licenses/LicensesScreen.kt | 9 +- .../nested/licenses/data/LicensesEvent.kt | 7 +- .../nested/licenses/data/LicensesViewModel.kt | 26 +- .../screens/book_info/BookInfoScreen.kt | 22 +- .../components/BookInfoDescriptionSection.kt | 6 +- .../components/BookInfoInfoSection.kt | 6 +- .../components/BookInfoMoreBottomSheet.kt | 4 +- .../components/BookInfoStatisticSection.kt | 4 +- .../book_info/components/BookInfoTopBar.kt | 14 +- .../BookInfoChangeCoverBottomSheet.kt | 14 +- .../BookInfoDetailsBottomSheet.kt | 6 +- .../dialog/BookInfoConfirmUpdateDialog.kt | 12 +- .../components/dialog/BookInfoDeleteDialog.kt | 16 +- .../components/dialog/BookInfoMoveDialog.kt | 14 +- .../screens/book_info/data/BookInfoEvent.kt | 10 + .../book_info/data/BookInfoViewModel.kt | 55 +- .../screens/browse/BrowseScreen.kt | 24 +- .../components/BrowseEmptyPlaceholder.kt | 6 +- .../BrowseStoragePermissionDialog.kt | 4 +- .../adding_dialog/BrowseAddingDialog.kt | 10 +- .../BrowseFilterBottomSheet.kt | 6 +- .../browse/components/layout/BrowseLayout.kt | 4 +- .../layout/grid/BrowseGridLayout.kt | 4 +- .../layout/list/BrowseListLayout.kt | 4 +- .../browse/components/top_bar/BrowseTopBar.kt | 10 +- .../top_bar/BrowseTopBarDirectoryPath.kt | 10 +- .../screens/browse/data/BrowseEvent.kt | 2 + .../screens/browse/data/BrowseViewModel.kt | 223 ++++--- .../presentation/screens/help/HelpScreen.kt | 25 +- .../screens/help/data/HelpEvent.kt | 7 +- .../screens/help/data/HelpViewModel.kt | 34 +- .../screens/history/HistoryScreen.kt | 12 +- .../HistoryDeleteWholeHistoryDialog.kt | 8 +- .../screens/history/data/HistoryViewModel.kt | 15 +- .../screens/library/LibraryScreen.kt | 14 +- .../library/components/LibraryTopBar.kt | 6 +- .../components/dialog/LibraryDeleteDialog.kt | 14 +- .../components/dialog/LibraryMoveDialog.kt | 10 +- .../screens/library/data/LibraryViewModel.kt | 27 +- .../screens/reader/ReaderScreen.kt | 95 +-- .../reader/components/ReaderChaptersDrawer.kt | 14 +- .../components/ReaderFastColorPresetChange.kt | 4 +- .../reader/components/ReaderTextParagraph.kt | 4 +- .../reader/components/ReaderUpdateDialog.kt | 4 +- .../components/app_bar/ReaderBottomBar.kt | 22 +- .../reader/components/app_bar/ReaderTopBar.kt | 18 +- .../ReaderSettingsBottomSheet.kt | 10 +- .../ReaderSettingsBottomSheetTabRow.kt | 5 +- .../screens/reader/data/ReaderEvent.kt | 18 + .../screens/reader/data/ReaderViewModel.kt | 80 +-- .../settings/data/SettingsViewModel.kt | 29 +- .../settings/AbsoluteDarkSetting.kt | 6 +- .../components/settings/ColorPresetSetting.kt | 6 +- .../components/settings/DarkThemeSetting.kt | 6 +- .../settings/FastColorPresetChangeSetting.kt | 6 +- .../components/settings/PureDarkSetting.kt | 6 +- .../settings/ThemeContrastSetting.kt | 6 +- .../components/settings/ThemeSetting.kt | 6 +- .../settings/BrowseFilesStructureSetting.kt | 6 +- .../settings/BrowseFilterSetting.kt | 6 +- .../settings/BrowseGridSizeSetting.kt | 6 +- .../settings/BrowseLayoutSetting.kt | 6 +- .../BrowsePinFavoriteDirectoriesSetting.kt | 6 +- .../settings/BrowseSortOrderSetting.kt | 6 +- .../components/settings/AppLanguageSetting.kt | 6 +- .../settings/CheckForUpdatesSetting.kt | 10 +- .../settings/DoublePressExitSetting.kt | 6 +- .../settings/CheckForTextUpdateSetting.kt | 6 +- .../CheckForTextUpdateToastSetting.kt | 6 +- .../settings/CutoutPaddingSetting.kt | 6 +- .../settings/DoubleClickTranslationSetting.kt | 6 +- .../components/settings/FontFamilySetting.kt | 6 +- .../components/settings/FontSizeSetting.kt | 6 +- .../components/settings/FontStyleSetting.kt | 6 +- .../components/settings/FullscreenSetting.kt | 6 +- .../settings/HideBarsOnFastScrollSetting.kt | 6 +- .../settings/KeepScreenOnSetting.kt | 6 +- .../settings/LetterSpacingSetting.kt | 6 +- .../components/settings/LineHeightSetting.kt | 6 +- .../settings/ParagraphHeightSetting.kt | 6 +- .../settings/ParagraphIndentationSetting.kt | 6 +- .../PerceptionExpanderPaddingSetting.kt | 6 +- .../settings/PerceptionExpanderSetting.kt | 6 +- .../PerceptionExpanderThicknessSetting.kt | 6 +- .../settings/ScreenOrientationSetting.kt | 6 +- .../components/settings/SidePaddingSetting.kt | 6 +- .../settings/TextAlignmentSetting.kt | 6 +- .../settings/VerticalPaddingSetting.kt | 6 +- .../presentation/screens/start/StartScreen.kt | 14 +- .../screens/start/components/StartDone.kt | 14 +- .../components/StartNavigationScreenItem.kt | 4 +- .../components/StartNavigationTransition.kt | 4 +- .../screens/start/components/StartSettings.kt | 12 +- .../screens/start/data/StartEvent.kt | 21 +- .../screens/start/data/StartViewModel.kt | 25 +- .../presentation/ui/theme/BlackTheme.kt | 4 +- 112 files changed, 1154 insertions(+), 1060 deletions(-) delete mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/core/components/ViewModelCompositionProvider.kt delete mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/core/util/BaseViewModel.kt create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/core/util/UiViewModel.kt diff --git a/app/src/main/java/ua/acclorite/book_story/Activity.kt b/app/src/main/java/ua/acclorite/book_story/Activity.kt index 8219d8bd..607307d8 100644 --- a/app/src/main/java/ua/acclorite/book_story/Activity.kt +++ b/app/src/main/java/ua/acclorite/book_story/Activity.kt @@ -10,7 +10,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.ime import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -18,12 +17,13 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalFocusManager import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat +import androidx.lifecycle.compose.collectAsStateWithLifecycle import dagger.hilt.android.AndroidEntryPoint -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.components.bottom_navigation_bar.BottomNavigationBar import ua.acclorite.book_story.presentation.core.components.custom_navigation_rail.CustomNavigationRail import ua.acclorite.book_story.presentation.core.navigation.NavigationHost import ua.acclorite.book_story.presentation.core.navigation.Screen +import ua.acclorite.book_story.presentation.data.MainEvent import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.about.AboutScreenRoot import ua.acclorite.book_story.presentation.screens.about.nested.credits.CreditsScreenRoot @@ -76,7 +76,12 @@ class Activity : AppCompatActivity() { } // Initializing all variables - mainViewModel.init(libraryViewModel, settingsViewModel) + mainViewModel.onEvent( + MainEvent.OnInit( + libraryViewModelReady = libraryViewModel.isReady, + settingsViewModelReady = settingsViewModel.isReady + ) + ) // Splash screen installSplashScreen().apply { @@ -90,8 +95,8 @@ class Activity : AppCompatActivity() { WindowCompat.setDecorFitsSystemWindows(window, false) setContent { - val state = LocalMainViewModel.current.state - val isLoaded = mainViewModel.isReady.collectAsState() + val state = MainViewModel.getState() + val isLoaded = mainViewModel.isReady.collectAsStateWithLifecycle() val density = LocalDensity.current val imeInsets = WindowInsets.ime diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/components/ViewModelCompositionProvider.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/components/ViewModelCompositionProvider.kt deleted file mode 100644 index 188abb14..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/components/ViewModelCompositionProvider.kt +++ /dev/null @@ -1,91 +0,0 @@ -package ua.acclorite.book_story.presentation.core.components - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.ProvidableCompositionLocal -import androidx.compose.runtime.State -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.compositionLocalOf -import androidx.hilt.navigation.compose.hiltViewModel -import ua.acclorite.book_story.presentation.core.util.BaseViewModel -import ua.acclorite.book_story.presentation.data.MainEvent -import ua.acclorite.book_story.presentation.data.MainState -import ua.acclorite.book_story.presentation.data.MainViewModel -import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent -import ua.acclorite.book_story.presentation.screens.about.data.AboutState -import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel -import ua.acclorite.book_story.presentation.screens.about.nested.license_info.data.LicenseInfoEvent -import ua.acclorite.book_story.presentation.screens.about.nested.license_info.data.LicenseInfoState -import ua.acclorite.book_story.presentation.screens.about.nested.license_info.data.LicenseInfoViewModel -import ua.acclorite.book_story.presentation.screens.about.nested.licenses.data.LicensesEvent -import ua.acclorite.book_story.presentation.screens.about.nested.licenses.data.LicensesState -import ua.acclorite.book_story.presentation.screens.about.nested.licenses.data.LicensesViewModel -import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent -import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoState -import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel -import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent -import ua.acclorite.book_story.presentation.screens.browse.data.BrowseState -import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel -import ua.acclorite.book_story.presentation.screens.help.data.HelpEvent -import ua.acclorite.book_story.presentation.screens.help.data.HelpState -import ua.acclorite.book_story.presentation.screens.help.data.HelpViewModel -import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent -import ua.acclorite.book_story.presentation.screens.history.data.HistoryState -import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel -import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent -import ua.acclorite.book_story.presentation.screens.library.data.LibraryState -import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel -import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent -import ua.acclorite.book_story.presentation.screens.reader.data.ReaderState -import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel -import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent -import ua.acclorite.book_story.presentation.screens.settings.data.SettingsState -import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel -import ua.acclorite.book_story.presentation.screens.start.data.StartEvent -import ua.acclorite.book_story.presentation.screens.start.data.StartState -import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel - -data class ViewModelComposition( - val state: State, - val onEvent: (E) -> Unit, - val viewModel: V -) - -@Composable -inline fun , S, E> viewModelComposition( -): ProvidableCompositionLocal> { - val viewModel: V = hiltViewModel() - val state = viewModel.state.collectAsState() - - return compositionLocalOf { - ViewModelComposition( - state = state, - onEvent = viewModel::onEvent, - viewModel = viewModel - ) - } -} - -val LocalMainViewModel - @Composable get() = viewModelComposition() -val LocalLibraryViewModel - @Composable get() = viewModelComposition() -val LocalHistoryViewModel - @Composable get() = viewModelComposition() -val LocalBrowseViewModel - @Composable get() = viewModelComposition() -val LocalBookInfoViewModel - @Composable get() = viewModelComposition() -val LocalReaderViewModel - @Composable get() = viewModelComposition() -val LocalSettingsViewModel - @Composable get() = viewModelComposition() -val LocalAboutViewModel - @Composable get() = viewModelComposition() -val LocalLicensesViewModel - @Composable get() = viewModelComposition() -val LocalLicenseInfoViewModel - @Composable get() = viewModelComposition() -val LocalHelpViewModel - @Composable get() = viewModelComposition() -val LocalStartViewModel - @Composable get() = viewModelComposition() \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/navigation/Navigation.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/navigation/Navigation.kt index 6f046811..c35a1ae2 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/navigation/Navigation.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/navigation/Navigation.kt @@ -174,7 +174,7 @@ class Navigator @AssistedInject constructor( * * @param screen [Screen]. */ - fun putScreen(screen: Screen) { + fun putScreen(screen: Screen) = viewModelScope.launch(Dispatchers.Main.immediate) { var found = false for ((index, arg) in screens.value.withIndex()) { @@ -219,7 +219,7 @@ class Navigator @AssistedInject constructor( screen: Screen, useBackAnimation: Boolean = false, saveInBackStack: Boolean = true - ) = viewModelScope.launch(Dispatchers.Default) { + ) = viewModelScope.launch(Dispatchers.Main.immediate) { if (screen.getRoute() == currentScreen.value) { return@launch } @@ -242,7 +242,7 @@ class Navigator @AssistedInject constructor( */ fun navigateBack( useBackAnimation: Boolean = true - ) = viewModelScope.launch(Dispatchers.Default) { + ) = viewModelScope.launch(Dispatchers.Main.immediate) { if (canGoBack()) { savedStateHandle[USE_BACK_ANIM] = useBackAnimation savedStateHandle[CURRENT_SCREEN] = backStack.value.last() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/BaseViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/BaseViewModel.kt deleted file mode 100644 index 40a3508b..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/BaseViewModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package ua.acclorite.book_story.presentation.core.util - -import androidx.lifecycle.ViewModel -import kotlinx.coroutines.flow.StateFlow - -abstract class BaseViewModel : ViewModel() { - abstract val state: StateFlow - abstract fun onEvent(event: E) -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/Extensions.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/Extensions.kt index eb409f34..f0c8f715 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/Extensions.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/Extensions.kt @@ -20,7 +20,6 @@ fun Intent.launchActivity( activity: ComponentActivity, createChooser: Boolean = false, openInNewWindow: Boolean = true, - success: (() -> Unit)? = null, error: () -> Unit ) { val intent = if (createChooser) Intent.createChooser(this, "") else this @@ -35,8 +34,6 @@ fun Intent.launchActivity( error() return } - - success?.invoke() } fun Float.calculateProgress(digits: Int): String { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/UiViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/UiViewModel.kt new file mode 100644 index 00000000..4af333e6 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/UiViewModel.kt @@ -0,0 +1,26 @@ +package ua.acclorite.book_story.presentation.core.util + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.ViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.flow.StateFlow + + +abstract class UiViewModel : ViewModel() { + abstract val state: StateFlow + abstract fun onEvent(event: E) + + companion object { + @Composable + inline fun , S, E> getState(): State { + return hiltViewModel().state.collectAsStateWithLifecycle() + } + + @Composable + inline fun , S, E> getEvent(): (E) -> Unit { + return hiltViewModel()::onEvent + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt index 32f3a059..ef032e08 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt @@ -1,9 +1,15 @@ package ua.acclorite.book_story.presentation.data import androidx.compose.runtime.Immutable +import kotlinx.coroutines.flow.StateFlow @Immutable sealed class MainEvent { + data class OnInit( + val libraryViewModelReady: StateFlow, + val settingsViewModelReady: StateFlow + ) : MainEvent() + data class OnChangeLanguage(val value: String) : MainEvent() data class OnChangeTheme(val value: String) : MainEvent() data class OnChangeDarkTheme(val value: String) : MainEvent() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt index 3d8c4780..521dca25 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt @@ -1,5 +1,6 @@ package ua.acclorite.book_story.presentation.data +import androidx.compose.runtime.Composable import androidx.datastore.preferences.core.Preferences import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope @@ -12,16 +13,13 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import ua.acclorite.book_story.domain.use_case.data_store.ChangeLanguage import ua.acclorite.book_story.domain.use_case.data_store.GetAllSettings import ua.acclorite.book_story.domain.use_case.data_store.SetDatastore import ua.acclorite.book_story.domain.use_case.remote.CheckForUpdates import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants -import ua.acclorite.book_story.presentation.core.util.BaseViewModel -import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel -import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseFilesStructure import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseLayout import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseSortOrder @@ -42,7 +40,15 @@ class MainViewModel @Inject constructor( private val changeLanguage: ChangeLanguage, private val checkForUpdates: CheckForUpdates, private val getAllSettings: GetAllSettings -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _isReady = MutableStateFlow(false) val isReady = _isReady.asStateFlow() @@ -56,320 +62,317 @@ class MainViewModel @Inject constructor( override val state = _state.asStateFlow() override fun onEvent(event: MainEvent) { - viewModelScope.launch(Dispatchers.IO) { - when (event) { - is MainEvent.OnChangeLanguage -> handleLanguageUpdate(event.value) + when (event) { + is MainEvent.OnInit -> init(event) - is MainEvent.OnChangeDarkTheme -> handleDatastoreUpdate( - key = DataStoreConstants.DARK_THEME, - value = event.value, - updateState = { - it.copy(darkTheme = toDarkTheme()) - } - ) + is MainEvent.OnChangeLanguage -> handleLanguageUpdate(event) - is MainEvent.OnChangePureDark -> handleDatastoreUpdate( - key = DataStoreConstants.PURE_DARK, - value = event.value, - updateState = { - it.copy(pureDark = toPureDark()) - } - ) + is MainEvent.OnChangeDarkTheme -> handleDatastoreUpdate( + key = DataStoreConstants.DARK_THEME, + value = event.value, + updateState = { + it.copy(darkTheme = toDarkTheme()) + } + ) - is MainEvent.OnChangeThemeContrast -> handleDatastoreUpdate( - key = DataStoreConstants.THEME_CONTRAST, - value = event.value, - updateState = { - it.copy(themeContrast = toThemeContrast()) - } - ) + is MainEvent.OnChangePureDark -> handleDatastoreUpdate( + key = DataStoreConstants.PURE_DARK, + value = event.value, + updateState = { + it.copy(pureDark = toPureDark()) + } + ) - is MainEvent.OnChangeTheme -> handleDatastoreUpdate( - key = DataStoreConstants.THEME, - value = event.value, - updateState = { - it.copy(theme = toTheme()) - } - ) + is MainEvent.OnChangeThemeContrast -> handleDatastoreUpdate( + key = DataStoreConstants.THEME_CONTRAST, + value = event.value, + updateState = { + it.copy(themeContrast = toThemeContrast()) + } + ) - is MainEvent.OnChangeFontFamily -> handleDatastoreUpdate( - key = DataStoreConstants.FONT, - value = event.value, - updateState = { - it.copy( - fontFamily = Constants.FONTS.find { font -> font.id == event.value }?.id - ?: Constants.FONTS[0].id - ) - } - ) + is MainEvent.OnChangeTheme -> handleDatastoreUpdate( + key = DataStoreConstants.THEME, + value = event.value, + updateState = { + it.copy(theme = toTheme()) + } + ) - is MainEvent.OnChangeFontStyle -> handleDatastoreUpdate( - key = DataStoreConstants.IS_ITALIC, - value = event.value, - updateState = { - it.copy(isItalic = this) - } - ) + is MainEvent.OnChangeFontFamily -> handleDatastoreUpdate( + key = DataStoreConstants.FONT, + value = event.value, + updateState = { + it.copy( + fontFamily = Constants.FONTS.find { font -> font.id == event.value }?.id + ?: Constants.FONTS[0].id + ) + } + ) - is MainEvent.OnChangeFontSize -> handleDatastoreUpdate( - key = DataStoreConstants.FONT_SIZE, - value = event.value, - updateState = { - it.copy(fontSize = this) - } - ) + is MainEvent.OnChangeFontStyle -> handleDatastoreUpdate( + key = DataStoreConstants.IS_ITALIC, + value = event.value, + updateState = { + it.copy(isItalic = this) + } + ) - is MainEvent.OnChangeLineHeight -> handleDatastoreUpdate( - key = DataStoreConstants.LINE_HEIGHT, - value = event.value, - updateState = { - it.copy(lineHeight = this) - } - ) + is MainEvent.OnChangeFontSize -> handleDatastoreUpdate( + key = DataStoreConstants.FONT_SIZE, + value = event.value, + updateState = { + it.copy(fontSize = this) + } + ) - is MainEvent.OnChangeParagraphHeight -> handleDatastoreUpdate( - key = DataStoreConstants.PARAGRAPH_HEIGHT, - value = event.value, - updateState = { - it.copy(paragraphHeight = this) - } - ) + is MainEvent.OnChangeLineHeight -> handleDatastoreUpdate( + key = DataStoreConstants.LINE_HEIGHT, + value = event.value, + updateState = { + it.copy(lineHeight = this) + } + ) - is MainEvent.OnChangeParagraphIndentation -> handleDatastoreUpdate( - key = DataStoreConstants.PARAGRAPH_INDENTATION, - value = event.value, - updateState = { - it.copy(paragraphIndentation = this) - } - ) + is MainEvent.OnChangeParagraphHeight -> handleDatastoreUpdate( + key = DataStoreConstants.PARAGRAPH_HEIGHT, + value = event.value, + updateState = { + it.copy(paragraphHeight = this) + } + ) - is MainEvent.OnChangeShowStartScreen -> handleDatastoreUpdate( - key = DataStoreConstants.SHOW_START_SCREEN, - value = event.value, - updateState = { - it.copy(showStartScreen = this) - } - ) + is MainEvent.OnChangeParagraphIndentation -> handleDatastoreUpdate( + key = DataStoreConstants.PARAGRAPH_INDENTATION, + value = event.value, + updateState = { + it.copy(paragraphIndentation = this) + } + ) - is MainEvent.OnChangeCheckForUpdates -> handleDatastoreUpdate( - key = DataStoreConstants.CHECK_FOR_UPDATES, - value = event.value, - updateState = { - it.copy(checkForUpdates = this) - } - ) + is MainEvent.OnChangeShowStartScreen -> handleDatastoreUpdate( + key = DataStoreConstants.SHOW_START_SCREEN, + value = event.value, + updateState = { + it.copy(showStartScreen = this) + } + ) - is MainEvent.OnChangeSidePadding -> handleDatastoreUpdate( - key = DataStoreConstants.SIDE_PADDING, - value = event.value, - updateState = { - it.copy(sidePadding = this) - } - ) + is MainEvent.OnChangeCheckForUpdates -> handleDatastoreUpdate( + key = DataStoreConstants.CHECK_FOR_UPDATES, + value = event.value, + updateState = { + it.copy(checkForUpdates = this) + } + ) - is MainEvent.OnChangeDoubleClickTranslation -> handleDatastoreUpdate( - key = DataStoreConstants.DOUBLE_CLICK_TRANSLATION, - value = event.value, - updateState = { - it.copy(doubleClickTranslation = this) - } - ) + is MainEvent.OnChangeSidePadding -> handleDatastoreUpdate( + key = DataStoreConstants.SIDE_PADDING, + value = event.value, + updateState = { + it.copy(sidePadding = this) + } + ) - is MainEvent.OnChangeFastColorPresetChange -> handleDatastoreUpdate( - key = DataStoreConstants.FAST_COLOR_PRESET_CHANGE, - value = event.value, - updateState = { - it.copy(fastColorPresetChange = this) - } - ) + is MainEvent.OnChangeDoubleClickTranslation -> handleDatastoreUpdate( + key = DataStoreConstants.DOUBLE_CLICK_TRANSLATION, + value = event.value, + updateState = { + it.copy(doubleClickTranslation = this) + } + ) - is MainEvent.OnChangeBrowseFilesStructure -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_FILES_STRUCTURE, - value = event.value, - updateState = { - it.copy(browseFilesStructure = toBrowseFilesStructure()) - } - ) + is MainEvent.OnChangeFastColorPresetChange -> handleDatastoreUpdate( + key = DataStoreConstants.FAST_COLOR_PRESET_CHANGE, + value = event.value, + updateState = { + it.copy(fastColorPresetChange = this) + } + ) - is MainEvent.OnChangeBrowseLayout -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_LAYOUT, - value = event.value, - updateState = { - it.copy(browseLayout = toBrowseLayout()) - } - ) + is MainEvent.OnChangeBrowseFilesStructure -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_FILES_STRUCTURE, + value = event.value, + updateState = { + it.copy(browseFilesStructure = toBrowseFilesStructure()) + } + ) - is MainEvent.OnChangeBrowseAutoGridSize -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_AUTO_GRID_SIZE, - value = event.value, - updateState = { - it.copy(browseAutoGridSize = this) - } - ) + is MainEvent.OnChangeBrowseLayout -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_LAYOUT, + value = event.value, + updateState = { + it.copy(browseLayout = toBrowseLayout()) + } + ) - is MainEvent.OnChangeBrowseGridSize -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_GRID_SIZE, - value = event.value, - updateState = { - it.copy(browseGridSize = this) - } - ) + is MainEvent.OnChangeBrowseAutoGridSize -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_AUTO_GRID_SIZE, + value = event.value, + updateState = { + it.copy(browseAutoGridSize = this) + } + ) - is MainEvent.OnChangeBrowsePinFavoriteDirectories -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_PIN_FAVORITE_DIRECTORIES, - value = event.value, - updateState = { - it.copy(browsePinFavoriteDirectories = this) - } - ) + is MainEvent.OnChangeBrowseGridSize -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_GRID_SIZE, + value = event.value, + updateState = { + it.copy(browseGridSize = this) + } + ) - is MainEvent.OnChangeBrowseSortOrder -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_SORT_ORDER, - value = event.value, - updateState = { - it.copy(browseSortOrder = toBrowseSortOrder()) - } - ) + is MainEvent.OnChangeBrowsePinFavoriteDirectories -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_PIN_FAVORITE_DIRECTORIES, + value = event.value, + updateState = { + it.copy(browsePinFavoriteDirectories = this) + } + ) - is MainEvent.OnChangeBrowseSortOrderDescending -> handleDatastoreUpdate( - key = DataStoreConstants.BROWSE_SORT_ORDER_DESCENDING, - value = event.value, - updateState = { - it.copy(browseSortOrderDescending = this) - } - ) + is MainEvent.OnChangeBrowseSortOrder -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_SORT_ORDER, + value = event.value, + updateState = { + it.copy(browseSortOrder = toBrowseSortOrder()) + } + ) - is MainEvent.OnChangeBrowseIncludedFilterItem -> handleBrowseIncludedFilterItemUpdate( - event.value - ) + is MainEvent.OnChangeBrowseSortOrderDescending -> handleDatastoreUpdate( + key = DataStoreConstants.BROWSE_SORT_ORDER_DESCENDING, + value = event.value, + updateState = { + it.copy(browseSortOrderDescending = this) + } + ) - is MainEvent.OnChangeTextAlignment -> handleDatastoreUpdate( - key = DataStoreConstants.TEXT_ALIGNMENT, - value = event.value, - updateState = { - it.copy(textAlignment = toTextAlignment()) - } - ) + is MainEvent.OnChangeBrowseIncludedFilterItem -> handleBrowseIncludedFilterItemUpdate( + event + ) - is MainEvent.OnChangeDoublePressExit -> handleDatastoreUpdate( - key = DataStoreConstants.DOUBLE_PRESS_EXIT, - value = event.value, - updateState = { - it.copy(doublePressExit = this) - } - ) + is MainEvent.OnChangeTextAlignment -> handleDatastoreUpdate( + key = DataStoreConstants.TEXT_ALIGNMENT, + value = event.value, + updateState = { + it.copy(textAlignment = toTextAlignment()) + } + ) - is MainEvent.OnChangeLetterSpacing -> handleDatastoreUpdate( - key = DataStoreConstants.LETTER_SPACING, - value = event.value, - updateState = { - it.copy(letterSpacing = this) - } - ) + is MainEvent.OnChangeDoublePressExit -> handleDatastoreUpdate( + key = DataStoreConstants.DOUBLE_PRESS_EXIT, + value = event.value, + updateState = { + it.copy(doublePressExit = this) + } + ) - is MainEvent.OnChangeAbsoluteDark -> handleDatastoreUpdate( - key = DataStoreConstants.ABSOLUTE_DARK, - value = event.value, - updateState = { - it.copy(absoluteDark = this) - } - ) + is MainEvent.OnChangeLetterSpacing -> handleDatastoreUpdate( + key = DataStoreConstants.LETTER_SPACING, + value = event.value, + updateState = { + it.copy(letterSpacing = this) + } + ) - is MainEvent.OnChangeCutoutPadding -> handleDatastoreUpdate( - key = DataStoreConstants.CUTOUT_PADDING, - value = event.value, - updateState = { - it.copy(cutoutPadding = this) - } - ) + is MainEvent.OnChangeAbsoluteDark -> handleDatastoreUpdate( + key = DataStoreConstants.ABSOLUTE_DARK, + value = event.value, + updateState = { + it.copy(absoluteDark = this) + } + ) - is MainEvent.OnChangeFullscreen -> handleDatastoreUpdate( - key = DataStoreConstants.FULLSCREEN, - value = event.value, - updateState = { - it.copy(fullscreen = this) - } - ) + is MainEvent.OnChangeCutoutPadding -> handleDatastoreUpdate( + key = DataStoreConstants.CUTOUT_PADDING, + value = event.value, + updateState = { + it.copy(cutoutPadding = this) + } + ) - is MainEvent.OnChangeKeepScreenOn -> handleDatastoreUpdate( - key = DataStoreConstants.KEEP_SCREEN_ON, - value = event.value, - updateState = { - it.copy(keepScreenOn = this) - } - ) + is MainEvent.OnChangeFullscreen -> handleDatastoreUpdate( + key = DataStoreConstants.FULLSCREEN, + value = event.value, + updateState = { + it.copy(fullscreen = this) + } + ) - is MainEvent.OnChangeVerticalPadding -> handleDatastoreUpdate( - key = DataStoreConstants.VERTICAL_PADDING, - value = event.value, - updateState = { - it.copy(verticalPadding = this) - } - ) + is MainEvent.OnChangeKeepScreenOn -> handleDatastoreUpdate( + key = DataStoreConstants.KEEP_SCREEN_ON, + value = event.value, + updateState = { + it.copy(keepScreenOn = this) + } + ) - is MainEvent.OnChangeHideBarsOnFastScroll -> handleDatastoreUpdate( - key = DataStoreConstants.HIDE_BARS_ON_FAST_SCROLL, - value = event.value, - updateState = { - it.copy(hideBarsOnFastScroll = this) - } - ) + is MainEvent.OnChangeVerticalPadding -> handleDatastoreUpdate( + key = DataStoreConstants.VERTICAL_PADDING, + value = event.value, + updateState = { + it.copy(verticalPadding = this) + } + ) - is MainEvent.OnChangePerceptionExpander -> handleDatastoreUpdate( - key = DataStoreConstants.PERCEPTION_EXPANDER, - value = event.value, - updateState = { - it.copy(perceptionExpander = this) - } - ) + is MainEvent.OnChangeHideBarsOnFastScroll -> handleDatastoreUpdate( + key = DataStoreConstants.HIDE_BARS_ON_FAST_SCROLL, + value = event.value, + updateState = { + it.copy(hideBarsOnFastScroll = this) + } + ) - is MainEvent.OnChangePerceptionExpanderPadding -> handleDatastoreUpdate( - key = DataStoreConstants.PERCEPTION_EXPANDER_PADDING, - value = event.value, - updateState = { - it.copy(perceptionExpanderPadding = this) - } - ) + is MainEvent.OnChangePerceptionExpander -> handleDatastoreUpdate( + key = DataStoreConstants.PERCEPTION_EXPANDER, + value = event.value, + updateState = { + it.copy(perceptionExpander = this) + } + ) - is MainEvent.OnChangePerceptionExpanderThickness -> handleDatastoreUpdate( - key = DataStoreConstants.PERCEPTION_EXPANDER_THICKNESS, - value = event.value, - updateState = { - it.copy(perceptionExpanderThickness = this) - } - ) + is MainEvent.OnChangePerceptionExpanderPadding -> handleDatastoreUpdate( + key = DataStoreConstants.PERCEPTION_EXPANDER_PADDING, + value = event.value, + updateState = { + it.copy(perceptionExpanderPadding = this) + } + ) - is MainEvent.OnChangeCheckForTextUpdate -> handleDatastoreUpdate( - key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE, - value = event.value, - updateState = { - it.copy(checkForTextUpdate = this) - } - ) + is MainEvent.OnChangePerceptionExpanderThickness -> handleDatastoreUpdate( + key = DataStoreConstants.PERCEPTION_EXPANDER_THICKNESS, + value = event.value, + updateState = { + it.copy(perceptionExpanderThickness = this) + } + ) - is MainEvent.OnChangeCheckForTextUpdateToast -> handleDatastoreUpdate( - key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE_TOAST, - value = event.value, - updateState = { - it.copy(checkForTextUpdateToast = this) - } - ) + is MainEvent.OnChangeCheckForTextUpdate -> handleDatastoreUpdate( + key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE, + value = event.value, + updateState = { + it.copy(checkForTextUpdate = this) + } + ) - is MainEvent.OnChangeScreenOrientation -> handleDatastoreUpdate( - key = DataStoreConstants.SCREEN_ORIENTATION, - value = event.value, - updateState = { - it.copy(screenOrientation = toReaderScreenOrientation()) - } - ) - } + is MainEvent.OnChangeCheckForTextUpdateToast -> handleDatastoreUpdate( + key = DataStoreConstants.CHECK_FOR_TEXT_UPDATE_TOAST, + value = event.value, + updateState = { + it.copy(checkForTextUpdateToast = this) + } + ) + + is MainEvent.OnChangeScreenOrientation -> handleDatastoreUpdate( + key = DataStoreConstants.SCREEN_ORIENTATION, + value = event.value, + updateState = { + it.copy(screenOrientation = toReaderScreenOrientation()) + } + ) } } - fun init( - libraryViewModel: LibraryViewModel, - settingsViewModel: SettingsViewModel, - ) { + private fun init(event: MainEvent.OnInit) { viewModelScope.launch(Dispatchers.Main) { val settings = getAllSettings.execute() @@ -391,8 +394,8 @@ class MainViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { combine( - libraryViewModel.isReady, - settingsViewModel.isReady + event.libraryViewModelReady, + event.settingsViewModelReady ) { (libraryViewModelReady, settingsViewModelReady) -> libraryViewModelReady && settingsViewModelReady }.collectLatest { ready -> @@ -421,19 +424,21 @@ class MainViewModel @Inject constructor( } } - private suspend fun handleLanguageUpdate(value: String) { - withContext(Dispatchers.Main) { - changeLanguage.execute(value) + private fun handleLanguageUpdate(event: MainEvent.OnChangeLanguage) { + viewModelScope.launch(Dispatchers.Main) { + changeLanguage.execute(event.value) updateStateWithSavedHandle { - it.copy(language = value) + it.copy(language = event.value) } } } - private suspend fun handleBrowseIncludedFilterItemUpdate(value: String) { + private fun handleBrowseIncludedFilterItemUpdate( + event: MainEvent.OnChangeBrowseIncludedFilterItem + ) { val set = _state.value.browseIncludedFilterItems.toMutableSet() - if (!set.add(value)) { - set.remove(value) + if (!set.add(event.value)) { + set.remove(event.value) } handleDatastoreUpdate( key = DataStoreConstants.BROWSE_INCLUDED_FILTER_ITEMS, @@ -444,6 +449,22 @@ class MainViewModel @Inject constructor( ) } + /** + * Handles and updates Datastore. + */ + private fun handleDatastoreUpdate( + key: Preferences.Key, + value: V, + updateState: V.(MainState) -> MainState + ) { + viewModelScope.launch(Dispatchers.IO) { + setDatastore.execute(key = key, value = value) + updateStateWithSavedHandle { + value.updateState(it) + } + } + } + /** * Updates [MainState] along with [SavedStateHandle]. */ @@ -455,20 +476,4 @@ class MainViewModel @Inject constructor( function(it) } } - - /** - * Handles and updates Datastore. - */ - private suspend fun handleDatastoreUpdate( - key: Preferences.Key, - value: V, - updateState: V.(MainState) -> MainState - ) { - withContext(Dispatchers.IO) { - setDatastore.execute(key = key, value = value) - updateStateWithSavedHandle { - value.updateState(it) - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt index 2415fa09..63988693 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt @@ -30,7 +30,6 @@ import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn import ua.acclorite.book_story.presentation.core.components.GoBackButton -import ua.acclorite.book_story.presentation.core.components.LocalAboutViewModel import ua.acclorite.book_story.presentation.core.components.collapsibleUntilExitScrollBehaviorWithLazyListState import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator @@ -40,6 +39,7 @@ import ua.acclorite.book_story.presentation.screens.about.components.AboutItem import ua.acclorite.book_story.presentation.screens.about.components.AboutUpdateDialog import ua.acclorite.book_story.presentation.screens.about.components.badges.AboutBadges import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent +import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel @Composable fun AboutScreenRoot() { @@ -49,8 +49,8 @@ fun AboutScreenRoot() { @OptIn(ExperimentalMaterial3Api::class) @Composable private fun AboutScreen() { - val state = LocalAboutViewModel.current.state - val onEvent = LocalAboutViewModel.current.onEvent + val state = AboutViewModel.getState() + val onEvent = AboutViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutUpdateDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutUpdateDialog.kt index 43486442..69cab131 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutUpdateDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutUpdateDialog.kt @@ -7,19 +7,19 @@ import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalAboutViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent +import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel /** * Update dialog. If there is app update transfers to the download page. */ @Composable fun AboutUpdateDialog() { - val state = LocalAboutViewModel.current.state - val onEvent = LocalAboutViewModel.current.onEvent + val state = AboutViewModel.getState() + val onEvent = AboutViewModel.getEvent() val context = LocalContext.current val update = remember(state.value.showUpdateDialog) { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/badges/AboutBadges.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/badges/AboutBadges.kt index d8e92796..c030c56e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/badges/AboutBadges.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/badges/AboutBadges.kt @@ -13,10 +13,10 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalAboutViewModel import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent +import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel /** * About Badges. @@ -26,7 +26,7 @@ import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent */ @Composable fun AboutBadges(verticalPadding: Dp = 18.dp) { - val onEvent = LocalAboutViewModel.current.onEvent + val onEvent = AboutViewModel.getEvent() val context = LocalContext.current Box( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt index 16445d44..d15c260c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt @@ -3,6 +3,7 @@ package ua.acclorite.book_story.presentation.screens.about.data import android.content.Intent import android.net.Uri import androidx.activity.ComponentActivity +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -11,14 +12,22 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.use_case.remote.CheckForUpdates -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.core.util.launchActivity import javax.inject.Inject @HiltViewModel class AboutViewModel @Inject constructor( private val checkForUpdates: CheckForUpdates, -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(AboutState()) override val state = _state.asStateFlow() @@ -90,12 +99,4 @@ class AboutViewModel @Inject constructor( } } } -} - - - - - - - - +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/credits/CreditsScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/credits/CreditsScreen.kt index 0ade3bf4..e95bfa0c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/credits/CreditsScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/credits/CreditsScreen.kt @@ -20,12 +20,12 @@ import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn import ua.acclorite.book_story.presentation.core.components.GoBackButton -import ua.acclorite.book_story.presentation.core.components.LocalAboutViewModel import ua.acclorite.book_story.presentation.core.components.collapsibleUntilExitScrollBehaviorWithLazyListState import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent +import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel import ua.acclorite.book_story.presentation.screens.about.nested.credits.components.CreditItem @Composable @@ -36,7 +36,7 @@ fun CreditsScreenRoot() { @OptIn(ExperimentalMaterial3Api::class) @Composable private fun CreditsScreen() { - val onEvent = LocalAboutViewModel.current.onEvent + val onEvent = AboutViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/LicenseInfoScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/LicenseInfoScreen.kt index 6e5ac06d..93ef7e41 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/LicenseInfoScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/LicenseInfoScreen.kt @@ -36,26 +36,32 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomIconButton import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn import ua.acclorite.book_story.presentation.core.components.GoBackButton -import ua.acclorite.book_story.presentation.core.components.LocalLicenseInfoViewModel import ua.acclorite.book_story.presentation.core.components.collapsibleUntilExitScrollBehaviorWithLazyListState import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.about.nested.license_info.data.LicenseInfoEvent +import ua.acclorite.book_story.presentation.screens.about.nested.license_info.data.LicenseInfoViewModel import ua.acclorite.book_story.presentation.ui.DefaultTransition import ua.acclorite.book_story.presentation.ui.SlidingTransition @Composable fun LicenseInfoScreenRoot(screen: Screen.About.LicenseInfo) { - val viewModel = LocalLicenseInfoViewModel.current.viewModel + val onEvent = LicenseInfoViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current LaunchedEffect(Unit) { - viewModel.init( - screen = screen, - onNavigate = onNavigate, - context = context + onEvent( + LicenseInfoEvent.OnInit( + screen = screen, + navigateBack = { + onNavigate { + navigateBack() + } + }, + context = context + ) ) } @@ -65,8 +71,8 @@ fun LicenseInfoScreenRoot(screen: Screen.About.LicenseInfo) { @OptIn(ExperimentalMaterial3Api::class) @Composable private fun LicenseInfoScreen() { - val state = LocalLicenseInfoViewModel.current.state - val onEvent = LocalLicenseInfoViewModel.current.onEvent + val state = LicenseInfoViewModel.getState() + val onEvent = LicenseInfoViewModel.getEvent() val context = LocalContext.current val onNavigate = LocalNavigator.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoEvent.kt index f6267366..0ffd354d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoEvent.kt @@ -2,9 +2,16 @@ package ua.acclorite.book_story.presentation.screens.about.nested.license_info.d import android.content.Context import androidx.compose.runtime.Immutable +import ua.acclorite.book_story.presentation.core.navigation.Screen @Immutable sealed class LicenseInfoEvent { + data class OnInit( + val screen: Screen.About.LicenseInfo, + val navigateBack: () -> Unit, + val context: Context + ) : LicenseInfoEvent() + data class OnOpenLicensePage( val page: String, val context: Context, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt index 7d1c629b..bfefc895 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt @@ -1,9 +1,9 @@ package ua.acclorite.book_story.presentation.screens.about.nested.license_info.data -import android.content.Context import android.content.Intent import android.net.Uri import androidx.activity.ComponentActivity +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.util.withContext @@ -13,51 +13,55 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import ua.acclorite.book_story.domain.util.OnNavigate -import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.core.util.launchActivity import javax.inject.Inject @HiltViewModel class LicenseInfoViewModel @Inject constructor( -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(LicenseInfoState()) override val state = _state.asStateFlow() override fun onEvent(event: LicenseInfoEvent) { when (event) { - is LicenseInfoEvent.OnOpenLicensePage -> { - viewModelScope.launch { - val intent = Intent( - Intent.ACTION_VIEW, - Uri.parse(event.page) - ) + is LicenseInfoEvent.OnInit -> init(event) - intent.launchActivity(event.context as ComponentActivity) { - event.noAppsFound() - } + is LicenseInfoEvent.OnOpenLicensePage -> { + val intent = Intent( + Intent.ACTION_VIEW, + Uri.parse(event.page) + ) + + intent.launchActivity(event.context as ComponentActivity) { + event.noAppsFound() } } } } - fun init(screen: Screen.About.LicenseInfo, onNavigate: OnNavigate, context: Context) { + private fun init(event: LicenseInfoEvent.OnInit) { viewModelScope.launch(Dispatchers.IO) { _state.update { it.copy(license = null) } - val license = Libs.Builder().withContext(context).build().libraries.find { - it.uniqueId == screen.licenseId + val license = Libs.Builder().withContext(event.context).build().libraries.find { + it.uniqueId == event.screen.licenseId } if (license == null) { - onNavigate { - navigateBack() - } + event.navigateBack() return@launch } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/LicensesScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/LicensesScreen.kt index 15fffae2..f2f5a9ff 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/LicensesScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/LicensesScreen.kt @@ -28,19 +28,20 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn import ua.acclorite.book_story.presentation.core.components.GoBackButton -import ua.acclorite.book_story.presentation.core.components.LocalLicensesViewModel import ua.acclorite.book_story.presentation.core.components.collapsibleUntilExitScrollBehaviorWithLazyListState import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.screens.about.nested.licenses.components.LicenseItem +import ua.acclorite.book_story.presentation.screens.about.nested.licenses.data.LicensesEvent +import ua.acclorite.book_story.presentation.screens.about.nested.licenses.data.LicensesViewModel @Composable fun LicensesScreenRoot() { - val viewModel = LocalLicensesViewModel.current.viewModel + val onEvent = LicensesViewModel.getEvent() val context = LocalContext.current LaunchedEffect(Unit) { - viewModel.init(context) + onEvent(LicensesEvent.OnInit(context = context)) } LicensesScreen() @@ -49,7 +50,7 @@ fun LicensesScreenRoot() { @OptIn(ExperimentalMaterial3Api::class) @Composable private fun LicensesScreen() { - val state = LocalLicensesViewModel.current.state + val state = LicensesViewModel.getState() val onNavigate = LocalNavigator.current val scrollState = TopAppBarDefaults.collapsibleUntilExitScrollBehaviorWithLazyListState( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesEvent.kt index 51fb80e5..0d71db92 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesEvent.kt @@ -1,6 +1,11 @@ package ua.acclorite.book_story.presentation.screens.about.nested.licenses.data +import android.content.Context import androidx.compose.runtime.Immutable @Immutable -sealed class LicensesEvent \ No newline at end of file +sealed class LicensesEvent { + data class OnInit( + val context: Context + ) : LicensesEvent() +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt index 23283eac..3a3b770b 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt @@ -1,6 +1,6 @@ package ua.acclorite.book_story.presentation.screens.about.nested.licenses.data -import android.content.Context +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import com.mikepenz.aboutlibraries.Libs import com.mikepenz.aboutlibraries.util.withJson @@ -11,20 +11,34 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import javax.inject.Inject @HiltViewModel class LicensesViewModel @Inject constructor( -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(LicensesState()) override val state = _state.asStateFlow() - override fun onEvent(event: LicensesEvent) {} + override fun onEvent(event: LicensesEvent) { + viewModelScope.launch(Dispatchers.Main) { + when (event) { + is LicensesEvent.OnInit -> init(event) + } + } + } - fun init(context: Context) { + private fun init(event: LicensesEvent.OnInit) { viewModelScope.launch(Dispatchers.IO) { if (_state.value.licenses.isNotEmpty()) { return@launch @@ -32,7 +46,7 @@ class LicensesViewModel @Inject constructor( val licenses = Libs .Builder() - .withJson(context, R.raw.aboutlibraries) + .withJson(event.context, R.raw.aboutlibraries) .build() .libraries .toList() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/BookInfoScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/BookInfoScreen.kt index e3fbbbae..d335bdb2 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/BookInfoScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/BookInfoScreen.kt @@ -46,7 +46,6 @@ import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomSnackbar -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.screens.book_info.components.BookInfoBackground @@ -61,21 +60,24 @@ import ua.acclorite.book_story.presentation.screens.book_info.components.dialog. import ua.acclorite.book_story.presentation.screens.book_info.components.dialog.BookInfoDeleteDialog import ua.acclorite.book_story.presentation.screens.book_info.components.dialog.BookInfoMoveDialog import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel @Composable fun BookInfoScreenRoot(screen: Screen.BookInfo) { - val viewModel = LocalBookInfoViewModel.current.viewModel + val onEvent = BookInfoViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current val snackbarState = remember { SnackbarHostState() } LaunchedEffect(Unit) { - viewModel.init( - screen = screen, - snackbarState = snackbarState, - onNavigate = onNavigate, - context = context + onEvent( + BookInfoEvent.OnInit( + screen = screen, + snackbarState = snackbarState, + onNavigate = onNavigate, + context = context + ) ) } @@ -85,7 +87,7 @@ fun BookInfoScreenRoot(screen: Screen.BookInfo) { DisposableEffect(Unit) { onDispose { - viewModel.clearViewModel() + onEvent(BookInfoEvent.OnClearViewModel) } } } @@ -94,8 +96,8 @@ fun BookInfoScreenRoot(screen: Screen.BookInfo) { @Composable private fun BookInfoScreen(snackbarState: SnackbarHostState) { val context = LocalContext.current - val state = LocalBookInfoViewModel.current.state - val onEvent = LocalBookInfoViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() val onNavigate = LocalNavigator.current val listState = rememberLazyListState() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoDescriptionSection.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoDescriptionSection.kt index 459596c2..24d7588b 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoDescriptionSection.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoDescriptionSection.kt @@ -22,17 +22,17 @@ import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel /** * Description section. */ @Composable fun BookInfoDescriptionSection() { - val state = LocalBookInfoViewModel.current.state - val onEvent = LocalBookInfoViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() val descriptionFocusRequester = remember { FocusRequester() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoInfoSection.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoInfoSection.kt index 91ff63af..d23c131d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoInfoSection.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoInfoSection.kt @@ -36,17 +36,17 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomCoverImage -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel /** * BookInfo's Info section. */ @Composable fun BookInfoInfoSection() { - val state = LocalBookInfoViewModel.current.state - val onEvent = LocalBookInfoViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() val titleFocusRequester = remember { FocusRequester() } val authorFocusRequester = remember { FocusRequester() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoMoreBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoMoreBottomSheet.kt index 9ccaccb1..c143c3cf 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoMoreBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoMoreBottomSheet.kt @@ -11,10 +11,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.util.Position -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheet import ua.acclorite.book_story.presentation.core.navigation.NavigationItem import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel /** * Book Info More Bottom Sheet. @@ -24,7 +24,7 @@ import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent */ @Composable fun BookInfoMoreBottomSheet(snackbarState: SnackbarHostState) { - val onEvent = LocalBookInfoViewModel.current.onEvent + val onEvent = BookInfoViewModel.getEvent() CustomBottomSheet( modifier = Modifier.fillMaxWidth(), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoStatisticSection.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoStatisticSection.kt index 39a59177..00f1e281 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoStatisticSection.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoStatisticSection.kt @@ -18,15 +18,15 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel import ua.acclorite.book_story.presentation.core.util.calculateProgress +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel /** * Statistic section. */ @Composable fun BookInfoStatisticSection() { - val state = LocalBookInfoViewModel.current.state + val state = BookInfoViewModel.getState() val progress by remember { derivedStateOf { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoTopBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoTopBar.kt index 5a4da233..d404d48f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoTopBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/BookInfoTopBar.kt @@ -24,14 +24,14 @@ import ua.acclorite.book_story.presentation.core.components.AnimatedTopAppBarDat import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomIconButton import ua.acclorite.book_story.presentation.core.components.GoBackButton -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.NavigationIconButton import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.ui.DefaultTransition import ua.acclorite.book_story.presentation.ui.Transitions @@ -47,10 +47,10 @@ fun BookInfoTopBar( listState: LazyListState, snackbarState: SnackbarHostState ) { - val state = LocalBookInfoViewModel.current.state - val onEvent = LocalBookInfoViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/change_cover_bottom_sheet/BookInfoChangeCoverBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/change_cover_bottom_sheet/BookInfoChangeCoverBottomSheet.kt index 28f82783..d3a50c9c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/change_cover_bottom_sheet/BookInfoChangeCoverBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/change_cover_bottom_sheet/BookInfoChangeCoverBottomSheet.kt @@ -18,24 +18,24 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheet import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Change cover bottom sheet. Lets user select photo from the gallery and replaces old one. */ @Composable fun BookInfoChangeCoverBottomSheet() { - val state = LocalBookInfoViewModel.current.state - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent - val onEvent = LocalBookInfoViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val context = LocalContext.current val photoPicker = rememberLauncherForActivityResult( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/details_bottom_sheet/BookInfoDetailsBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/details_bottom_sheet/BookInfoDetailsBottomSheet.kt index fa7ae712..2f96396f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/details_bottom_sheet/BookInfoDetailsBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/details_bottom_sheet/BookInfoDetailsBottomSheet.kt @@ -10,10 +10,10 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheet import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -24,8 +24,8 @@ import java.util.Locale */ @Composable fun BookInfoDetailsBottomSheet() { - val state = LocalBookInfoViewModel.current.state - val onEvent = LocalBookInfoViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() val context = LocalContext.current val pattern = remember { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoConfirmUpdateDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoConfirmUpdateDialog.kt index c5879d2c..a074bcdd 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoConfirmUpdateDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoConfirmUpdateDialog.kt @@ -7,13 +7,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Confirm update dialog. @@ -23,9 +23,9 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent */ @Composable fun BookInfoConfirmUpdateDialog(snackbarHostState: SnackbarHostState) { - val onEvent = LocalBookInfoViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val onEvent = BookInfoViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val context = LocalContext.current CustomDialogWithContent( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoDeleteDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoDeleteDialog.kt index 77f04aea..8b0f042e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoDeleteDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoDeleteDialog.kt @@ -6,27 +6,27 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Delete dialog. Deletes current book. */ @Composable fun BookInfoDeleteDialog() { - val onEvent = LocalBookInfoViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent - val onBrowseEvent = LocalBrowseViewModel.current.onEvent + val onEvent = BookInfoViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() + val onBrowseEvent = BrowseViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoMoveDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoMoveDialog.kt index 28b39480..73aea6bd 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoMoveDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/components/dialog/BookInfoMoveDialog.kt @@ -10,16 +10,16 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.Category -import ua.acclorite.book_story.presentation.core.components.LocalBookInfoViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithLazyColumn import ua.acclorite.book_story.presentation.core.components.custom_dialog.SelectableDialogItem import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoEvent +import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Move dialog. @@ -27,10 +27,10 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent */ @Composable fun BookInfoMoveDialog() { - val state = LocalBookInfoViewModel.current.state - val onEvent = LocalBookInfoViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = BookInfoViewModel.getState() + val onEvent = BookInfoViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoEvent.kt index df5ba26d..1f97739e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoEvent.kt @@ -10,9 +10,19 @@ import ua.acclorite.book_story.domain.model.Category import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.domain.util.OnNavigate import ua.acclorite.book_story.domain.util.UIText +import ua.acclorite.book_story.presentation.core.navigation.Screen @Immutable sealed class BookInfoEvent { + data class OnInit( + val screen: Screen.BookInfo, + val snackbarState: SnackbarHostState, + val context: Context, + val onNavigate: OnNavigate + ) : BookInfoEvent() + + data object OnClearViewModel : BookInfoEvent() + data object OnShowHideChangeCoverBottomSheet : BookInfoEvent() data object OnShowHideDetailsBottomSheet : BookInfoEvent() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoViewModel.kt index eea70b22..07349229 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/book_info/data/BookInfoViewModel.kt @@ -4,12 +4,11 @@ package ua.acclorite.book_story.presentation.screens.book_info.data import android.content.ClipData import android.content.ClipboardManager -import android.content.Context import android.content.Context.CLIPBOARD_SERVICE import android.graphics.BitmapFactory import android.os.Build -import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -34,11 +33,10 @@ import ua.acclorite.book_story.domain.use_case.book.UpdateBook import ua.acclorite.book_story.domain.use_case.book.UpdateBookWithText import ua.acclorite.book_story.domain.use_case.book.UpdateCoverImageOfBook import ua.acclorite.book_story.domain.use_case.history.InsertHistory -import ua.acclorite.book_story.domain.util.OnNavigate import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.domain.util.UIText import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import java.util.Date import javax.inject.Inject import kotlin.math.roundToInt @@ -55,7 +53,15 @@ class BookInfoViewModel @Inject constructor( private val canResetCover: CanResetCover, private val resetCoverImage: ResetCoverImage, private val checkForTextUpdate: CheckForTextUpdate, -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(BookInfoState()) override val state = _state.asStateFlow() @@ -68,6 +74,10 @@ class BookInfoViewModel @Inject constructor( override fun onEvent(event: BookInfoEvent) { viewModelScope.launch(eventJob + Dispatchers.Main) { when (event) { + is BookInfoEvent.OnInit -> init(event) + + is BookInfoEvent.OnClearViewModel -> clearViewModel() + is BookInfoEvent.OnShowHideChangeCoverBottomSheet -> { _state.update { it.copy( @@ -740,17 +750,12 @@ class BookInfoViewModel @Inject constructor( } } - fun init( - screen: Screen.BookInfo, - snackbarState: SnackbarHostState, - context: Context, - onNavigate: OnNavigate - ) { + private fun init(event: BookInfoEvent.OnInit) { viewModelScope.launch(Dispatchers.IO) { - val book = getBookById.execute(screen.bookId) + val book = getBookById.execute(event.screen.bookId) if (book == null) { - onNavigate { + event.onNavigate { navigateBack() } return@launch @@ -763,17 +768,17 @@ class BookInfoViewModel @Inject constructor( } clear() - if (screen.startUpdate) { + if (event.screen.startUpdate) { onEvent( BookInfoEvent.OnCheckForTextUpdate( - snackbarState = snackbarState, - context = context + snackbarState = event.snackbarState, + context = event.context ) ) - onNavigate { + event.onNavigate { putScreen( Screen.BookInfo( - screen.bookId, + event.screen.bookId, false ) ) @@ -783,13 +788,7 @@ class BookInfoViewModel @Inject constructor( } } - private suspend fun clear() { - eventJob.cancel() - eventJob.join() - eventJob = SupervisorJob() - } - - fun clearViewModel() { + private fun clearViewModel() { viewModelScope.launch(Dispatchers.Main) { _state.update { BookInfoState() @@ -800,4 +799,10 @@ class BookInfoViewModel @Inject constructor( eventJob = SupervisorJob() } } + + private suspend fun clear() { + eventJob.cancel() + eventJob.join() + eventJob = SupervisorJob() + } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/BrowseScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/BrowseScreen.kt index 8aa9516e..7d6580fc 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/BrowseScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/BrowseScreen.kt @@ -24,11 +24,10 @@ import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.rememberPermissionState import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.SelectableFile -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.core.util.showToast +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.browse.components.BrowseEmptyPlaceholder import ua.acclorite.book_story.presentation.screens.browse.components.BrowseStoragePermissionDialog import ua.acclorite.book_story.presentation.screens.browse.components.adding_dialog.BrowseAddingDialog @@ -36,16 +35,16 @@ import ua.acclorite.book_story.presentation.screens.browse.components.filter_bot import ua.acclorite.book_story.presentation.screens.browse.components.layout.BrowseLayout import ua.acclorite.book_story.presentation.screens.browse.components.top_bar.BrowseTopBar import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure import ua.acclorite.book_story.presentation.ui.DefaultTransition @OptIn(ExperimentalPermissionsApi::class) @Composable fun BrowseScreenRoot() { - val state = LocalBrowseViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent - val viewModel = LocalBrowseViewModel.current.viewModel + val state = BrowseViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = BrowseViewModel.getEvent() val permissionState = rememberPermissionState( permission = Manifest.permission.READ_EXTERNAL_STORAGE @@ -55,7 +54,10 @@ fun BrowseScreenRoot() { state.value.selectedDirectory ) { derivedStateOf { - viewModel.filterList(mainState.value) + BrowseViewModel.filterList( + browseState = state.value, + mainState = mainState.value + ) } } @@ -72,7 +74,7 @@ fun BrowseScreenRoot() { DisposableEffect(Unit) { onDispose { - viewModel.clearViewModel() + onEvent(BrowseEvent.OnClearViewModel) } } } @@ -86,9 +88,9 @@ private fun BrowseScreen( permissionState: PermissionState, filteredFiles: List ) { - val state = LocalBrowseViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent + val state = BrowseViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = BrowseViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseEmptyPlaceholder.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseEmptyPlaceholder.kt index dc9b4a14..88a0f2cf 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseEmptyPlaceholder.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseEmptyPlaceholder.kt @@ -10,12 +10,12 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel import ua.acclorite.book_story.presentation.core.components.is_messages.IsEmpty import ua.acclorite.book_story.presentation.core.components.is_messages.IsError import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.ui.Transitions /** @@ -31,8 +31,8 @@ fun BoxScope.BrowseEmptyPlaceholder( isFilesEmpty: Boolean, storagePermissionState: PermissionState ) { - val state = LocalBrowseViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent + val state = BrowseViewModel.getState() + val onEvent = BrowseViewModel.getEvent() val onNavigate = LocalNavigator.current CustomAnimatedVisibility( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseStoragePermissionDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseStoragePermissionDialog.kt index 89c949df..cb7a63af 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseStoragePermissionDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/BrowseStoragePermissionDialog.kt @@ -9,9 +9,9 @@ import androidx.compose.ui.res.stringResource import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel /** * Storage permission dialog. @@ -24,7 +24,7 @@ fun BrowseStoragePermissionDialog( permissionState: PermissionState ) { val activity = LocalContext.current as ComponentActivity - val onEvent = LocalBrowseViewModel.current.onEvent + val onEvent = BrowseViewModel.getEvent() CustomDialogWithContent( title = stringResource(id = R.string.storage_permission), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/adding_dialog/BrowseAddingDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/adding_dialog/BrowseAddingDialog.kt index 829f7cb9..4a4e055b 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/adding_dialog/BrowseAddingDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/adding_dialog/BrowseAddingDialog.kt @@ -18,13 +18,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.NullableBook -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithLazyColumn import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import java.util.UUID /** @@ -34,9 +34,9 @@ import java.util.UUID @Composable fun BrowseAddingDialog() { val context = LocalContext.current - val state = LocalBrowseViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent + val state = BrowseViewModel.getState() + val onEvent = BrowseViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() val onNavigate = LocalNavigator.current CustomDialogWithLazyColumn( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/filter_bottom_sheet/BrowseFilterBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/filter_bottom_sheet/BrowseFilterBottomSheet.kt index 7b1a3df7..f13af609 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/filter_bottom_sheet/BrowseFilterBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/filter_bottom_sheet/BrowseFilterBottomSheet.kt @@ -10,9 +10,9 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheet import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.components.subcategories.BrowseFilterSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.browse.components.subcategories.BrowseGeneralSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.browse.components.subcategories.BrowseSortSubcategory @@ -23,8 +23,8 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.browse.compo */ @Composable fun BrowseFilterBottomSheet() { - val state = LocalBrowseViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent + val state = BrowseViewModel.getState() + val onEvent = BrowseViewModel.getEvent() val pagerState = rememberPagerState(state.value.currentPage) { 3 } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/BrowseLayout.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/BrowseLayout.kt index 3d1d305a..6e5af4bd 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/BrowseLayout.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/BrowseLayout.kt @@ -2,7 +2,7 @@ package ua.acclorite.book_story.presentation.screens.browse.components.layout import androidx.compose.runtime.Composable import ua.acclorite.book_story.domain.model.SelectableFile -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.browse.components.layout.grid.BrowseGridLayout import ua.acclorite.book_story.presentation.screens.browse.components.layout.list.BrowseListLayout import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout @@ -23,7 +23,7 @@ fun BrowseLayout( onFavoriteItemClick: (SelectableFile) -> Unit, onItemClick: (SelectableFile) -> Unit ) { - val mainState = LocalMainViewModel.current.state + val mainState = MainViewModel.getState() when (mainState.value.browseLayout) { BrowseLayout.LIST -> { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/grid/BrowseGridLayout.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/grid/BrowseGridLayout.kt index a21d8d0c..07528488 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/grid/BrowseGridLayout.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/grid/BrowseGridLayout.kt @@ -11,9 +11,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import ua.acclorite.book_story.domain.model.SelectableFile -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel import ua.acclorite.book_story.presentation.core.components.header import ua.acclorite.book_story.presentation.screens.browse.components.layout.BrowseItem +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout @Composable @@ -25,7 +25,7 @@ fun BrowseGridLayout( onFavoriteItemClick: (SelectableFile) -> Unit, onItemClick: (SelectableFile) -> Unit, ) { - val state = LocalBrowseViewModel.current.state + val state = BrowseViewModel.getState() LazyVerticalGrid( columns = if (autoGridSize) GridCells.Adaptive(170.dp) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/list/BrowseListLayout.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/list/BrowseListLayout.kt index fd9983b2..41d4b615 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/list/BrowseListLayout.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/layout/list/BrowseListLayout.kt @@ -9,8 +9,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import ua.acclorite.book_story.domain.model.SelectableFile -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel import ua.acclorite.book_story.presentation.screens.browse.components.layout.BrowseItem +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout @Composable @@ -20,7 +20,7 @@ fun BrowseListLayout( onFavoriteItemClick: (SelectableFile) -> Unit, onItemClick: (SelectableFile) -> Unit, ) { - val state = LocalBrowseViewModel.current.state + val state = BrowseViewModel.getState() LazyColumn( state = state.value.listState, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBar.kt index aeee6597..dbad4435 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBar.kt @@ -29,10 +29,10 @@ import ua.acclorite.book_story.presentation.core.components.AnimatedTopAppBar import ua.acclorite.book_story.presentation.core.components.AnimatedTopAppBarData import ua.acclorite.book_story.presentation.core.components.CustomIconButton import ua.acclorite.book_story.presentation.core.components.CustomSearchTextField -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.navigation.NavigationIconButton +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout @@ -44,9 +44,9 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data. @OptIn(ExperimentalMaterial3Api::class) @Composable fun BrowseTopBar(filteredFiles: List) { - val state = LocalBrowseViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent + val state = BrowseViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = BrowseViewModel.getEvent() val focusRequester = remember { FocusRequester() } val selectedDirectoryName = remember { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBarDirectoryPath.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBarDirectoryPath.kt index 8517c5f7..ebfcbe4d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBarDirectoryPath.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/components/top_bar/BrowseTopBarDirectoryPath.kt @@ -27,18 +27,18 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.util.noRippleClickable +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure import java.io.File @Composable fun BrowseTopBarDirectoryPath() { - val state = LocalBrowseViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalBrowseViewModel.current.onEvent + val state = BrowseViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = BrowseViewModel.getEvent() val context = LocalContext.current val rootDirectory = remember { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseEvent.kt index f4055be4..631a438c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseEvent.kt @@ -16,6 +16,8 @@ import java.io.File @Immutable sealed class BrowseEvent { + data object OnClearViewModel : BrowseEvent() + data class OnStoragePermissionRequest( val activity: ComponentActivity, val storagePermissionState: PermissionState diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt index 1262c732..3fbc6e70 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt @@ -9,6 +9,7 @@ import android.os.Environment import android.provider.Settings import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.grid.LazyGridState +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.isGranted @@ -29,7 +30,7 @@ import ua.acclorite.book_story.domain.use_case.favorite_directory.UpdateFavorite import ua.acclorite.book_story.domain.use_case.file_system.GetBookFromFile import ua.acclorite.book_story.domain.use_case.file_system.GetFilesFromDevice import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.core.util.launchActivity import ua.acclorite.book_story.presentation.data.MainState import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure @@ -43,7 +44,115 @@ class BrowseViewModel @Inject constructor( private val getFilesFromDevice: GetFilesFromDevice, private val insertBook: InsertBook, private val updateFavoriteDirectory: UpdateFavoriteDirectory, -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + + fun filterList(browseState: BrowseState, mainState: MainState): List { + fun thenCompareBy( + selector: (T) -> Comparable<*>? + ): Comparator { + return if (mainState.browseSortOrderDescending) { + compareByDescending(selector) + } else { + compareBy(selector) + } + } + + fun List.filterFiles(): List { + if (mainState.browseIncludedFilterItems.isEmpty()) { + return this + } + + return filter { file -> + when (file.isDirectory) { + true -> { + return@filter this.filter { + if (file == it) { + return@filter false + } + + it.fileOrDirectory.path.startsWith(file.fileOrDirectory.path) + }.filterFiles().isNotEmpty() + } + + false -> { + return@filter mainState.browseIncludedFilterItems.any { + file.fileOrDirectory.path.endsWith( + it, ignoreCase = true + ) + } + } + } + } + } + + return browseState.selectableFiles + .filterFiles() + .filter { + if ( + browseState.hasSearched + || mainState.browseFilesStructure == BrowseFilesStructure.ALL_FILES + ) { + return@filter !it.isDirectory + } + + if ( + Environment.getExternalStorageDirectory() == browseState.selectedDirectory + && it.isFavorite + && mainState.browsePinFavoriteDirectories + ) { + return@filter true + } + + it.parentDirectory == browseState.selectedDirectory + } + .sortedWith( + compareByDescending { + when (mainState.browsePinFavoriteDirectories) { + true -> it.isFavorite + false -> true + } + }.then( + compareByDescending { + when (mainState.browseSortOrder != BrowseSortOrder.FILE_TYPE) { + true -> it.isDirectory + false -> true + } + } + ).then( + thenCompareBy { + when (mainState.browseSortOrder) { + BrowseSortOrder.NAME -> { + it.fileOrDirectory.name.lowercase().trim() + } + + BrowseSortOrder.FILE_TYPE -> { + it.isDirectory + } + + BrowseSortOrder.FILE_FORMAT -> { + it.fileOrDirectory.extension + } + + BrowseSortOrder.FILE_SIZE -> { + it.fileOrDirectory.length() + } + + BrowseSortOrder.LAST_MODIFIED -> { + it.fileOrDirectory.lastModified() + } + } + } + ) + ) + } + } private val _state = MutableStateFlow(BrowseState()) override val state = _state.asStateFlow() @@ -69,6 +178,8 @@ class BrowseViewModel @Inject constructor( override fun onEvent(event: BrowseEvent) { when (event) { + is BrowseEvent.OnClearViewModel -> clearViewModel() + is BrowseEvent.OnStoragePermissionRequest -> { val legacyStoragePermission = Build.VERSION.SDK_INT < Build.VERSION_CODES.R @@ -605,104 +716,12 @@ class BrowseViewModel @Inject constructor( } } - fun filterList(mainState: MainState): List { - fun thenCompareBy( - selector: (T) -> Comparable<*>? - ): Comparator { - return if (mainState.browseSortOrderDescending) { - compareByDescending(selector) - } else { - compareBy(selector) + private fun clearViewModel() { + viewModelScope.launch(Dispatchers.Main) { + _state.update { + it.copy(isError = false) } } - - fun List.filterFiles(): List { - if (mainState.browseIncludedFilterItems.isEmpty()) { - return this - } - - return filter { file -> - when (file.isDirectory) { - true -> { - return@filter this.filter { - if (file == it) { - return@filter false - } - - it.fileOrDirectory.path.startsWith(file.fileOrDirectory.path) - }.filterFiles().isNotEmpty() - } - - false -> { - return@filter mainState.browseIncludedFilterItems.any { - file.fileOrDirectory.path.endsWith( - it, ignoreCase = true - ) - } - } - } - } - } - - return _state.value.selectableFiles - .filterFiles() - .filter { - if ( - _state.value.hasSearched - || mainState.browseFilesStructure == BrowseFilesStructure.ALL_FILES - ) { - return@filter !it.isDirectory - } - - if ( - Environment.getExternalStorageDirectory() == _state.value.selectedDirectory - && it.isFavorite - && mainState.browsePinFavoriteDirectories - ) { - return@filter true - } - - it.parentDirectory == _state.value.selectedDirectory - } - .sortedWith( - compareByDescending { - when (mainState.browsePinFavoriteDirectories) { - true -> it.isFavorite - false -> true - } - }.then( - compareByDescending { - when (mainState.browseSortOrder != BrowseSortOrder.FILE_TYPE) { - true -> it.isDirectory - false -> true - } - } - ).then( - thenCompareBy { - when (mainState.browseSortOrder) { - BrowseSortOrder.NAME -> { - it.fileOrDirectory.name.lowercase().trim() - } - - BrowseSortOrder.FILE_TYPE -> { - it.isDirectory - } - - BrowseSortOrder.FILE_FORMAT -> { - it.fileOrDirectory.extension - } - - BrowseSortOrder.FILE_SIZE -> { - it.fileOrDirectory.length() - } - - BrowseSortOrder.LAST_MODIFIED -> { - it.fileOrDirectory.lastModified() - } - } - } - ) - ) } private suspend fun getFilesFromDownloads( @@ -721,12 +740,4 @@ class BrowseViewModel @Inject constructor( } } } - - fun clearViewModel() { - viewModelScope.launch(Dispatchers.Main) { - _state.update { - it.copy(isError = false) - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/HelpScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/HelpScreen.kt index ae1e768e..4473a79b 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/HelpScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/HelpScreen.kt @@ -32,26 +32,31 @@ import ua.acclorite.book_story.domain.util.Position import ua.acclorite.book_story.presentation.core.components.CustomIconButton import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn import ua.acclorite.book_story.presentation.core.components.GoBackButton -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHelpViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalStartViewModel import ua.acclorite.book_story.presentation.core.components.collapsibleUntilExitScrollBehaviorWithLazyListState import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.help.components.HelpItem import ua.acclorite.book_story.presentation.screens.help.components.items.HelpClickMeNoteItem +import ua.acclorite.book_story.presentation.screens.help.data.HelpEvent +import ua.acclorite.book_story.presentation.screens.help.data.HelpViewModel import ua.acclorite.book_story.presentation.screens.start.data.StartEvent +import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel @Composable fun HelpScreenRoot(screen: Screen.Help) { - val viewModel = LocalHelpViewModel.current.viewModel + val onEvent = HelpViewModel.getEvent() LaunchedEffect(Unit) { - viewModel.init(screen = screen) + onEvent( + HelpEvent.OnInit( + screen = screen + ) + ) } HelpScreen() @@ -62,10 +67,10 @@ fun HelpScreenRoot(screen: Screen.Help) { ) @Composable private fun HelpScreen() { - val state = LocalHelpViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent - val onBrowseEvent = LocalBrowseViewModel.current.onEvent - val onStartEvent = LocalStartViewModel.current.onEvent + val state = HelpViewModel.getState() + val onMainEvent = MainViewModel.getEvent() + val onBrowseEvent = BrowseViewModel.getEvent() + val onStartEvent = StartViewModel.getEvent() val onNavigate = LocalNavigator.current val scrollState = TopAppBarDefaults.collapsibleUntilExitScrollBehaviorWithLazyListState() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpEvent.kt index 4c28b37d..286059f6 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpEvent.kt @@ -1,6 +1,11 @@ package ua.acclorite.book_story.presentation.screens.help.data import androidx.compose.runtime.Immutable +import ua.acclorite.book_story.presentation.core.navigation.Screen @Immutable -sealed class HelpEvent \ No newline at end of file +sealed class HelpEvent { + data class OnInit( + val screen: Screen.Help + ) : HelpEvent() +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt index 56aa1f60..e8dd68d7 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt @@ -1,32 +1,40 @@ package ua.acclorite.book_story.presentation.screens.help.data -import androidx.lifecycle.viewModelScope +import androidx.compose.runtime.Composable import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import javax.inject.Inject @HiltViewModel class HelpViewModel @Inject constructor( -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(HelpState()) override val state = _state.asStateFlow() - override fun onEvent(event: HelpEvent) {} + override fun onEvent(event: HelpEvent) { + when (event) { + is HelpEvent.OnInit -> init(event) + } + } - fun init(screen: Screen.Help) { - viewModelScope.launch { - _state.update { - it.copy( - fromStart = screen.fromStart - ) - } + private fun init(event: HelpEvent.OnInit) { + _state.update { + it.copy( + fromStart = event.screen.fromStart + ) } } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/HistoryScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/HistoryScreen.kt index fbd59980..5f96d870 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/HistoryScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/HistoryScreen.kt @@ -43,8 +43,6 @@ import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibi import ua.acclorite.book_story.presentation.core.components.CustomIconButton import ua.acclorite.book_story.presentation.core.components.CustomSearchTextField import ua.acclorite.book_story.presentation.core.components.CustomSnackbar -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.is_messages.IsEmpty import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.NavigationIconButton @@ -52,13 +50,15 @@ import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.screens.history.components.HistoryDeleteWholeHistoryDialog import ua.acclorite.book_story.presentation.screens.history.components.HistoryItem import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.ui.DefaultTransition import ua.acclorite.book_story.presentation.ui.Transitions @Composable fun HistoryScreenRoot() { - val onEvent = LocalHistoryViewModel.current.onEvent + val onEvent = HistoryViewModel.getEvent() LaunchedEffect(Unit) { onEvent(HistoryEvent.OnUpdateScrollOffset) @@ -74,9 +74,9 @@ fun HistoryScreenRoot() { @Composable private fun HistoryScreen() { val context = LocalContext.current - val state = LocalHistoryViewModel.current.state - val onEvent = LocalHistoryViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent + val state = HistoryViewModel.getState() + val onEvent = HistoryViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() val onNavigate = LocalNavigator.current val refreshState = rememberPullRefreshState( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/components/HistoryDeleteWholeHistoryDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/components/HistoryDeleteWholeHistoryDialog.kt index 410aec7f..05914f4a 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/components/HistoryDeleteWholeHistoryDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/components/HistoryDeleteWholeHistoryDialog.kt @@ -6,12 +6,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Delete whole history dialog. @@ -19,8 +19,8 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent @Composable fun HistoryDeleteWholeHistoryDialog() { val context = LocalContext.current - val onEvent = LocalHistoryViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent + val onEvent = HistoryViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() CustomDialogWithContent( title = stringResource(id = R.string.delete_history), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/data/HistoryViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/data/HistoryViewModel.kt index 6ab97940..38e5bb6a 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/data/HistoryViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/history/data/HistoryViewModel.kt @@ -2,6 +2,7 @@ package ua.acclorite.book_story.presentation.screens.history.data import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material3.SnackbarResult +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -21,7 +22,7 @@ import ua.acclorite.book_story.domain.use_case.history.DeleteWholeHistory import ua.acclorite.book_story.domain.use_case.history.GetHistory import ua.acclorite.book_story.domain.use_case.history.InsertHistory import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date @@ -35,7 +36,15 @@ class HistoryViewModel @Inject constructor( private val deleteWholeHistory: DeleteWholeHistory, private val deleteHistory: DeleteHistory, private val getBooksById: GetBooksById -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(HistoryState()) override val state = _state.asStateFlow() @@ -137,7 +146,7 @@ class HistoryViewModel @Inject constructor( job2?.cancel() event.snackbarState.currentSnackbarData?.dismiss() - job2 = viewModelScope.launch(Dispatchers.IO) { + job2 = launch(Dispatchers.IO) { yield() delay(10000) yield() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/LibraryScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/LibraryScreen.kt index 058022a7..204840e5 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/LibraryScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/LibraryScreen.kt @@ -47,25 +47,25 @@ import ua.acclorite.book_story.domain.model.Book import ua.acclorite.book_story.domain.model.Category import ua.acclorite.book_story.domain.util.Selected import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.components.header import ua.acclorite.book_story.presentation.core.components.is_messages.IsEmpty import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.core.util.showToast +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.library.components.LibraryBookItem import ua.acclorite.book_story.presentation.screens.library.components.LibraryTopBar import ua.acclorite.book_story.presentation.screens.library.components.dialog.LibraryDeleteDialog import ua.acclorite.book_story.presentation.screens.library.components.dialog.LibraryMoveDialog import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.ui.DefaultTransition import ua.acclorite.book_story.presentation.ui.Transitions @Composable fun LibraryScreenRoot() { - val state = LocalLibraryViewModel.current.state - val onEvent = LocalLibraryViewModel.current.onEvent + val state = LibraryViewModel.getState() + val onEvent = LibraryViewModel.getEvent() val pagerState = rememberPagerState( initialPage = state.value.currentPage, @@ -99,9 +99,9 @@ private fun LibraryScreen( pagerState: PagerState, refreshState: PullRefreshState ) { - val state = LocalLibraryViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalLibraryViewModel.current.onEvent + val state = LibraryViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = LibraryViewModel.getEvent() val onNavigate = LocalNavigator.current var isScrollInProgress by remember { mutableStateOf(false) } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/LibraryTopBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/LibraryTopBar.kt index dfc97c16..690bbd7d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/LibraryTopBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/LibraryTopBar.kt @@ -35,9 +35,9 @@ import ua.acclorite.book_story.presentation.core.components.AnimatedTopAppBar import ua.acclorite.book_story.presentation.core.components.AnimatedTopAppBarData import ua.acclorite.book_story.presentation.core.components.CustomIconButton import ua.acclorite.book_story.presentation.core.components.CustomSearchTextField -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.navigation.NavigationIconButton import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Library Top Bar. @@ -48,8 +48,8 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent @OptIn(ExperimentalMaterial3Api::class) @Composable fun LibraryTopBar(pagerState: PagerState) { - val state = LocalLibraryViewModel.current.state - val onEvent = LocalLibraryViewModel.current.onEvent + val state = LibraryViewModel.getState() + val onEvent = LibraryViewModel.getEvent() val focusRequester = remember { FocusRequester() } AnimatedTopAppBar( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryDeleteDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryDeleteDialog.kt index 899d7fa0..0bc80a32 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryDeleteDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryDeleteDialog.kt @@ -6,14 +6,14 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Delete dialog. Deletes all selected books. @@ -21,10 +21,10 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent @Composable fun LibraryDeleteDialog() { val context = LocalContext.current - val state = LocalLibraryViewModel.current.state - val onEvent = LocalLibraryViewModel.current.onEvent - val onBrowseEvent = LocalBrowseViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = LibraryViewModel.getState() + val onEvent = LibraryViewModel.getEvent() + val onBrowseEvent = BrowseViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() CustomDialogWithContent( title = stringResource(id = R.string.delete_books), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryMoveDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryMoveDialog.kt index c916e4c7..8a65d29e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryMoveDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/components/dialog/LibraryMoveDialog.kt @@ -9,13 +9,13 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.Category -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithLazyColumn import ua.acclorite.book_story.presentation.core.components.custom_dialog.SelectableDialogItem import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel /** * Move dialog. Moves all selected books to the selected category. @@ -23,9 +23,9 @@ import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent @Composable fun LibraryMoveDialog(pagerState: PagerState) { val context = LocalContext.current - val state = LocalLibraryViewModel.current.state - val onEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = LibraryViewModel.getState() + val onEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() CustomDialogWithLazyColumn( title = stringResource(id = R.string.move_books), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/data/LibraryViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/data/LibraryViewModel.kt index 2ac69cb5..b4761ea5 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/data/LibraryViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/library/data/LibraryViewModel.kt @@ -1,5 +1,6 @@ package ua.acclorite.book_story.presentation.screens.library.data +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -18,7 +19,7 @@ import ua.acclorite.book_story.domain.use_case.book.GetBooks import ua.acclorite.book_story.domain.use_case.book.UpdateBook import ua.acclorite.book_story.domain.use_case.history.InsertHistory import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import java.util.Date import javax.inject.Inject @@ -28,7 +29,15 @@ class LibraryViewModel @Inject constructor( private val updateBook: UpdateBook, private val deleteBooks: DeleteBooks, private val insertHistory: InsertHistory -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(LibraryState()) override val state = _state.asStateFlow() @@ -381,16 +390,4 @@ class LibraryViewModel @Inject constructor( ) } } -} - - - - - - - - - - - - +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt index 6701d67e..52686277 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt @@ -61,19 +61,17 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomSelectionContainer -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel -import ua.acclorite.book_story.presentation.core.components.LocalSettingsViewModel import ua.acclorite.book_story.presentation.core.components.is_messages.IsError import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.core.util.showToast +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.screens.reader.components.ReaderChapter import ua.acclorite.book_story.presentation.screens.reader.components.ReaderChaptersDrawer import ua.acclorite.book_story.presentation.screens.reader.components.ReaderPerceptionExpander @@ -83,16 +81,17 @@ import ua.acclorite.book_story.presentation.screens.reader.components.app_bar.Re import ua.acclorite.book_story.presentation.screens.reader.components.app_bar.ReaderTopBar import ua.acclorite.book_story.presentation.screens.reader.components.settings_bottom_sheet.ReaderSettingsBottomSheet import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel +import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderTextAlignment @Composable fun ReaderScreenRoot(screen: Screen.Reader) { - val state = LocalReaderViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent - val viewModel = LocalReaderViewModel.current.viewModel + val state = ReaderViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = ReaderViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val context = LocalContext.current as ComponentActivity val onNavigate = LocalNavigator.current @@ -110,28 +109,34 @@ fun ReaderScreenRoot(screen: Screen.Reader) { } LaunchedEffect(Unit) { - viewModel.init( - screen = screen, - onNavigate = onNavigate, - fullscreenMode = mainState.value.fullscreen, - checkForTextUpdate = mainState.value.checkForTextUpdate, - checkForTextUpdateToast = { - if (mainState.value.checkForTextUpdateToast) { - context.getString(R.string.nothing_changed).showToast( - context = context, - longToast = false - ) + onEvent( + ReaderEvent.OnInit( + screen = screen, + navigateBack = { + onNavigate { + navigateBack() + } + }, + fullscreenMode = mainState.value.fullscreen, + checkForTextUpdate = mainState.value.checkForTextUpdate, + checkForTextUpdateToast = { + if (mainState.value.checkForTextUpdateToast) { + context.getString(R.string.nothing_changed).showToast( + context = context, + longToast = false + ) + } + }, + activity = context, + refreshList = { + onLibraryEvent(LibraryEvent.OnUpdateBook(it)) + onHistoryEvent(HistoryEvent.OnLoadList) + }, + onError = { + it.asString(context) + .showToast(context = context) } - }, - activity = context, - refreshList = { - onLibraryEvent(LibraryEvent.OnUpdateBook(it)) - onHistoryEvent(HistoryEvent.OnLoadList) - }, - onError = { - it.asString(context) - .showToast(context = context) - } + ) ) } LaunchedEffect(canScroll) { @@ -164,10 +169,14 @@ fun ReaderScreenRoot(screen: Screen.Reader) { } } LaunchedEffect(lazyListState) { - viewModel.onUpdateProgress { - onLibraryEvent(LibraryEvent.OnUpdateBook(it)) - onHistoryEvent(HistoryEvent.OnUpdateBook(it)) - } + onEvent( + ReaderEvent.OnUpdateProgress( + refreshList = { + onLibraryEvent(LibraryEvent.OnUpdateBook(it)) + onHistoryEvent(HistoryEvent.OnUpdateBook(it)) + } + ) + ) } DisposableEffect(mainState.value.screenOrientation) { context.requestedOrientation = mainState.value.screenOrientation.code @@ -180,7 +189,7 @@ fun ReaderScreenRoot(screen: Screen.Reader) { DisposableEffect(Unit) { onDispose { - viewModel.clearViewModel() + onEvent(ReaderEvent.OnClearViewModel) WindowCompat.getInsetsController( context.window, context.window.decorView @@ -194,12 +203,12 @@ fun ReaderScreenRoot(screen: Screen.Reader) { @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable private fun ReaderScreen(lazyListState: LazyListState) { - val state = LocalReaderViewModel.current.state - val mainState = LocalMainViewModel.current.state - val settingsState = LocalSettingsViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = ReaderViewModel.getState() + val mainState = MainViewModel.getState() + val settingsState = SettingsViewModel.getState() + val onEvent = ReaderViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val context = LocalContext.current as ComponentActivity val onNavigate = LocalNavigator.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderChaptersDrawer.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderChaptersDrawer.kt index 731c0bf6..bca45750 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderChaptersDrawer.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderChaptersDrawer.kt @@ -11,16 +11,16 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.components.custom_drawer.CustomModalDrawer import ua.acclorite.book_story.presentation.core.components.custom_drawer.CustomModalDrawerSelectableItem import ua.acclorite.book_story.presentation.core.components.custom_drawer.CustomModalDrawerTitleItem import ua.acclorite.book_story.presentation.core.util.calculateProgress import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel /** * Reader Chapters Drawer. @@ -28,10 +28,10 @@ import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent */ @Composable fun ReaderChaptersDrawer() { - val state = LocalReaderViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = ReaderViewModel.getState() + val onEvent = ReaderViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() CustomModalDrawer( show = state.value.showChaptersDrawer, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt index a854d6fb..df196fef 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt @@ -7,8 +7,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput import ua.acclorite.book_story.domain.util.UIText -import ua.acclorite.book_story.presentation.core.components.LocalSettingsViewModel import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent +import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel /** * Reader Fast Color Preset Change. @@ -24,7 +24,7 @@ fun Modifier.readerFastColorPresetChange( isLoading: Boolean, presetChanged: (UIText) -> Unit ): Modifier { - val onSettingsEvent = LocalSettingsViewModel.current.onEvent + val onSettingsEvent = SettingsViewModel.getEvent() val offset = remember { mutableFloatStateOf(0f) } return this.then( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt index 285da091..3b718d7d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt @@ -26,10 +26,10 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.FontWithName -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderTextAlignment /** @@ -65,7 +65,7 @@ fun LazyItemScope.ReaderTextParagraph( doubleClickTranslationEnabled: Boolean, toolbarHidden: Boolean ) { - val onEvent = LocalReaderViewModel.current.onEvent + val onEvent = ReaderViewModel.getEvent() val context = LocalContext.current Column( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderUpdateDialog.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderUpdateDialog.kt index 00dbe6fa..c20971ec 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderUpdateDialog.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderUpdateDialog.kt @@ -7,10 +7,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel /** * Reader Update Dialog. @@ -18,7 +18,7 @@ import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent */ @Composable fun ReaderUpdateDialog() { - val onEvent = LocalReaderViewModel.current.onEvent + val onEvent = ReaderViewModel.getEvent() val onNavigate = LocalNavigator.current val context = LocalContext.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderBottomBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderBottomBar.kt index bd0bdf81..8335c00e 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderBottomBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderBottomBar.kt @@ -31,14 +31,14 @@ import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.util.Direction import ua.acclorite.book_story.presentation.core.components.CustomIconButton -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.util.calculateProgress import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel import ua.acclorite.book_story.presentation.ui.Colors import ua.acclorite.book_story.presentation.ui.HorizontalExpandingTransition @@ -48,10 +48,10 @@ import ua.acclorite.book_story.presentation.ui.HorizontalExpandingTransition */ @Composable fun ReaderBottomBar() { - val state = LocalReaderViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = ReaderViewModel.getState() + val onEvent = ReaderViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val bookProgress by remember { derivedStateOf { @@ -168,10 +168,10 @@ fun ReaderBottomBar() { */ @Composable private fun BottomBarSlider() { - val state = LocalReaderViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = ReaderViewModel.getState() + val onEvent = ReaderViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() Slider( value = state.value.book.progress, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderTopBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderTopBar.kt index 9180acfe..deb9c42f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderTopBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/app_bar/ReaderTopBar.kt @@ -38,18 +38,18 @@ import androidx.compose.ui.unit.sp import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomIconButton -import ua.acclorite.book_story.presentation.core.components.LocalHistoryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalLibraryViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.core.util.showToast +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent +import ua.acclorite.book_story.presentation.screens.history.data.HistoryViewModel import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent +import ua.acclorite.book_story.presentation.screens.library.data.LibraryViewModel import ua.acclorite.book_story.presentation.screens.reader.components.readerFastColorPresetChange import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel import ua.acclorite.book_story.presentation.ui.Colors /** @@ -58,11 +58,11 @@ import ua.acclorite.book_story.presentation.ui.Colors @OptIn(ExperimentalMaterial3Api::class) @Composable fun ReaderTopBar() { - val state = LocalReaderViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent - val onLibraryEvent = LocalLibraryViewModel.current.onEvent - val onHistoryEvent = LocalHistoryViewModel.current.onEvent + val state = ReaderViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = ReaderViewModel.getEvent() + val onLibraryEvent = LibraryViewModel.getEvent() + val onHistoryEvent = HistoryViewModel.getEvent() val context = LocalContext.current as ComponentActivity val onNavigate = LocalNavigator.current diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt index b6b1f6bd..1f087936 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt @@ -20,10 +20,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheet +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.appearance.components.subcategories.ColorsSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.FontSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.MiscSubcategory @@ -39,9 +39,9 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.compo @OptIn(ExperimentalMaterial3Api::class) @Composable fun ReaderSettingsBottomSheet() { - val state = LocalReaderViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalReaderViewModel.current.onEvent + val state = ReaderViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = ReaderViewModel.getEvent() val context = LocalContext.current val pagerState = rememberPagerState(state.value.currentPage) { 3 } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheetTabRow.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheetTabRow.kt index 49f52cd3..d1aebfe1 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheetTabRow.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheetTabRow.kt @@ -4,9 +4,9 @@ import androidx.compose.foundation.pager.PagerState import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheetTabRow import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent +import ua.acclorite.book_story.presentation.screens.reader.data.ReaderViewModel /** * Settings bottom sheet tab row. @@ -16,8 +16,7 @@ import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent */ @Composable fun ReaderSettingsBottomSheetTabRow(pagerState: PagerState) { - val onEvent = LocalReaderViewModel.current.onEvent - + val onEvent = ReaderViewModel.getEvent() val tabItems = listOf( stringResource(id = R.string.general_tab), stringResource(id = R.string.reader_tab), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt index 7b15f01e..452ed3eb 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt @@ -6,9 +6,27 @@ import androidx.compose.runtime.Immutable import ua.acclorite.book_story.domain.model.Book import ua.acclorite.book_story.domain.util.OnNavigate import ua.acclorite.book_story.domain.util.UIText +import ua.acclorite.book_story.presentation.core.navigation.Screen @Immutable sealed class ReaderEvent { + data class OnInit( + val screen: Screen.Reader, + val navigateBack: () -> Unit, + val fullscreenMode: Boolean, + val checkForTextUpdate: Boolean, + val checkForTextUpdateToast: () -> Unit, + val activity: ComponentActivity, + val refreshList: (Book) -> Unit, + val onError: (UIText) -> Unit + ) : ReaderEvent() + + data class OnUpdateProgress( + val refreshList: (Book) -> Unit + ) : ReaderEvent() + + data object OnClearViewModel : ReaderEvent() + data object OnTextIsEmpty : ReaderEvent() data class OnLoadText( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt index f1079360..da3322d4 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt @@ -4,6 +4,7 @@ import android.app.SearchManager import android.content.Intent import android.net.Uri import androidx.activity.ComponentActivity +import androidx.compose.runtime.Composable import androidx.compose.runtime.snapshotFlow import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -25,18 +26,16 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.coroutines.yield import ua.acclorite.book_story.R -import ua.acclorite.book_story.domain.model.Book import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.domain.use_case.book.CheckForTextUpdate import ua.acclorite.book_story.domain.use_case.book.GetBookById import ua.acclorite.book_story.domain.use_case.book.GetText import ua.acclorite.book_story.domain.use_case.book.UpdateBook import ua.acclorite.book_story.domain.use_case.history.GetLatestHistory -import ua.acclorite.book_story.domain.util.OnNavigate import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.domain.util.UIText import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.core.util.coerceAndPreventNaN import ua.acclorite.book_story.presentation.core.util.launchActivity import javax.inject.Inject @@ -50,7 +49,15 @@ class ReaderViewModel @Inject constructor( private val getLatestHistory: GetLatestHistory, private val getBookById: GetBookById, private val checkForTextUpdate: CheckForTextUpdate -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(ReaderState()) override val state = _state.asStateFlow() @@ -62,6 +69,12 @@ class ReaderViewModel @Inject constructor( override fun onEvent(event: ReaderEvent) { viewModelScope.launch(eventJob + Dispatchers.Main) { when (event) { + is ReaderEvent.OnInit -> init(event) + + is ReaderEvent.OnUpdateProgress -> updateProgress(event) + + is ReaderEvent.OnClearViewModel -> clearViewModel() + is ReaderEvent.OnTextIsEmpty -> { _state.update { it.copy( @@ -505,23 +518,12 @@ class ReaderViewModel @Inject constructor( } } - fun init( - screen: Screen.Reader, - onNavigate: OnNavigate, - fullscreenMode: Boolean, - checkForTextUpdate: Boolean, - checkForTextUpdateToast: () -> Unit, - activity: ComponentActivity, - refreshList: (Book) -> Unit, - onError: (UIText) -> Unit - ) { + private fun init(event: ReaderEvent.OnInit) { viewModelScope.launch(Dispatchers.IO) { - val book = getBookById.execute(screen.bookId) + val book = getBookById.execute(event.screen.bookId) if (book == null) { - onNavigate { - navigateBack() - } + event.navigateBack() return@launch } @@ -530,13 +532,13 @@ class ReaderViewModel @Inject constructor( } clear() - withContext(Dispatchers.Default) { + withContext(Dispatchers.Main) { onEvent( ReaderEvent.OnShowHideMenu( show = false, - fullscreenMode = fullscreenMode, + fullscreenMode = event.fullscreenMode, saveCheckpoint = false, - activity = activity + activity = event.activity ) ) } @@ -544,17 +546,17 @@ class ReaderViewModel @Inject constructor( onEvent( ReaderEvent.OnLoadText( checkForUpdate = { - if (checkForTextUpdate) { + if (event.checkForTextUpdate) { onEvent( ReaderEvent.OnCheckTextForUpdate { - checkForTextUpdateToast() + event.checkForTextUpdateToast() } ) } }, - refreshList = { refreshList(it) }, + refreshList = { event.refreshList(it) }, onError = { - onError(it) + event.onError(it) }, onTextIsEmpty = { onEvent(ReaderEvent.OnTextIsEmpty) @@ -565,7 +567,7 @@ class ReaderViewModel @Inject constructor( } @OptIn(FlowPreview::class) - fun onUpdateProgress(refreshList: (Book) -> Unit) { + private fun updateProgress(event: ReaderEvent.OnUpdateProgress) { viewModelScope.launch(Dispatchers.Main) { snapshotFlow { _state.value.listState.run { firstVisibleItemIndex to firstVisibleItemScrollOffset } @@ -587,11 +589,23 @@ class ReaderViewModel @Inject constructor( } updateBook.execute(_state.value.book) - refreshList(_state.value.book) + event.refreshList(_state.value.book) } } } + private fun clearViewModel() { + viewModelScope.launch(Dispatchers.Main) { + _state.update { + ReaderState() + } + + eventJob.cancel() + eventJob.join() + eventJob = SupervisorJob() + } + } + private fun updateChapter(index: Int) { val (currentChapter, currentChapterProgress) = calculateCurrentChapter(index) _state.update { @@ -664,16 +678,4 @@ class ReaderViewModel @Inject constructor( eventJob.join() eventJob = SupervisorJob() } - - fun clearViewModel() { - viewModelScope.launch(Dispatchers.Main) { - _state.update { - ReaderState() - } - - eventJob.cancel() - eventJob.join() - eventJob = SupervisorJob() - } - } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt index 9eda3b54..b310d913 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt @@ -3,6 +3,7 @@ package ua.acclorite.book_story.presentation.screens.settings.data import android.content.Intent import android.os.Build import android.provider.Settings +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.isGranted @@ -26,7 +27,7 @@ import ua.acclorite.book_story.domain.use_case.color_preset.UpdateColorPreset import ua.acclorite.book_story.domain.util.ID import ua.acclorite.book_story.domain.util.UIText import ua.acclorite.book_story.presentation.core.constants.Constants -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.core.util.launchActivity import javax.inject.Inject import kotlin.random.Random @@ -39,7 +40,15 @@ class SettingsViewModel @Inject constructor( private val deleteColorPreset: DeleteColorPreset, private val selectColorPreset: SelectColorPreset, private val reorderColorPresets: ReorderColorPresets -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(SettingsState()) override val state = _state.asStateFlow() @@ -169,8 +178,9 @@ class SettingsViewModel @Inject constructor( selectedPresetIndex - 1 } } - val previousColorPreset = colorPresets.getOrNull(previousColorPresetIndex) - ?: return@launch + val previousColorPreset = + colorPresets.getOrNull(previousColorPresetIndex) + ?: return@launch yield() @@ -290,11 +300,12 @@ class SettingsViewModel @Inject constructor( return@launch } - val nextPosition = if (position == _state.value.colorPresets.lastIndex) { - position - 1 - } else { - position - } + val nextPosition = + if (position == _state.value.colorPresets.lastIndex) { + position - 1 + } else { + position + } yield() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/AbsoluteDarkSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/AbsoluteDarkSetting.kt index 98001226..c28b6211 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/AbsoluteDarkSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/AbsoluteDarkSetting.kt @@ -4,8 +4,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle import ua.acclorite.book_story.presentation.ui.ExpandingTransition import ua.acclorite.book_story.presentation.ui.isDark @@ -17,8 +17,8 @@ import ua.acclorite.book_story.presentation.ui.isPureDark */ @Composable fun AbsoluteDarkSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() val context = LocalContext.current ExpandingTransition( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ColorPresetSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ColorPresetSetting.kt index 509e3fa7..089833cd 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ColorPresetSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ColorPresetSetting.kt @@ -63,9 +63,9 @@ import ua.acclorite.book_story.domain.util.Selected import ua.acclorite.book_story.presentation.core.components.CategoryTitle import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomIconButton -import ua.acclorite.book_story.presentation.core.components.LocalSettingsViewModel import ua.acclorite.book_story.presentation.screens.settings.components.ColorPickerWithTitle import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent +import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel import ua.acclorite.book_story.presentation.ui.FadeTransitionPreservingSpace import ua.acclorite.book_story.presentation.ui.Transitions @@ -80,8 +80,8 @@ fun ColorPresetSetting( verticalPadding: Dp = 8.dp, horizontalPadding: Dp = 18.dp ) { - val state = LocalSettingsViewModel.current.state - val onEvent = LocalSettingsViewModel.current.onEvent + val state = SettingsViewModel.getState() + val onEvent = SettingsViewModel.getEvent() val context = LocalContext.current val reorderableListState = rememberReorderableLazyListState( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/DarkThemeSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/DarkThemeSetting.kt index 0ebe6626..ad1dc1ca 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/DarkThemeSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/DarkThemeSetting.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle import ua.acclorite.book_story.presentation.ui.DarkTheme @@ -16,8 +16,8 @@ import ua.acclorite.book_story.presentation.ui.DarkTheme */ @Composable fun DarkThemeSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SegmentedButtonWithTitle( title = stringResource(id = R.string.dark_theme_option), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/FastColorPresetChangeSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/FastColorPresetChangeSetting.kt index ee2704e7..f4b0dca5 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/FastColorPresetChangeSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/FastColorPresetChangeSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.appearance. import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun FastColorPresetChangeSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.fastColorPresetChange, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/PureDarkSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/PureDarkSetting.kt index aebcab9b..77389ffd 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/PureDarkSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/PureDarkSetting.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle import ua.acclorite.book_story.presentation.ui.ExpandingTransition import ua.acclorite.book_story.presentation.ui.PureDark @@ -18,8 +18,8 @@ import ua.acclorite.book_story.presentation.ui.isDark */ @Composable fun PureDarkSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ExpandingTransition(visible = state.value.darkTheme.isDark()) { SegmentedButtonWithTitle( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeContrastSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeContrastSetting.kt index 10bf2b2e..1dc1d881 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeContrastSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeContrastSetting.kt @@ -9,8 +9,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle import ua.acclorite.book_story.presentation.ui.BookStoryTheme import ua.acclorite.book_story.presentation.ui.ExpandingTransition @@ -25,8 +25,8 @@ import ua.acclorite.book_story.presentation.ui.isPureDark */ @Composable fun ThemeContrastSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() val themeContrastTheme = remember { mutableStateOf(state.value.theme) } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeSetting.kt index 6a54147a..98a2a315 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/appearance/components/settings/ThemeSetting.kt @@ -41,9 +41,9 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.util.UIText import ua.acclorite.book_story.presentation.core.components.CategoryTitle import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.ui.Theme import ua.acclorite.book_story.presentation.ui.ThemeContrast import ua.acclorite.book_story.presentation.ui.animatedColorScheme @@ -59,8 +59,8 @@ fun ThemeSetting( verticalPadding: Dp = 8.dp, horizontalPadding: Dp = 18.dp ) { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() val themes = remember { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) Constants.THEMES diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilesStructureSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilesStructureSetting.kt index 0de2c1c7..ca5b56df 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilesStructureSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilesStructureSetting.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure @@ -16,8 +16,8 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data. */ @Composable fun BrowseFilesStructureSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SegmentedButtonWithTitle( title = stringResource(id = R.string.browse_files_structure_option), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilterSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilterSetting.kt index 860e45f2..d40d1dab 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilterSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseFilterSetting.kt @@ -18,9 +18,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel /** * Browse Filter setting. @@ -28,8 +28,8 @@ import ua.acclorite.book_story.presentation.data.MainEvent */ fun LazyListScope.BrowseFilterSetting() { items(Constants.EXTENSIONS, key = { it }) { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() FilterItem( item = it, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseGridSizeSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseGridSizeSetting.kt index 20be511f..86807e30 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseGridSizeSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseGridSizeSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.browse.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout import ua.acclorite.book_story.presentation.ui.ExpandingTransition @@ -15,8 +15,8 @@ import ua.acclorite.book_story.presentation.ui.ExpandingTransition */ @Composable fun BrowseGridSizeSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ExpandingTransition(visible = state.value.browseLayout == BrowseLayout.GRID) { SliderWithTitle( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseLayoutSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseLayoutSetting.kt index ad34deda..ce8fc29c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseLayoutSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseLayoutSetting.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseLayout @@ -16,8 +16,8 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data. */ @Composable fun BrowseLayoutSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SegmentedButtonWithTitle( title = stringResource(id = R.string.browse_layout_option), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowsePinFavoriteDirectoriesSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowsePinFavoriteDirectoriesSetting.kt index c58ae265..8f04ca17 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowsePinFavoriteDirectoriesSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowsePinFavoriteDirectoriesSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.browse.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseFilesStructure import ua.acclorite.book_story.presentation.ui.ExpandingTransition @@ -15,8 +15,8 @@ import ua.acclorite.book_story.presentation.ui.ExpandingTransition */ @Composable fun BrowsePinFavoriteDirectoriesSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ExpandingTransition(visible = state.value.browseFilesStructure == BrowseFilesStructure.DIRECTORIES) { SwitchWithTitle( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseSortOrderSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseSortOrderSetting.kt index e825bf6f..e966aa71 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseSortOrderSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/browse/components/settings/BrowseSortOrderSetting.kt @@ -25,8 +25,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.BrowseSortOrder /** @@ -35,8 +35,8 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data. */ fun LazyListScope.BrowseSortOrderSetting() { items(BrowseSortOrder.entries, key = { it.name }) { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SortItem( item = it, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/AppLanguageSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/AppLanguageSetting.kt index b65d8e72..2104b869 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/AppLanguageSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/AppLanguageSetting.kt @@ -5,9 +5,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.ChipsWithTitle /** @@ -16,8 +16,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.ChipsWit */ @Composable fun AppLanguageSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ChipsWithTitle( title = stringResource(id = R.string.language_option), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/CheckForUpdatesSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/CheckForUpdatesSetting.kt index 950d1775..f3a9f3d9 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/CheckForUpdatesSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/CheckForUpdatesSetting.kt @@ -13,12 +13,12 @@ import androidx.compose.ui.res.stringResource import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalSettingsViewModel import ua.acclorite.book_story.presentation.core.components.custom_dialog.CustomDialogWithContent import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent +import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewModel /** * Check For Updates setting. @@ -28,9 +28,9 @@ import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent @SuppressLint("InlinedApi") @Composable fun CheckForUpdatesSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent - val onSettingsEvent = LocalSettingsViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() + val onSettingsEvent = SettingsViewModel.getEvent() val activity = LocalContext.current as ComponentActivity val notificationsPermissionState = rememberPermissionState( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/DoublePressExitSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/DoublePressExitSetting.kt index d13a81f1..421b8f65 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/DoublePressExitSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/general/components/settings/DoublePressExitSetting.kt @@ -4,8 +4,8 @@ import android.annotation.SuppressLint import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -15,8 +15,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi @SuppressLint("InlinedApi") @Composable fun DoublePressExitSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.doublePressExit, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateSetting.kt index 8cdc7923..8e757280 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun CheckForTextUpdateSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.checkForTextUpdate, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateToastSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateToastSetting.kt index 5b80b021..20a97807 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateToastSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CheckForTextUpdateToastSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle import ua.acclorite.book_story.presentation.ui.ExpandingTransition @@ -14,8 +14,8 @@ import ua.acclorite.book_story.presentation.ui.ExpandingTransition */ @Composable fun CheckForTextUpdateToastSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ExpandingTransition(visible = state.value.checkForTextUpdate) { SwitchWithTitle( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CutoutPaddingSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CutoutPaddingSetting.kt index 98b0d12e..52eed384 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CutoutPaddingSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CutoutPaddingSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun CutoutPaddingSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.cutoutPadding, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/DoubleClickTranslationSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/DoubleClickTranslationSetting.kt index a025ef71..87e30aea 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/DoubleClickTranslationSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/DoubleClickTranslationSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun DoubleClickTranslationSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.doubleClickTranslation, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontFamilySetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontFamilySetting.kt index 1bdacb78..621150ab 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontFamilySetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontFamilySetting.kt @@ -6,9 +6,9 @@ import androidx.compose.runtime.remember import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.ChipsWithTitle /** @@ -17,8 +17,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.ChipsWit */ @Composable fun FontFamilySetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() val fontFamily = remember(state.value.fontFamily) { Constants.FONTS.find { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontSizeSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontSizeSetting.kt index 9aa74eb6..6e5d9049 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontSizeSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontSizeSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun FontSizeSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.fontSize to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontStyleSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontStyleSetting.kt index 75df4870..793920d0 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontStyleSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FontStyleSetting.kt @@ -7,9 +7,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontStyle import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle /** @@ -18,8 +18,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.Segmente */ @Composable fun FontStyleSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() val fontFamily = remember(state.value.fontFamily) { Constants.FONTS.find { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt index 3017381f..830c041a 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun FullscreenSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.fullscreen, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/HideBarsOnFastScrollSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/HideBarsOnFastScrollSetting.kt index a9332af5..0c87df08 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/HideBarsOnFastScrollSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/HideBarsOnFastScrollSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun HideBarsOnFastScrollSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.hideBarsOnFastScroll, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt index 229bfa88..c05e0f85 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun KeepScreenOnSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.keepScreenOn, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LetterSpacingSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LetterSpacingSetting.kt index 60e563e0..ccae6980 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LetterSpacingSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LetterSpacingSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun LetterSpacingSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.letterSpacing to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LineHeightSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LineHeightSetting.kt index cb55d75c..da0573b3 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LineHeightSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/LineHeightSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun LineHeightSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.lineHeight to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphHeightSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphHeightSetting.kt index f67e3ea3..df195895 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphHeightSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphHeightSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun ParagraphHeightSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.paragraphHeight to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphIndentationSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphIndentationSetting.kt index 207794a1..e5f4b865 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphIndentationSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ParagraphIndentationSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderTextAlignment import ua.acclorite.book_story.presentation.ui.ExpandingTransition @@ -15,8 +15,8 @@ import ua.acclorite.book_story.presentation.ui.ExpandingTransition */ @Composable fun ParagraphIndentationSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ExpandingTransition( visible = state.value.textAlignment != ReaderTextAlignment.CENTER && diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderPaddingSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderPaddingSetting.kt index 085d0ad4..b0fad0d9 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderPaddingSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderPaddingSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun PerceptionExpanderPaddingSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.perceptionExpanderPadding to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderSetting.kt index 894e98f8..7a302ade 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWi */ @Composable fun PerceptionExpanderSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SwitchWithTitle( selected = state.value.perceptionExpander, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderThicknessSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderThicknessSetting.kt index 58bc0ce9..75df6c7f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderThicknessSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/PerceptionExpanderThicknessSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun PerceptionExpanderThicknessSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.perceptionExpanderThickness to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt index 7d2a6aa3..34106e95 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.ChipsWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderScreenOrientation @@ -16,8 +16,8 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data. */ @Composable fun ScreenOrientationSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() ChipsWithTitle( title = stringResource(id = R.string.screen_orientation_option), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/SidePaddingSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/SidePaddingSetting.kt index 25383ae2..5505754c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/SidePaddingSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/SidePaddingSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun SidePaddingSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.sidePadding to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/TextAlignmentSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/TextAlignmentSetting.kt index 620deb81..81445f73 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/TextAlignmentSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/TextAlignmentSetting.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SegmentedButtonWithTitle import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderTextAlignment @@ -16,8 +16,8 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data. */ @Composable fun TextAlignmentSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SegmentedButtonWithTitle( title = stringResource(id = R.string.text_alignment_option), diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/VerticalPaddingSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/VerticalPaddingSetting.kt index 38964eff..f2f353cf 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/VerticalPaddingSetting.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/VerticalPaddingSetting.kt @@ -3,8 +3,8 @@ package ua.acclorite.book_story.presentation.screens.settings.nested.reader.comp import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.settings.components.SliderWithTitle /** @@ -13,8 +13,8 @@ import ua.acclorite.book_story.presentation.screens.settings.components.SliderWi */ @Composable fun VerticalPaddingSetting() { - val state = LocalMainViewModel.current.state - val onMainEvent = LocalMainViewModel.current.onEvent + val state = MainViewModel.getState() + val onMainEvent = MainViewModel.getEvent() SliderWithTitle( value = state.value.verticalPadding to "pt", diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/StartScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/StartScreen.kt index 445a03c4..16d7b5a1 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/StartScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/StartScreen.kt @@ -12,15 +12,15 @@ import androidx.compose.ui.platform.LocalContext import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.rememberPermissionState -import ua.acclorite.book_story.presentation.core.components.LocalStartViewModel import ua.acclorite.book_story.presentation.screens.start.components.StartDone import ua.acclorite.book_story.presentation.screens.start.components.StartSettings import ua.acclorite.book_story.presentation.screens.start.data.StartEvent +import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel @SuppressLint("InlinedApi") @Composable fun StartScreenRoot() { - val viewModel = LocalStartViewModel.current.viewModel + val onEvent = StartViewModel.getEvent() val storagePermissionState = rememberPermissionState( permission = Manifest.permission.READ_EXTERNAL_STORAGE @@ -30,9 +30,11 @@ fun StartScreenRoot() { ) LaunchedEffect(Unit) { - viewModel.checkPermissions( - storagePermissionState = storagePermissionState, - notificationPermissionState = notificationsPermissionState + onEvent( + StartEvent.OnCheckPermissions( + storagePermissionState = storagePermissionState, + notificationPermissionState = notificationsPermissionState + ) ) } @@ -49,7 +51,7 @@ private fun StartScreen( storagePermissionState: PermissionState, notificationsPermissionState: PermissionState ) { - val onEvent = LocalStartViewModel.current.onEvent + val onEvent = StartViewModel.getEvent() val activity = LocalContext.current as ComponentActivity // Settings diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartDone.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartDone.kt index 36c1f3ce..1cd2b441 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartDone.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartDone.kt @@ -27,23 +27,23 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R -import ua.acclorite.book_story.presentation.core.components.LocalBrowseViewModel -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalStartViewModel import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent +import ua.acclorite.book_story.presentation.screens.browse.data.BrowseViewModel import ua.acclorite.book_story.presentation.screens.start.data.StartEvent +import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel /** * Start Done screen. */ @Composable fun StartDone() { - val state = LocalStartViewModel.current.state - val onEvent = LocalStartViewModel.current.onEvent - val onMainEvent = LocalMainViewModel.current.onEvent - val onBrowseEvent = LocalBrowseViewModel.current.onEvent + val state = StartViewModel.getState() + val onEvent = StartViewModel.getEvent() + val onMainEvent = MainViewModel.getEvent() + val onBrowseEvent = BrowseViewModel.getEvent() val onNavigate = LocalNavigator.current StartNavigationTransition( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationScreenItem.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationScreenItem.kt index 95d4ef45..4466174d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationScreenItem.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationScreenItem.kt @@ -9,8 +9,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomLazyColumn -import ua.acclorite.book_story.presentation.core.components.LocalStartViewModel import ua.acclorite.book_story.presentation.screens.start.data.StartNavigationScreen +import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel import ua.acclorite.book_story.presentation.ui.Transitions /** @@ -21,7 +21,7 @@ fun StartNavigationScreenItem( screen: StartNavigationScreen, content: LazyListScope.() -> Unit ) { - val state = LocalStartViewModel.current.state + val state = StartViewModel.getState() val listState = rememberLazyListState() CustomAnimatedVisibility( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationTransition.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationTransition.kt index dab48b0e..148e9a5d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationTransition.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartNavigationTransition.kt @@ -11,7 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility -import ua.acclorite.book_story.presentation.core.components.LocalStartViewModel +import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel import ua.acclorite.book_story.presentation.ui.Transitions /** @@ -26,7 +26,7 @@ fun StartNavigationTransition( verticalArrangement: Arrangement.Vertical = Arrangement.Top, content: @Composable ColumnScope.() -> Unit ) { - val state = LocalStartViewModel.current.state + val state = StartViewModel.getState() CustomAnimatedVisibility( visible = visible, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartSettings.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartSettings.kt index 901414d7..f09360ab 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartSettings.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/components/StartSettings.kt @@ -30,12 +30,12 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.ButtonItem -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel -import ua.acclorite.book_story.presentation.core.components.LocalStartViewModel import ua.acclorite.book_story.presentation.core.constants.Constants +import ua.acclorite.book_story.presentation.data.MainViewModel import ua.acclorite.book_story.presentation.screens.start.components.permissions.startPermissionsScreen import ua.acclorite.book_story.presentation.screens.start.data.StartEvent import ua.acclorite.book_story.presentation.screens.start.data.StartNavigationScreen +import ua.acclorite.book_story.presentation.screens.start.data.StartViewModel /** * Start Settings. @@ -49,10 +49,10 @@ fun StartSettings( storagePermissionState: PermissionState, notificationsPermissionState: PermissionState ) { - val state = LocalStartViewModel.current.state - val mainState = LocalMainViewModel.current.state - val onEvent = LocalStartViewModel.current.onEvent - val onMainEvent = LocalMainViewModel.current.onEvent + val state = StartViewModel.getState() + val mainState = MainViewModel.getState() + val onEvent = StartViewModel.getEvent() + val onMainEvent = MainViewModel.getEvent() val activity = LocalContext.current as ComponentActivity val languages = remember(mainState.value.language) { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartEvent.kt index ea23f226..49941d90 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartEvent.kt @@ -10,8 +10,17 @@ import ua.acclorite.book_story.domain.util.OnNavigate @Immutable sealed class StartEvent { - data class OnGoBack(val onQuit: () -> Unit) : StartEvent() + data class OnCheckPermissions( + val storagePermissionState: PermissionState, + val notificationPermissionState: PermissionState + ) : StartEvent() + + data class OnGoBack( + val onQuit: () -> Unit + ) : StartEvent() + data object OnGoForward : StartEvent() + data class OnStoragePermissionRequest( val activity: ComponentActivity, val legacyStoragePermissionState: PermissionState @@ -22,10 +31,14 @@ sealed class StartEvent { val notificationsPermissionState: PermissionState ) : StartEvent() - data class OnGoToBrowse(val onNavigate: OnNavigate, val onCompletedStartGuide: () -> Unit) : - StartEvent() + data class OnGoToBrowse( + val onNavigate: OnNavigate, + val onCompletedStartGuide: () -> Unit + ) : StartEvent() - data class OnGoToHelp(val onNavigate: OnNavigate) : StartEvent() + data class OnGoToHelp( + val onNavigate: OnNavigate + ) : StartEvent() data object OnResetStartScreen : StartEvent() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt index 501e54ae..89e5bc3f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt @@ -5,9 +5,9 @@ import android.net.Uri import android.os.Build import android.os.Environment import android.provider.Settings +import androidx.compose.runtime.Composable import androidx.lifecycle.viewModelScope import com.google.accompanist.permissions.ExperimentalPermissionsApi -import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.shouldShowRationale import dagger.hilt.android.lifecycle.HiltViewModel @@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.yield import ua.acclorite.book_story.presentation.core.navigation.Screen -import ua.acclorite.book_story.presentation.core.util.BaseViewModel +import ua.acclorite.book_story.presentation.core.util.UiViewModel import ua.acclorite.book_story.presentation.core.util.launchActivity import javax.inject.Inject @@ -28,7 +28,15 @@ import javax.inject.Inject @HiltViewModel class StartViewModel @Inject constructor( -) : BaseViewModel() { +) : UiViewModel() { + + companion object { + @Composable + fun getState() = getState() + + @Composable + fun getEvent() = getEvent() + } private val _state = MutableStateFlow(StartState()) override val state = _state.asStateFlow() @@ -38,6 +46,8 @@ class StartViewModel @Inject constructor( override fun onEvent(event: StartEvent) { when (event) { + is StartEvent.OnCheckPermissions -> checkPermissions(event) + is StartEvent.OnGoBack -> { storagePermissionJob?.cancel() notificationsPermissionJob?.cancel() @@ -258,10 +268,7 @@ class StartViewModel @Inject constructor( } } - fun checkPermissions( - storagePermissionState: PermissionState, - notificationPermissionState: PermissionState - ) { + private fun checkPermissions(event: StartEvent.OnCheckPermissions) { viewModelScope.launch(Dispatchers.IO) { val legacyStoragePermission = Build.VERSION.SDK_INT < Build.VERSION_CODES.R val legacyNotificationPermission = Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU @@ -269,10 +276,10 @@ class StartViewModel @Inject constructor( val storagePermissionGranted = if (!legacyStoragePermission) { Environment.isExternalStorageManager() } else { - storagePermissionState.status.isGranted + event.storagePermissionState.status.isGranted } val notificationPermissionGranted = if (!legacyNotificationPermission) { - notificationPermissionState.status.isGranted + event.notificationPermissionState.status.isGranted } else { true } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/ui/theme/BlackTheme.kt b/app/src/main/java/ua/acclorite/book_story/presentation/ui/theme/BlackTheme.kt index c196844d..c3715b1d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/ui/theme/BlackTheme.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/ui/theme/BlackTheme.kt @@ -3,11 +3,11 @@ package ua.acclorite.book_story.presentation.ui.theme import androidx.compose.material3.ColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color -import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel +import ua.acclorite.book_story.presentation.data.MainViewModel @Composable fun blackTheme(initialTheme: ColorScheme): ColorScheme { - val absoluteDark = LocalMainViewModel.current.state.value.absoluteDark + val absoluteDark = MainViewModel.getState().value.absoluteDark val surfaceDarker = 3f val surfaceContainerDarker = if (absoluteDark) 3f else 1.95f