mirror of
https://github.com/T8RIN/ImageToolbox.git
synced 2025-08-06 15:49:35 +08:00
core settings added
This commit is contained in:
@ -168,7 +168,6 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
coreLibraryDesugaring(libs.desugaring)
|
||||
|
||||
//Di
|
||||
@ -185,12 +184,12 @@ dependencies {
|
||||
implementation(projects.core.ui)
|
||||
implementation(projects.core.data)
|
||||
implementation(projects.core.resources)
|
||||
implementation(projects.core.settings)
|
||||
|
||||
implementation(projects.feature.main)
|
||||
|
||||
"marketImplementation"(libs.firebase.crashlytics.ktx)
|
||||
"marketImplementation"(libs.firebase.analytics.ktx)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -26,8 +26,8 @@ import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import ru.tech.imageresizershrinker.core.domain.model.SettingsState
|
||||
import ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state.GetSettingsStateFlowUseCase
|
||||
import ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state.GetSettingsStateUseCase
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.use_case.GetSettingsStateFlowUseCase
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.use_case.GetSettingsStateUseCase
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
|
@ -32,6 +32,7 @@ class ImageToolboxLibraryFeaturePlugin : Plugin<Project> {
|
||||
"implementation"(project(":core:ui"))
|
||||
"implementation"(project(":core:domain"))
|
||||
"implementation"(project(":core:resources"))
|
||||
"implementation"(project(":core:settings"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,4 +45,6 @@ dependencies {
|
||||
implementation(projects.core.resources)
|
||||
|
||||
implementation(projects.core.filters)
|
||||
|
||||
implementation(projects.core.settings)
|
||||
}
|
@ -38,7 +38,6 @@ import ru.tech.imageresizershrinker.core.domain.image.ImagePreviewCreator
|
||||
import ru.tech.imageresizershrinker.core.domain.image.ImageScaler
|
||||
import ru.tech.imageresizershrinker.core.domain.image.ImageTransformer
|
||||
import ru.tech.imageresizershrinker.core.domain.image.ShareProvider
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.FileController
|
||||
import ru.tech.imageresizershrinker.core.filters.domain.FilterProvider
|
||||
import javax.inject.Singleton
|
||||
@ -60,7 +59,7 @@ object ImageModule {
|
||||
@Singleton
|
||||
@Provides
|
||||
fun provideImageScaler(
|
||||
settingsRepository: SettingsRepository,
|
||||
settingsRepository: ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository,
|
||||
imageCompressor: ImageCompressor<Bitmap>,
|
||||
imageTransformer: ImageTransformer<Bitmap>,
|
||||
filterProvider: FilterProvider<Bitmap>
|
||||
@ -76,7 +75,7 @@ object ImageModule {
|
||||
fun provideImageCompressor(
|
||||
@ApplicationContext context: Context,
|
||||
imageTransformer: ImageTransformer<Bitmap>,
|
||||
settingsRepository: SettingsRepository,
|
||||
settingsRepository: ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository,
|
||||
filterProvider: FilterProvider<Bitmap>
|
||||
): ImageCompressor<Bitmap> = AndroidImageCompressor(
|
||||
context = context,
|
||||
|
@ -18,8 +18,6 @@
|
||||
package ru.tech.imageresizershrinker.core.data.di
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
@ -28,6 +26,7 @@ import dagger.hilt.components.SingletonComponent
|
||||
import ru.tech.imageresizershrinker.core.data.saving.FileControllerImpl
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.FileController
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.RandomStringGenerator
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@ -38,11 +37,11 @@ object SavingModule {
|
||||
@Provides
|
||||
fun provideFileController(
|
||||
@ApplicationContext context: Context,
|
||||
dataStore: DataStore<Preferences>,
|
||||
settingsRepository: SettingsRepository,
|
||||
randomStringGenerator: RandomStringGenerator
|
||||
): FileController = FileControllerImpl(
|
||||
context = context,
|
||||
dataStore = dataStore,
|
||||
settingsRepository = settingsRepository,
|
||||
randomStringGenerator = randomStringGenerator
|
||||
)
|
||||
|
||||
|
@ -34,8 +34,8 @@ import ru.tech.imageresizershrinker.core.domain.image.ImageScaler
|
||||
import ru.tech.imageresizershrinker.core.domain.image.ImageTransformer
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ImageFormat
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ImageInfo
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.filters.domain.FilterProvider
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import java.io.ByteArrayOutputStream
|
||||
import javax.inject.Inject
|
||||
|
||||
|
@ -36,9 +36,9 @@ import ru.tech.imageresizershrinker.core.domain.model.ImageFormat
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ImageInfo
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ImageScaleMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ResizeType
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.filters.domain.FilterProvider
|
||||
import ru.tech.imageresizershrinker.core.filters.domain.model.Filter
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.ByteArrayOutputStream
|
||||
import javax.inject.Inject
|
||||
|
@ -32,9 +32,6 @@ import android.provider.OpenableColumns
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.FileProvider
|
||||
import androidx.core.net.toUri
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.edit
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import androidx.exifinterface.media.ExifInterface
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@ -42,26 +39,17 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import okio.use
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ADD_ORIGINAL_NAME_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ADD_SEQ_NUM_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ADD_SIZE_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.COPY_TO_CLIPBOARD_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.FILENAME_PREFIX
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.FILENAME_SUFFIX
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.IMAGE_PICKER_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.OVERWRITE_FILE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.RANDOMIZE_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SAVE_FOLDER_URI
|
||||
import ru.tech.imageresizershrinker.core.domain.image.Metadata
|
||||
import ru.tech.imageresizershrinker.core.domain.model.CopyToClipboardMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.SettingsState
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.FileController
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.RandomStringGenerator
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.SaveResult
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.SaveTarget
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.model.FileParams
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.model.ImageSaveTarget
|
||||
import ru.tech.imageresizershrinker.core.domain.utils.readableByteCount
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.OutputStream
|
||||
@ -74,40 +62,18 @@ import kotlin.random.Random
|
||||
|
||||
class FileControllerImpl @Inject constructor(
|
||||
private val context: Context,
|
||||
private val dataStore: DataStore<Preferences>,
|
||||
private val settingsRepository: SettingsRepository,
|
||||
private val randomStringGenerator: RandomStringGenerator
|
||||
) : FileController {
|
||||
|
||||
private var _fileParams: FileParams = FileParams(
|
||||
treeUri = null,
|
||||
filenamePrefix = "",
|
||||
filenameSuffix = "",
|
||||
addSizeInFilename = false,
|
||||
addOriginalFilename = false,
|
||||
addSequenceNumber = false,
|
||||
randomizeFilename = false,
|
||||
copyToClipboardMode = CopyToClipboardMode.Disabled,
|
||||
overwriteFile = false
|
||||
)
|
||||
private var _settingsState: SettingsState = SettingsState.Default
|
||||
|
||||
private val fileParams get() = _fileParams
|
||||
private val settingsState get() = _settingsState
|
||||
|
||||
init {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
dataStore.data.collect { preferences ->
|
||||
_fileParams = _fileParams.copy(
|
||||
treeUri = preferences[SAVE_FOLDER_URI]?.takeIf { it.isNotEmpty() },
|
||||
filenamePrefix = preferences[FILENAME_PREFIX] ?: "ResizedImage",
|
||||
filenameSuffix = preferences[FILENAME_SUFFIX] ?: "",
|
||||
addSizeInFilename = preferences[ADD_SIZE_TO_FILENAME] ?: false,
|
||||
addOriginalFilename = preferences[ADD_ORIGINAL_NAME_TO_FILENAME] ?: false,
|
||||
addSequenceNumber = preferences[ADD_SEQ_NUM_TO_FILENAME] ?: true,
|
||||
randomizeFilename = preferences[RANDOMIZE_FILENAME] ?: false,
|
||||
copyToClipboardMode = preferences[COPY_TO_CLIPBOARD_MODE]?.let {
|
||||
CopyToClipboardMode.fromInt(it)
|
||||
} ?: CopyToClipboardMode.Disabled,
|
||||
overwriteFile = preferences[OVERWRITE_FILE] ?: false
|
||||
)
|
||||
settingsRepository.getSettingsStateFlow().collect { state ->
|
||||
_settingsState = state
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -137,7 +103,7 @@ class FileControllerImpl @Inject constructor(
|
||||
}
|
||||
|
||||
override val savingPath: String
|
||||
get() = fileParams.treeUri?.takeIf { it.isNotEmpty() }?.toUri().toUiPath(
|
||||
get() = settingsState.saveFolderUri?.takeIf { it.isNotEmpty() }?.toUri().toUiPath(
|
||||
context = context,
|
||||
default = context.getString(R.string.default_folder)
|
||||
)
|
||||
@ -175,7 +141,7 @@ class FileControllerImpl @Inject constructor(
|
||||
}
|
||||
|
||||
kotlin.runCatching {
|
||||
if (fileParams.copyToClipboardMode is CopyToClipboardMode.Enabled) {
|
||||
if (settingsState.copyToClipboardMode is CopyToClipboardMode.Enabled) {
|
||||
val clipboardManager = ContextCompat.getSystemService(
|
||||
context,
|
||||
ClipboardManager::class.java
|
||||
@ -192,7 +158,7 @@ class FileControllerImpl @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
if (fileParams.copyToClipboardMode is CopyToClipboardMode.Enabled.WithoutSaving) {
|
||||
if (settingsState.copyToClipboardMode is CopyToClipboardMode.Enabled.WithoutSaving) {
|
||||
return SaveResult.Success(context.getString(R.string.copied))
|
||||
}
|
||||
|
||||
@ -201,15 +167,13 @@ class FileControllerImpl @Inject constructor(
|
||||
context.contentResolver.openFileDescriptor(originalUri, "r")
|
||||
}.isSuccess
|
||||
|
||||
if (fileParams.overwriteFile && hasOriginalUri) {
|
||||
if (settingsState.overwriteFiles && hasOriginalUri) {
|
||||
runCatching {
|
||||
if (originalUri == Uri.EMPTY) throw IllegalStateException()
|
||||
|
||||
context.contentResolver.openFileDescriptor(originalUri, "wt")
|
||||
}.onFailure {
|
||||
dataStore.edit {
|
||||
it[IMAGE_PICKER_MODE] = 2
|
||||
}
|
||||
settingsRepository.setImagePickerMode(2)
|
||||
return SaveResult.Error.Exception(
|
||||
Exception(
|
||||
context.getString(
|
||||
@ -238,7 +202,7 @@ class FileControllerImpl @Inject constructor(
|
||||
)
|
||||
}
|
||||
} else {
|
||||
fileParams.treeUri.takeIf {
|
||||
settingsState.saveFolderUri.takeIf {
|
||||
it != null
|
||||
}?.let { treeUri ->
|
||||
val hasDir: Boolean = treeUri.toUri().let {
|
||||
@ -246,9 +210,7 @@ class FileControllerImpl @Inject constructor(
|
||||
}?.exists() == true
|
||||
|
||||
if (!hasDir) {
|
||||
dataStore.edit {
|
||||
it[SAVE_FOLDER_URI] = ""
|
||||
}
|
||||
settingsRepository.setSaveFolderUri(null)
|
||||
return SaveResult.Error.Exception(
|
||||
Exception(
|
||||
context.getString(
|
||||
@ -274,7 +236,7 @@ class FileControllerImpl @Inject constructor(
|
||||
} else saveTarget
|
||||
|
||||
val savingFolder = context.getSavingFolder(
|
||||
treeUri = fileParams.treeUri?.takeIf { it.isNotEmpty() }?.toUri(),
|
||||
treeUri = settingsState.saveFolderUri?.takeIf { it.isNotEmpty() }?.toUri(),
|
||||
saveTarget = newSaveTarget
|
||||
)
|
||||
|
||||
@ -383,7 +345,7 @@ class FileControllerImpl @Inject constructor(
|
||||
): String {
|
||||
val extension = saveTarget.imageInfo.imageFormat.extension
|
||||
|
||||
if (fileParams.randomizeFilename) return "${randomStringGenerator.generate(32)}.$extension"
|
||||
if (settingsState.randomizeFilename) return "${randomStringGenerator.generate(32)}.$extension"
|
||||
|
||||
val wh =
|
||||
"(" + (if (saveTarget.originalUri.toUri() == Uri.EMPTY) context.getString(R.string.width)
|
||||
@ -391,20 +353,20 @@ class FileControllerImpl @Inject constructor(
|
||||
R.string.height
|
||||
).split(" ")[0] else saveTarget.imageInfo.height) + ")"
|
||||
|
||||
var prefix = fileParams.filenamePrefix
|
||||
var suffix = fileParams.filenameSuffix
|
||||
var prefix = settingsState.filenamePrefix
|
||||
var suffix = settingsState.filenameSuffix
|
||||
|
||||
if (prefix.isNotEmpty()) prefix = "${prefix}_"
|
||||
if (suffix.isNotEmpty()) suffix = "_$suffix"
|
||||
|
||||
if (fileParams.addOriginalFilename) {
|
||||
if (settingsState.addOriginalFilename) {
|
||||
prefix += if (saveTarget.originalUri.toUri() != Uri.EMPTY) {
|
||||
context.getFileName(saveTarget.originalUri.toUri()) ?: ""
|
||||
} else {
|
||||
context.getString(R.string.original_filename)
|
||||
}
|
||||
}
|
||||
if (fileParams.addSizeInFilename) prefix += wh
|
||||
if (settingsState.addSizeInFilename) prefix += wh
|
||||
|
||||
val timeStamp = SimpleDateFormat(
|
||||
"yyyy-MM-dd_HH-mm-ss",
|
||||
@ -412,7 +374,7 @@ class FileControllerImpl @Inject constructor(
|
||||
).format(Date()) + "_${Random(Random.nextInt()).hashCode().toString().take(4)}"
|
||||
|
||||
return "$prefix${
|
||||
if (fileParams.addSequenceNumber && saveTarget.sequenceNumber != null) {
|
||||
if (settingsState.addSequenceNumber && saveTarget.sequenceNumber != null) {
|
||||
SimpleDateFormat(
|
||||
"yyyy-MM-dd_HH-mm-ss",
|
||||
Locale.getDefault()
|
||||
|
1
core/settings/.gitignore
vendored
Normal file
1
core/settings/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build
|
@ -15,18 +15,16 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.saving.model
|
||||
plugins {
|
||||
alias(libs.plugins.image.toolbox.library)
|
||||
alias(libs.plugins.image.toolbox.hilt)
|
||||
}
|
||||
|
||||
import ru.tech.imageresizershrinker.core.domain.model.CopyToClipboardMode
|
||||
android.namespace = "ru.tech.imageresizershrinker.core.settings"
|
||||
|
||||
data class FileParams(
|
||||
val treeUri: String?,
|
||||
val filenamePrefix: String,
|
||||
val filenameSuffix: String,
|
||||
val addSizeInFilename: Boolean,
|
||||
val addOriginalFilename: Boolean,
|
||||
val addSequenceNumber: Boolean,
|
||||
val randomizeFilename: Boolean,
|
||||
val copyToClipboardMode: CopyToClipboardMode,
|
||||
val overwriteFile: Boolean
|
||||
)
|
||||
dependencies {
|
||||
api(libs.datastore.preferences.android)
|
||||
|
||||
implementation(projects.core.domain)
|
||||
implementation(projects.core.resources)
|
||||
}
|
20
core/settings/src/main/AndroidManifest.xml
Normal file
20
core/settings/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ 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>.
|
||||
-->
|
||||
|
||||
<manifest>
|
||||
|
||||
</manifest>
|
@ -15,14 +15,13 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.data.migrations
|
||||
package ru.tech.imageresizershrinker.core.settings.data
|
||||
|
||||
import androidx.datastore.core.DataMigration
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.booleanPreferencesKey
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys
|
||||
|
||||
class BorderWidthMigration : DataMigration<Preferences> {
|
||||
internal class BorderWidthMigration : DataMigration<Preferences> {
|
||||
|
||||
private val migrated = booleanPreferencesKey("migratedBorders")
|
||||
override suspend fun cleanUp() = Unit
|
@ -15,7 +15,7 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.data.keys
|
||||
package ru.tech.imageresizershrinker.core.settings.data
|
||||
|
||||
import androidx.datastore.preferences.core.booleanPreferencesKey
|
||||
import androidx.datastore.preferences.core.doublePreferencesKey
|
||||
@ -23,7 +23,7 @@ import androidx.datastore.preferences.core.floatPreferencesKey
|
||||
import androidx.datastore.preferences.core.intPreferencesKey
|
||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||
|
||||
object Keys {
|
||||
internal object Keys {
|
||||
val SAVE_FOLDER_URI = stringPreferencesKey("saveFolder")
|
||||
val NIGHT_MODE = intPreferencesKey("nightMode")
|
||||
val DYNAMIC_COLORS = booleanPreferencesKey("dynamicColors")
|
@ -15,7 +15,7 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.data.repository
|
||||
package ru.tech.imageresizershrinker.core.settings.data
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
@ -30,62 +30,62 @@ import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.withContext
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ADD_ORIGINAL_NAME_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ADD_SEQ_NUM_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ADD_SIZE_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ALLOW_ANALYTICS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ALLOW_BETAS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ALLOW_CRASHLYTICS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.ALLOW_IMAGE_MONET
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.AMOLED_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.APP_COLOR_TUPLE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.APP_OPEN_COUNT
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.AUTO_CACHE_CLEAR
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.BORDER_WIDTH
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.COLOR_TUPLES
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.COPY_TO_CLIPBOARD_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DRAW_APPBAR_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DRAW_BUTTON_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DRAW_CONTAINER_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DRAW_FAB_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DRAW_SLIDER_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DRAW_SWITCH_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.DYNAMIC_COLORS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.EMOJI_COUNT
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.EXIF_WIDGET_INITIAL_STATE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.FAB_ALIGNMENT
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.FILENAME_PREFIX
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.FILENAME_SUFFIX
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.FONT_SCALE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.GROUP_OPTIONS_BY_TYPE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.IMAGE_PICKER_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.IMAGE_SCALE_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.INITIAL_OCR_CODES
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.INVERT_THEME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.LOCK_DRAW_ORIENTATION
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.MAGNIFIER_ENABLED
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.NIGHT_MODE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.OVERWRITE_FILE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.PRESETS
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.RANDOMIZE_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SAVE_FOLDER_URI
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SCREEN_ORDER
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SCREEN_SEARCH_ENABLED
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SELECTED_EMOJI_INDEX
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SELECTED_FONT_INDEX
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.SHOW_UPDATE_DIALOG
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.THEME_CONTRAST_LEVEL
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.THEME_STYLE
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.USE_PIXEL_SWITCH
|
||||
import ru.tech.imageresizershrinker.core.data.keys.Keys.VIBRATION_STRENGTH
|
||||
import ru.tech.imageresizershrinker.core.domain.model.CopyToClipboardMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.FontFam
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ImageScaleMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.NightMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.Preset
|
||||
import ru.tech.imageresizershrinker.core.domain.model.SettingsState
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ADD_ORIGINAL_NAME_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ADD_SEQ_NUM_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ADD_SIZE_TO_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ALLOW_ANALYTICS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ALLOW_BETAS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ALLOW_CRASHLYTICS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.ALLOW_IMAGE_MONET
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.AMOLED_MODE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.APP_COLOR_TUPLE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.APP_OPEN_COUNT
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.AUTO_CACHE_CLEAR
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.BORDER_WIDTH
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.COLOR_TUPLES
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.COPY_TO_CLIPBOARD_MODE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DRAW_APPBAR_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DRAW_BUTTON_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DRAW_CONTAINER_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DRAW_FAB_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DRAW_SLIDER_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DRAW_SWITCH_SHADOWS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.DYNAMIC_COLORS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.EMOJI_COUNT
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.EXIF_WIDGET_INITIAL_STATE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.FAB_ALIGNMENT
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.FILENAME_PREFIX
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.FILENAME_SUFFIX
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.FONT_SCALE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.GROUP_OPTIONS_BY_TYPE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.IMAGE_PICKER_MODE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.IMAGE_SCALE_MODE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.INITIAL_OCR_CODES
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.INVERT_THEME
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.LOCK_DRAW_ORIENTATION
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.MAGNIFIER_ENABLED
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.NIGHT_MODE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.OVERWRITE_FILE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.PRESETS
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.RANDOMIZE_FILENAME
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.SAVE_FOLDER_URI
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.SCREEN_ORDER
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.SCREEN_SEARCH_ENABLED
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.SELECTED_EMOJI_INDEX
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.SELECTED_FONT_INDEX
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.SHOW_UPDATE_DIALOG
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.THEME_CONTRAST_LEVEL
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.THEME_STYLE
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.USE_PIXEL_SWITCH
|
||||
import ru.tech.imageresizershrinker.core.settings.data.Keys.VIBRATION_STRENGTH
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.DataInputStream
|
@ -15,7 +15,7 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.data.di
|
||||
package ru.tech.imageresizershrinker.core.settings.di
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
@ -27,7 +27,7 @@ import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import ru.tech.imageresizershrinker.core.data.migrations.BorderWidthMigration
|
||||
import ru.tech.imageresizershrinker.core.settings.data.BorderWidthMigration
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
@ -15,7 +15,7 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.data.di
|
||||
package ru.tech.imageresizershrinker.core.settings.di
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
@ -25,13 +25,14 @@ import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import ru.tech.imageresizershrinker.core.data.repository.SettingsRepositoryImpl
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.settings.data.SettingsRepositoryImpl
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Singleton
|
||||
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object RepositoryModule {
|
||||
object SettingsModule {
|
||||
|
||||
@Singleton
|
||||
@Provides
|
@ -15,7 +15,7 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.repository
|
||||
package ru.tech.imageresizershrinker.core.settings.domain
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import ru.tech.imageresizershrinker.core.domain.model.CopyToClipboardMode
|
@ -15,9 +15,9 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.use_case.backup_and_restore
|
||||
package ru.tech.imageresizershrinker.core.settings.domain.use_case
|
||||
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class CreateBackupFileUseCase @Inject constructor(
|
@ -15,9 +15,9 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.use_case.backup_and_restore
|
||||
package ru.tech.imageresizershrinker.core.settings.domain.use_case
|
||||
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class CreateBackupFilenameUseCase @Inject constructor(
|
@ -15,9 +15,9 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state
|
||||
package ru.tech.imageresizershrinker.core.settings.domain.use_case
|
||||
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class GetSettingsStateFlowUseCase @Inject constructor(
|
@ -15,9 +15,9 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state
|
||||
package ru.tech.imageresizershrinker.core.settings.domain.use_case
|
||||
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class GetSettingsStateUseCase @Inject constructor(
|
@ -15,9 +15,9 @@
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.use_case.backup_and_restore
|
||||
package ru.tech.imageresizershrinker.core.settings.domain.use_case
|
||||
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class RestoreFromBackupFileUseCase @Inject constructor(
|
@ -83,4 +83,6 @@ dependencies {
|
||||
"marketImplementation"(libs.app.update.ktx)
|
||||
|
||||
api(projects.core.resources)
|
||||
|
||||
implementation(projects.core.settings)
|
||||
}
|
@ -20,7 +20,7 @@ package ru.tech.imageresizershrinker.core.ui.widget.activity
|
||||
import dagger.hilt.EntryPoint
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state.GetSettingsStateUseCase
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.use_case.GetSettingsStateUseCase
|
||||
|
||||
@EntryPoint
|
||||
@InstallIn(SingletonComponent::class)
|
||||
|
@ -48,11 +48,10 @@ import ru.tech.imageresizershrinker.core.domain.model.FontFam
|
||||
import ru.tech.imageresizershrinker.core.domain.model.ImageScaleMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.NightMode
|
||||
import ru.tech.imageresizershrinker.core.domain.model.SettingsState
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.domain.saving.FileController
|
||||
import ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state.GetSettingsStateFlowUseCase
|
||||
import ru.tech.imageresizershrinker.core.domain.use_case.get_settings_state.GetSettingsStateUseCase
|
||||
import ru.tech.imageresizershrinker.core.resources.BuildConfig
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.use_case.GetSettingsStateFlowUseCase
|
||||
import ru.tech.imageresizershrinker.core.settings.domain.use_case.GetSettingsStateUseCase
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.state.update
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.other.ToastHostState
|
||||
@ -68,7 +67,7 @@ class MainViewModel @Inject constructor(
|
||||
private val imageGetter: ImageGetter<Bitmap, ExifInterface>,
|
||||
private val fileController: FileController,
|
||||
private val getSettingsStateUseCase: GetSettingsStateUseCase,
|
||||
private val settingsRepository: SettingsRepository
|
||||
private val settingsRepository: ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
) : ViewModel() {
|
||||
|
||||
private val _settingsState = mutableStateOf(SettingsState.Default)
|
||||
|
@ -31,7 +31,6 @@ import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import ru.tech.imageresizershrinker.core.domain.repository.SettingsRepository
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.state.update
|
||||
import ru.tech.imageresizershrinker.feature.recognize.text.domain.DownloadData
|
||||
import ru.tech.imageresizershrinker.feature.recognize.text.domain.ImageTextReader
|
||||
@ -46,7 +45,7 @@ import javax.inject.Inject
|
||||
@HiltViewModel
|
||||
class RecognizeTextViewModel @Inject constructor(
|
||||
private val imageTextReader: ImageTextReader<Bitmap>,
|
||||
private val settingsRepository: SettingsRepository
|
||||
private val settingsRepository: ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
|
||||
) : ViewModel() {
|
||||
|
||||
private val _segmentationMode: MutableState<SegmentationMode> =
|
||||
|
@ -17,6 +17,9 @@
|
||||
|
||||
@file:Suppress("UnstableApiUsage")
|
||||
|
||||
include(":core:settings")
|
||||
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
includeBuild("build-logic")
|
||||
|
Reference in New Issue
Block a user