Skip to content

Commit

Permalink
Fix for confusing behaviour by File Extension Is Not Updated by #789
Browse files Browse the repository at this point in the history
Fix for Incorrect Toast When Using Replace File by #788
refactored injection and improved some things
  • Loading branch information
T8RIN committed Feb 18, 2024
1 parent f7ce258 commit 9cf380a
Show file tree
Hide file tree
Showing 75 changed files with 559 additions and 663 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ import ru.tech.imageresizershrinker.core.ui.utils.navigation.LocalNavController
import ru.tech.imageresizershrinker.core.ui.widget.UpdateSheet
import ru.tech.imageresizershrinker.core.ui.widget.controls.EnhancedSliderInit
import ru.tech.imageresizershrinker.core.ui.widget.haptics.customHapticFeedback
import ru.tech.imageresizershrinker.core.ui.widget.other.LocalToastHost
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.other.rememberToastHostState
import ru.tech.imageresizershrinker.core.ui.widget.sheets.ProcessImagesPreferenceSheet
Expand Down Expand Up @@ -126,7 +126,7 @@ class AppActivity : M3Activity() {
}

CompositionLocalProvider(
LocalToastHost provides viewModel.toastHostState,
LocalToastHostState provides viewModel.toastHostState,
LocalSettingsState provides viewModel.settingsState.toUiState(
allEmojis = Emoji.allIcons(),
allIconShapes = IconShapesList,
Expand Down Expand Up @@ -229,7 +229,7 @@ class AppActivity : M3Activity() {
} else confettiController.currentToastData?.dismiss()

ToastHost(
hostState = LocalToastHost.current
hostState = LocalToastHostState.current
)

SideEffect {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,11 @@

package ru.tech.imageresizershrinker.core.data.di

import android.content.Context
import android.graphics.Bitmap
import androidx.exifinterface.media.ExifInterface
import coil.ImageLoader
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import ru.tech.imageresizershrinker.core.data.image.AndroidImageCompressor
import ru.tech.imageresizershrinker.core.data.image.AndroidImageGetter
Expand All @@ -38,91 +35,34 @@ 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.saving.FileController
import ru.tech.imageresizershrinker.core.filters.domain.FilterProvider
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
internal object ImageModule {
internal interface ImageModule {

@Singleton
@Provides
fun provideImageManager(
@ApplicationContext context: Context,
imageLoader: ImageLoader
): ImageTransformer<Bitmap> = AndroidImageTransformer(
context = context,
imageLoader = imageLoader
)
@Binds
fun provideImageManager(transformer: AndroidImageTransformer): ImageTransformer<Bitmap>

@Singleton
@Provides
fun provideImageScaler(
settingsRepository: SettingsRepository,
imageTransformer: ImageTransformer<Bitmap>,
filterProvider: FilterProvider<Bitmap>
): ImageScaler<Bitmap> = AndroidImageScaler(
settingsRepository = settingsRepository,
imageTransformer = imageTransformer,
filterProvider = filterProvider
)
@Binds
fun provideImageScaler(scaler: AndroidImageScaler): ImageScaler<Bitmap>

@Singleton
@Provides
fun provideImageCompressor(
@ApplicationContext context: Context,
imageLoader: ImageLoader,
imageTransformer: ImageTransformer<Bitmap>,
imageScaler: ImageScaler<Bitmap>
): ImageCompressor<Bitmap> = AndroidImageCompressor(
context = context,
imageLoader = imageLoader,
imageTransformer = imageTransformer,
imageScaler = imageScaler
)
@Binds
fun provideImageCompressor(compressor: AndroidImageCompressor): ImageCompressor<Bitmap>

@Singleton
@Provides
fun provideImageGetter(
imageLoader: ImageLoader,
@ApplicationContext context: Context,
): ImageGetter<Bitmap, ExifInterface> = AndroidImageGetter(
imageLoader = imageLoader,
context = context
)
@Binds
fun provideImageGetter(getter: AndroidImageGetter): ImageGetter<Bitmap, ExifInterface>

@Singleton
@Provides
fun provideImagePreviewCreator(
@ApplicationContext context: Context,
imageTransformer: ImageTransformer<Bitmap>,
imageGetter: ImageGetter<Bitmap, ExifInterface>,
imageCompressor: ImageCompressor<Bitmap>,
imageScaler: ImageScaler<Bitmap>,
shareProvider: ShareProvider<Bitmap>
): ImagePreviewCreator<Bitmap> = AndroidImagePreviewCreator(
imageTransformer = imageTransformer,
imageGetter = imageGetter,
imageCompressor = imageCompressor,
imageScaler = imageScaler,
shareProvider = shareProvider,
context = context
)
@Binds
fun provideImagePreviewCreator(creator: AndroidImagePreviewCreator): ImagePreviewCreator<Bitmap>

@Singleton
@Provides
fun provideShareProvider(
@ApplicationContext context: Context,
imageCompressor: ImageCompressor<Bitmap>,
imageGetter: ImageGetter<Bitmap, ExifInterface>,
fileController: FileController
): ShareProvider<Bitmap> = AndroidShareProvider(
context = context,
imageGetter = imageGetter,
imageCompressor = imageCompressor,
fileController = fileController
)
@Binds
fun provideShareProvider(provider: AndroidShareProvider): ShareProvider<Bitmap>

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,20 @@

package ru.tech.imageresizershrinker.core.data.di

import android.content.Context
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
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
@InstallIn(SingletonComponent::class)
internal object SavingModule {
internal interface SavingModule {

@Singleton
@Provides
fun provideFileController(
@ApplicationContext context: Context,
settingsRepository: SettingsRepository,
randomStringGenerator: RandomStringGenerator
): FileController = FileControllerImpl(
context = context,
settingsRepository = settingsRepository,
randomStringGenerator = randomStringGenerator
)
@Binds
fun provideFileController(controller: FileControllerImpl): FileController

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ package ru.tech.imageresizershrinker.core.data.image
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
import android.webkit.MimeTypeMap
import androidx.core.content.FileProvider
import androidx.core.net.toUri
import androidx.exifinterface.media.ExifInterface
import coil.ImageLoader
import coil.request.ImageRequest
import coil.size.Size
Expand All @@ -41,13 +43,15 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import ru.tech.imageresizershrinker.core.data.utils.fileSize
import ru.tech.imageresizershrinker.core.domain.image.ImageCompressor
import ru.tech.imageresizershrinker.core.domain.image.ImageGetter
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.model.Quality
import ru.tech.imageresizershrinker.core.domain.model.sizeTo
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
Expand All @@ -57,7 +61,9 @@ internal class AndroidImageCompressor @Inject constructor(
@ApplicationContext private val context: Context,
private val imageLoader: ImageLoader,
private val imageTransformer: ImageTransformer<Bitmap>,
private val imageScaler: ImageScaler<Bitmap>
private val imageScaler: ImageScaler<Bitmap>,
private val imageGetter: ImageGetter<Bitmap, ExifInterface>,
private val settingsRepository: SettingsRepository
) : ImageCompressor<Bitmap> {

override suspend fun compress(
Expand Down Expand Up @@ -218,9 +224,21 @@ internal class AndroidImageCompressor @Inject constructor(
}
} else currentImage = onImageReadyToCompressInterceptor(image)

val extension = MimeTypeMap.getSingleton()
.getMimeTypeFromExtension(
imageInfo.originalUri?.let {
imageGetter.getExtension(it)
}
)

val imageFormat =
if (settingsRepository.getSettingsState().overwriteFiles && extension != null) {
ImageFormat[extension]
} else imageInfo.imageFormat

return@withContext compress(
image = currentImage,
imageFormat = imageInfo.imageFormat,
imageFormat = imageFormat,
quality = imageInfo.quality
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package ru.tech.imageresizershrinker.core.data.saving

import android.Manifest
import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.ContentValues
Expand All @@ -36,6 +37,7 @@ import androidx.core.net.toUri
import androidx.documentfile.provider.DocumentFile
import androidx.exifinterface.media.ExifInterface
import com.t8rin.logger.makeLog
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -63,7 +65,7 @@ import kotlin.random.Random


internal class FileControllerImpl @Inject constructor(
private val context: Context,
@ApplicationContext private val context: Context,
private val settingsRepository: SettingsRepository,
private val randomStringGenerator: RandomStringGenerator
) : FileController {
Expand Down Expand Up @@ -136,6 +138,7 @@ internal class FileControllerImpl @Inject constructor(
}.getOrNull()
} ?: default

@SuppressLint("StringFormatInvalid")
override suspend fun save(
saveTarget: SaveTarget,
keepMetadata: Boolean
Expand Down Expand Up @@ -259,12 +262,19 @@ internal class FileControllerImpl @Inject constructor(
val filename = newSaveTarget.filename ?: ""

return SaveResult.Success(
if (savingPath.isNotEmpty() && filename.isNotEmpty()) {
context.getString(
R.string.saved_to,
savingPath,
filename
)
if (savingPath.isNotEmpty()) {
if (filename.isNotEmpty()) {
context.getString(
R.string.saved_to,
savingPath,
filename
)
} else {
context.getString(
R.string.saved_to_without_filename,
savingPath
)
}
} else null
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ sealed interface SaveResult {

sealed interface Error : SaveResult {
data object MissingPermissions : Error
class Exception(val throwable: Throwable) : Error
data class Exception(val throwable: Throwable) : Error
}
}
2 changes: 2 additions & 0 deletions core/resources/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -796,4 +796,6 @@
<string name="transition">Transition</string>
<string name="peak">Peak</string>
<string name="color_anomaly">Color Anomaly</string>
<string name="images_overwritten">Images overwritten at original destination</string>
<string name="cannot_change_image_format">Cannot change image format while overwrite files option enabled</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,9 @@

package ru.tech.imageresizershrinker.core.settings.di

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import ru.tech.imageresizershrinker.core.settings.data.SettingsRepositoryImpl
import ru.tech.imageresizershrinker.core.settings.domain.SettingsRepository
Expand All @@ -32,13 +28,10 @@ import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object SettingsModule {
internal interface SettingsModule {

@Singleton
@Provides
fun provideSettingsRepository(
@ApplicationContext context: Context,
dataStore: DataStore<Preferences>
): SettingsRepository = SettingsRepositoryImpl(context, dataStore)
@Binds
fun provideSettingsRepository(repositoryImpl: SettingsRepositoryImpl): SettingsRepository

}
Loading

0 comments on commit 9cf380a

Please sign in to comment.