more modularization

This commit is contained in:
T8RIN
2024-03-20 17:50:06 +03:00
parent 69eb20b929
commit 09cc4c7801
24 changed files with 158 additions and 78 deletions

View File

@ -135,7 +135,7 @@ dependencies {
implementation(projects.core.filters)
implementation(projects.core.crash)
implementation(projects.feature.main)
implementation(projects.feature.root)
implementation(projects.feature.mediaPicker)
implementation(projects.feature.quickTiles)
}

View File

@ -18,26 +18,20 @@
package ru.tech.imageresizershrinker.app.presentation
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
import androidx.activity.viewModels
import dagger.hilt.android.AndroidEntryPoint
import dev.olshevski.navigation.reimagined.navigate
import ru.tech.imageresizershrinker.app.presentation.components.AppContent
import ru.tech.imageresizershrinker.core.crash.components.M3Activity
import ru.tech.imageresizershrinker.core.filters.domain.FavoriteFiltersInteractor
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.parseImageFromIntent
import ru.tech.imageresizershrinker.core.ui.widget.utils.setContentWithWindowSizeClass
import ru.tech.imageresizershrinker.feature.main.presentation.viewModel.MainViewModel
import javax.inject.Inject
import ru.tech.imageresizershrinker.feature.root.presentation.RootContent
import ru.tech.imageresizershrinker.feature.root.presentation.viewModel.RootViewModel
@AndroidEntryPoint
class AppActivity : M3Activity() {
private val viewModel by viewModels<MainViewModel>()
@Inject
lateinit var favoriteFiltersInteractor: FavoriteFiltersInteractor<Bitmap>
private val viewModel by viewModels<RootViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -45,7 +39,7 @@ class AppActivity : M3Activity() {
parseImage(intent)
setContentWithWindowSizeClass {
AppContent(viewModel = viewModel)
RootContent(viewModel = viewModel)
}
}

View File

@ -34,6 +34,7 @@ class ImageToolboxLibraryFeaturePlugin : Plugin<Project> {
"implementation"(project(":core:resources"))
"implementation"(project(":core:settings"))
"implementation"(project(":core:di"))
"implementation"(project(":core:crash"))
}
}
}

View File

@ -17,7 +17,7 @@
@file:Suppress("ConstPropertyName")
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.core.ui.widget.other
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.animateFloatAsState

1
feature/easter-egg/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,24 @@
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
plugins {
alias(libs.plugins.image.toolbox.library)
alias(libs.plugins.image.toolbox.feature)
alias(libs.plugins.image.toolbox.compose)
}
android.namespace = "ru.tech.imageresizershrinker.feature.easter_egg"

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
</manifest>

View File

@ -17,7 +17,7 @@
@file:Suppress("KotlinConstantConditions")
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.easter_egg.presentation
import androidx.activity.compose.BackHandler
import androidx.compose.animation.core.animateFloatAsState

View File

@ -25,29 +25,5 @@ plugins {
android.namespace = "ru.tech.imageresizershrinker.feature.main"
dependencies {
implementation(projects.feature.loadNetImage)
implementation(projects.feature.crop)
implementation(projects.feature.limitsResize)
implementation(projects.feature.cipher)
implementation(projects.feature.imagePreview)
implementation(projects.feature.bytesResize)
implementation(projects.feature.compare)
implementation(projects.feature.deleteExif)
implementation(projects.feature.generatePalette)
implementation(projects.feature.resizeConvert)
implementation(projects.feature.pdfTools)
implementation(projects.feature.singleEdit)
implementation(projects.feature.eraseBackground)
implementation(projects.feature.draw)
implementation(projects.feature.filters)
implementation(projects.feature.imageStitch)
implementation(projects.feature.pickColor)
implementation(projects.feature.recognizeText)
implementation(projects.feature.gradientMaker)
implementation(projects.feature.watermarking)
implementation(projects.feature.gifTools)
implementation(projects.feature.apngTools)
implementation(projects.feature.zip)
implementation(projects.feature.jxlTools)
implementation(projects.feature.settings)
}

View File

@ -17,6 +17,7 @@
package ru.tech.imageresizershrinker.feature.main.presentation
import android.net.Uri
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
@ -71,13 +72,24 @@ import ru.tech.imageresizershrinker.core.ui.widget.other.LocalToastHostState
import ru.tech.imageresizershrinker.core.ui.widget.utils.LocalWindowSizeClass
import ru.tech.imageresizershrinker.feature.main.presentation.components.MainScreenContent
import ru.tech.imageresizershrinker.feature.main.presentation.components.MainScreenDrawerContent
import ru.tech.imageresizershrinker.feature.main.presentation.viewModel.MainViewModel
import ru.tech.imageresizershrinker.feature.settings.presentation.SettingsScreen
@Composable
fun MainScreen(
viewModel: MainViewModel
onTryGetUpdate: (
newRequest: Boolean,
installedFromMarket: Boolean,
onNoUpdates: () -> Unit
) -> Unit,
updateAvailable: Boolean,
updateUris: (List<Uri>) -> Unit
) {
fun tryGetUpdate(
newRequest: Boolean,
installedFromMarket: Boolean,
onNoUpdates: () -> Unit
) = onTryGetUpdate(newRequest, installedFromMarket, onNoUpdates)
val settingsState = LocalSettingsState.current
val isGrid = LocalWindowSizeClass.current.widthSizeClass != WindowWidthSizeClass.Compact
@ -98,8 +110,8 @@ fun MainScreen(
settingsBlockContent = { settingsSearchKeyword ->
SettingsScreen(
searchKeyword = settingsSearchKeyword,
onTryGetUpdate = viewModel::tryGetUpdate,
updateAvailable = viewModel.updateAvailable
onTryGetUpdate = ::tryGetUpdate,
updateAvailable = updateAvailable
)
}
)
@ -121,9 +133,9 @@ fun MainScreen(
onShowSnowfall = {
showSnowfall = true
},
onGetClipList = viewModel::updateUris,
onGetClipList = updateUris,
onTryGetUpdate = {
viewModel.tryGetUpdate(
tryGetUpdate(
newRequest = true,
installedFromMarket = context.isInstalledFromPlayStore(),
onNoUpdates = {
@ -136,7 +148,7 @@ fun MainScreen(
}
)
},
updateAvailable = viewModel.updateAvailable
updateAvailable = updateAvailable
)
}

View File

@ -148,6 +148,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.other.BoxAnimatedVisibility
import ru.tech.imageresizershrinker.core.ui.widget.other.EnhancedTopAppBar
import ru.tech.imageresizershrinker.core.ui.widget.other.EnhancedTopAppBarType
import ru.tech.imageresizershrinker.core.ui.widget.other.LocalToastHostState
import ru.tech.imageresizershrinker.core.ui.widget.other.NavigationItem
import ru.tech.imageresizershrinker.core.ui.widget.other.TopAppBarEmoji
import ru.tech.imageresizershrinker.core.ui.widget.preferences.PreferenceItemOverload
import ru.tech.imageresizershrinker.core.ui.widget.text.Marquee

1
feature/root/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,55 @@
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
plugins {
alias(libs.plugins.image.toolbox.library)
alias(libs.plugins.image.toolbox.feature)
alias(libs.plugins.image.toolbox.hilt)
alias(libs.plugins.image.toolbox.compose)
}
android.namespace = "ru.tech.imageresizershrinker.feature.root"
dependencies {
implementation(projects.feature.main)
implementation(projects.feature.loadNetImage)
implementation(projects.feature.crop)
implementation(projects.feature.limitsResize)
implementation(projects.feature.cipher)
implementation(projects.feature.imagePreview)
implementation(projects.feature.bytesResize)
implementation(projects.feature.compare)
implementation(projects.feature.deleteExif)
implementation(projects.feature.generatePalette)
implementation(projects.feature.resizeConvert)
implementation(projects.feature.pdfTools)
implementation(projects.feature.singleEdit)
implementation(projects.feature.eraseBackground)
implementation(projects.feature.draw)
implementation(projects.feature.filters)
implementation(projects.feature.imageStitch)
implementation(projects.feature.pickColor)
implementation(projects.feature.recognizeText)
implementation(projects.feature.gradientMaker)
implementation(projects.feature.watermarking)
implementation(projects.feature.gifTools)
implementation(projects.feature.apngTools)
implementation(projects.feature.zip)
implementation(projects.feature.jxlTools)
implementation(projects.feature.settings)
implementation(projects.feature.easterEgg)
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
</manifest>

View File

@ -15,12 +15,13 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.app.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation
import android.content.ClipData
import android.content.res.Configuration
import android.os.Build
import android.view.WindowManager
import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
@ -45,7 +46,6 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController
import dev.olshevski.navigation.reimagined.NavAction
import dev.olshevski.navigation.reimagined.navigate
import kotlinx.coroutines.delay
import ru.tech.imageresizershrinker.app.presentation.AppActivity
import ru.tech.imageresizershrinker.core.crash.components.GlobalExceptionHandler
import ru.tech.imageresizershrinker.core.filters.presentation.utils.LocalFavoriteFiltersInteractor
import ru.tech.imageresizershrinker.core.resources.emoji.Emoji
@ -66,19 +66,19 @@ import ru.tech.imageresizershrinker.core.ui.widget.other.LocalToastHostState
import ru.tech.imageresizershrinker.core.ui.widget.other.ToastHost
import ru.tech.imageresizershrinker.core.ui.widget.sheets.ProcessImagesPreferenceSheet
import ru.tech.imageresizershrinker.core.ui.widget.utils.LocalImageLoader
import ru.tech.imageresizershrinker.feature.main.presentation.components.AppExitDialog
import ru.tech.imageresizershrinker.feature.main.presentation.components.EditPresetsSheet
import ru.tech.imageresizershrinker.feature.main.presentation.components.FirstLaunchSetupDialog
import ru.tech.imageresizershrinker.feature.main.presentation.components.GithubReviewDialog
import ru.tech.imageresizershrinker.feature.main.presentation.components.PermissionDialog
import ru.tech.imageresizershrinker.feature.main.presentation.components.ScreenSelector
import ru.tech.imageresizershrinker.feature.main.presentation.viewModel.MainViewModel
import ru.tech.imageresizershrinker.feature.root.presentation.components.AppExitDialog
import ru.tech.imageresizershrinker.feature.root.presentation.components.EditPresetsSheet
import ru.tech.imageresizershrinker.feature.root.presentation.components.FirstLaunchSetupDialog
import ru.tech.imageresizershrinker.feature.root.presentation.components.GithubReviewDialog
import ru.tech.imageresizershrinker.feature.root.presentation.components.PermissionDialog
import ru.tech.imageresizershrinker.feature.root.presentation.components.ScreenSelector
import ru.tech.imageresizershrinker.feature.root.presentation.viewModel.RootViewModel
@Composable
internal fun AppContent(
viewModel: MainViewModel
fun RootContent(
viewModel: RootViewModel
) {
val context = LocalContext.current as AppActivity
val context = LocalContext.current as ComponentActivity
var showExitDialog by rememberSaveable { mutableStateOf(false) }
val editPresetsState = rememberSaveable { mutableStateOf(false) }
@ -134,7 +134,7 @@ internal fun AppContent(
LocalConfettiHostState provides rememberConfettiHostState(),
LocalImageLoader provides viewModel.imageLoader,
LocalHapticFeedback provides customHapticFeedback(viewModel.settingsState.hapticsStrength),
LocalFavoriteFiltersInteractor provides context.favoriteFiltersInteractor
LocalFavoriteFiltersInteractor provides viewModel.favoriteFiltersInteractor
) {
val showSelectSheet = rememberSaveable(viewModel.showSelectDialog) {
mutableStateOf(viewModel.showSelectDialog)

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.DoorBack
@ -34,7 +34,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.buttons.EnhancedButton
import ru.tech.imageresizershrinker.core.ui.widget.modifier.alertDialogBorder
@Composable
fun AppExitDialog(
internal fun AppExitDialog(
onDismiss: () -> Unit,
visible: Boolean
) {

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.fadeIn
@ -66,7 +66,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.text.TitleItem
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun EditPresetsSheet(
internal fun EditPresetsSheet(
editPresetsState: MutableState<Boolean>,
updatePresets: (List<Int>) -> Unit
) {

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@ -59,7 +59,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.preferences.PreferenceRowSwit
@Suppress("KotlinConstantConditions")
@Composable
fun FirstLaunchSetupDialog(
internal fun FirstLaunchSetupDialog(
toggleAllowBetas: (Boolean) -> Unit,
toggleShowUpdateDialog: () -> Unit
) {

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.StarRate
@ -33,7 +33,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.buttons.EnhancedButton
import ru.tech.imageresizershrinker.core.ui.widget.modifier.alertDialogBorder
@Composable
fun GithubReviewDialog(
internal fun GithubReviewDialog(
onDismiss: () -> Unit,
showNotShowAgainButton: Boolean,
onNotShowAgain: () -> Unit

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import android.Manifest
import android.app.Activity
@ -48,7 +48,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.buttons.EnhancedButton
import ru.tech.imageresizershrinker.core.ui.widget.modifier.alertDialogBorder
@Composable
fun PermissionDialog() {
internal fun PermissionDialog() {
val context = LocalContext.current as Activity
val settingsState = LocalSettingsState.current

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import android.view.WindowManager
import androidx.activity.ComponentActivity
@ -27,7 +27,9 @@ import ru.tech.imageresizershrinker.core.settings.presentation.LocalSettingsStat
import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen
@Composable
fun ScreenBasedMaxBrightnessEnforcement(screen: Screen?) {
internal fun ScreenBasedMaxBrightnessEnforcement(
screen: Screen?
) {
val context = LocalContext.current as ComponentActivity
val listToForceBrightness = LocalSettingsState.current.screenListWithMaxBrightnessEnforcement

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package ru.tech.imageresizershrinker.feature.main.presentation.components
package ru.tech.imageresizershrinker.feature.root.presentation.components
import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.animation.core.tween
@ -46,6 +46,7 @@ import ru.tech.imageresizershrinker.feature.compare.presentation.CompareScreen
import ru.tech.imageresizershrinker.feature.crop.presentation.CropScreen
import ru.tech.imageresizershrinker.feature.delete_exif.presentation.DeleteExifScreen
import ru.tech.imageresizershrinker.feature.draw.presentation.DrawScreen
import ru.tech.imageresizershrinker.feature.easter_egg.presentation.EasterEggScreen
import ru.tech.imageresizershrinker.feature.erase_background.presentation.EraseBackgroundScreen
import ru.tech.imageresizershrinker.feature.filters.presentation.FiltersScreen
import ru.tech.imageresizershrinker.feature.generate_palette.presentation.GeneratePaletteScreen
@ -57,18 +58,18 @@ import ru.tech.imageresizershrinker.feature.jxl_tools.presentation.JxlToolsScree
import ru.tech.imageresizershrinker.feature.limits_resize.presentation.LimitsResizeScreen
import ru.tech.imageresizershrinker.feature.load_net_image.presentation.LoadNetImageScreen
import ru.tech.imageresizershrinker.feature.main.presentation.MainScreen
import ru.tech.imageresizershrinker.feature.main.presentation.viewModel.MainViewModel
import ru.tech.imageresizershrinker.feature.pdf_tools.presentation.PdfToolsScreen
import ru.tech.imageresizershrinker.feature.pick_color.presentation.PickColorFromImageScreen
import ru.tech.imageresizershrinker.feature.recognize.text.presentation.RecognizeTextScreen
import ru.tech.imageresizershrinker.feature.resize_convert.presentation.ResizeAndConvertScreen
import ru.tech.imageresizershrinker.feature.root.presentation.viewModel.RootViewModel
import ru.tech.imageresizershrinker.feature.single_edit.presentation.SingleEditScreen
import ru.tech.imageresizershrinker.feature.watermarking.presentation.WatermarkingScreen
import ru.tech.imageresizershrinker.feature.zip.presentation.ZipScreen
@Composable
fun ScreenSelector(
viewModel: MainViewModel
internal fun ScreenSelector(
viewModel: RootViewModel
) {
val scope = rememberCoroutineScope()
val navController = viewModel.navController
@ -125,7 +126,9 @@ fun ScreenSelector(
is Screen.Main -> {
MainScreen(
viewModel = viewModel
onTryGetUpdate = viewModel::tryGetUpdate,
updateAvailable = viewModel.updateAvailable,
updateUris = viewModel::updateUris
)
}

View File

@ -15,9 +15,7 @@
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
@file:Suppress("SameParameterValue", "unused")
package ru.tech.imageresizershrinker.feature.main.presentation.viewModel
package ru.tech.imageresizershrinker.feature.root.presentation.viewModel
import android.graphics.Bitmap
import android.net.Uri
@ -44,6 +42,7 @@ import ru.tech.imageresizershrinker.core.di.DefaultDispatcher
import ru.tech.imageresizershrinker.core.domain.APP_RELEASES
import ru.tech.imageresizershrinker.core.domain.image.ImageGetter
import ru.tech.imageresizershrinker.core.domain.saving.FileController
import ru.tech.imageresizershrinker.core.filters.domain.FavoriteFiltersInteractor
import ru.tech.imageresizershrinker.core.resources.BuildConfig
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
import ru.tech.imageresizershrinker.core.settings.domain.model.SettingsState
@ -55,8 +54,9 @@ import javax.inject.Inject
import javax.xml.parsers.DocumentBuilderFactory
@HiltViewModel
class MainViewModel @Inject constructor(
class RootViewModel @Inject constructor(
val imageLoader: ImageLoader,
val favoriteFiltersInteractor: FavoriteFiltersInteractor<Bitmap>,
private val imageGetter: ImageGetter<Bitmap, ExifInterface>,
fileController: FileController,
private val settingsRepository: SettingsRepository,

View File

@ -69,6 +69,8 @@ include(":feature:jxl-tools")
include(":feature:media-picker")
include(":feature:quick-tiles")
include(":feature:settings")
include(":feature:easter-egg")
include(":feature:root")
include(":core:settings")
include(":core:resources")