Skip to content

Commit

Permalink
Template filters finished by #1097, also mastered saving to uri
Browse files Browse the repository at this point in the history
  • Loading branch information
T8RIN committed May 25, 2024
1 parent 9b4abd3 commit 96c6f4e
Show file tree
Hide file tree
Showing 23 changed files with 202 additions and 356 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import ru.tech.imageresizershrinker.core.domain.saving.model.ImageSaveTarget
import ru.tech.imageresizershrinker.core.domain.saving.use
import ru.tech.imageresizershrinker.core.resources.R
import java.io.File
import java.io.FileOutputStream
import javax.inject.Inject

internal class AndroidShareProvider @Inject constructor(
Expand Down Expand Up @@ -155,44 +154,22 @@ internal class AndroidShareProvider @Inject constructor(
byteArray: ByteArray,
filename: String
): String? = withContext(ioDispatcher) {
val imagesFolder = File(context.cacheDir, "files")

runCatching {
imagesFolder.mkdirs()
val file = File(imagesFolder, filename)
FileOutputStream(file).use {
it.write(byteArray)
}
FileProvider.getUriForFile(context, context.getString(R.string.file_provider), file)
.also { uri ->
runCatching {
context.grantUriPermission(
context.packageName,
uri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
}
}.getOrNull()?.toString()
cacheData(
writeData = { it.writeBytes(byteArray) },
filename = filename,
)
}

override suspend fun shareByteArray(
byteArray: ByteArray,
filename: String,
onComplete: () -> Unit
) = withContext(ioDispatcher) {
cacheByteArray(
byteArray = byteArray,
filename = filename
)?.let {
shareUri(
uri = it,
type = MimeTypeMap.getSingleton()
.getMimeTypeFromExtension(
imageGetter.getExtension(it)
) ?: "*/*"
)
}
shareData(
writeData = { it.writeBytes(byteArray) },
filename = filename,
onComplete = onComplete
)
onComplete()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -503,15 +503,22 @@ internal class AndroidFileController @Inject constructor(

override suspend fun writeBytes(
uri: String,
onError: (Throwable) -> Unit,
block: suspend (Writeable) -> Unit,
) {
context.openWriteableStream(
uri = uri.toUri(),
onError = onError
)?.let { stream ->
StreamWriteable(stream).use { block(it) }
): SaveResult {
runCatching {
context.openWriteableStream(
uri = uri.toUri(),
onError = { throw it }
)?.let { stream ->
StreamWriteable(stream).use { block(it) }
}
}.onSuccess {
return SaveResult.Success(null, "")
}.onFailure {
return SaveResult.Error.Exception(it)
}

return SaveResult.Error.Exception(IllegalStateException())
}

private fun Context.openWriteableStream(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ import ru.tech.imageresizershrinker.core.domain.saving.Writeable
import java.io.File
import java.io.FileOutputStream

class FileWriteable(
private val file: File
) : Writeable {
internal class FileWriteable(file: File) : Writeable {

private val stream = FileOutputStream(file)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ package ru.tech.imageresizershrinker.core.data.saving
import ru.tech.imageresizershrinker.core.domain.saving.Writeable
import java.io.OutputStream

class StreamWriteable(
internal class StreamWriteable(
private val stream: OutputStream
) : Writeable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ interface FileController {

suspend fun writeBytes(
uri: String,
onError: (Throwable) -> Unit = {},
block: suspend (Writeable) -> Unit
)
): SaveResult
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import ru.tech.imageresizershrinker.core.ui.utils.permission.PermissionUtils.has
import ru.tech.imageresizershrinker.core.ui.utils.permission.PermissionUtils.setPermissionsAllowed
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.OutputStream
import java.util.Locale


Expand Down Expand Up @@ -320,19 +319,6 @@ object ContextUtils {
}.getOrNull()
}

fun Context.openWriteableStream(
uri: Uri?,
onError: (Throwable) -> Unit
): OutputStream? = uri?.let {
runCatching {
contentResolver.openOutputStream(uri, "rw")
}.getOrElse {
runCatching {
contentResolver.openOutputStream(uri, "w")
}.onFailure(onError).getOrNull()
}
}

fun Context.getLanguages(): Map<String, String> {
val languages = mutableListOf("" to getString(R.string.system)).apply {
addAll(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,33 @@ fun Context.parseSaveResult(
}
}

fun Context.parseFileSaveResult(
saveResult: SaveResult,
onSuccess: suspend () -> Unit,
toastHostState: ToastHostState,
scope: CoroutineScope
) {
if (saveResult is SaveResult.Error.Exception) {
scope.launch {
toastHostState.showError(this@parseFileSaveResult, saveResult.throwable)
}
} else if (saveResult is SaveResult.Success) {
scope.launch {
onSuccess()
}
scope.launch {
toastHostState.showToast(
getString(
R.string.saved_to_without_filename,
""
),
Icons.Rounded.Save
)
showReview(this@parseFileSaveResult)
}
}
}

fun Activity.parseSaveResults(
scope: CoroutineScope,
results: List<SaveResult>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.FolderOff
import androidx.compose.material.icons.outlined.SelectAll
import androidx.compose.material.icons.rounded.Close
import androidx.compose.material.icons.rounded.Save
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
Expand Down Expand Up @@ -88,11 +87,10 @@ import ru.tech.imageresizershrinker.core.resources.icons.Jxl
import ru.tech.imageresizershrinker.core.settings.presentation.provider.LocalSettingsState
import ru.tech.imageresizershrinker.core.ui.utils.confetti.LocalConfettiHostState
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.getFilename
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.openWriteableStream
import ru.tech.imageresizershrinker.core.ui.utils.helper.Picker
import ru.tech.imageresizershrinker.core.ui.utils.helper.ReviewHandler
import ru.tech.imageresizershrinker.core.ui.utils.helper.isPortraitOrientationAsState
import ru.tech.imageresizershrinker.core.ui.utils.helper.localImagePickerMode
import ru.tech.imageresizershrinker.core.ui.utils.helper.parseFileSaveResult
import ru.tech.imageresizershrinker.core.ui.utils.helper.parseSaveResults
import ru.tech.imageresizershrinker.core.ui.utils.helper.rememberImagePicker
import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen
Expand All @@ -114,7 +112,6 @@ import ru.tech.imageresizershrinker.core.ui.widget.other.LoadingDialog
import ru.tech.imageresizershrinker.core.ui.widget.other.LocalToastHostState
import ru.tech.imageresizershrinker.core.ui.widget.other.ToastDuration
import ru.tech.imageresizershrinker.core.ui.widget.other.TopAppBarEmoji
import ru.tech.imageresizershrinker.core.ui.widget.other.showError
import ru.tech.imageresizershrinker.core.ui.widget.preferences.PreferenceItem
import ru.tech.imageresizershrinker.core.ui.widget.text.TopAppBarTitle
import ru.tech.imageresizershrinker.feature.apng_tools.presentation.components.ApngParamsSelector
Expand Down Expand Up @@ -210,37 +207,19 @@ fun ApngToolsScreen(
}
}

val writeDenied: (Throwable) -> Unit = {
scope.launch {
toastHostState.showError(context, it)
}
}
val saveApngLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.CreateDocument("image/apng"),
onResult = {
it?.let { uri ->
viewModel.saveApngTo(
outputStream = context.openWriteableStream(uri, writeDenied)
) { t ->
if (t != null) {
scope.launch {
toastHostState.showError(context, t)
}
} else {
scope.launch {
viewModel.saveApngTo(uri) { result ->
context.parseFileSaveResult(
saveResult = result,
onSuccess = {
confettiHostState.showConfetti()
}
scope.launch {
toastHostState.showToast(
context.getString(
R.string.saved_to_without_filename,
""
),
Icons.Rounded.Save
)
ReviewHandler.showReview(context)
}
}
},
toastHostState = toastHostState,
scope = scope
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen
import ru.tech.imageresizershrinker.core.ui.utils.state.update
import ru.tech.imageresizershrinker.feature.apng_tools.domain.ApngConverter
import ru.tech.imageresizershrinker.feature.apng_tools.domain.ApngParams
import java.io.OutputStream
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
Expand Down Expand Up @@ -177,16 +176,17 @@ class ApngToolsViewModel @Inject constructor(
}

fun saveApngTo(
outputStream: OutputStream?,
onComplete: (Throwable?) -> Unit
uri: Uri,
onResult: (SaveResult) -> Unit
) {
savingJob = viewModelScope.launch(defaultDispatcher) {
_isSaving.value = true
kotlin.runCatching {
outputStream?.use {
it.write(apngData)
}
}.exceptionOrNull().let(onComplete)
apngData?.let { byteArray ->
fileController.writeBytes(
uri = uri.toString(),
block = { it.writeBytes(byteArray) }
).also(onResult).onSuccess(::registerSave)
}
_isSaving.value = false
apngData = null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.FileDownload
import androidx.compose.material.icons.rounded.FileOpen
import androidx.compose.material.icons.rounded.FolderOpen
import androidx.compose.material.icons.rounded.Save
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.Shuffle
import androidx.compose.material.icons.twotone.FileOpen
Expand Down Expand Up @@ -113,10 +112,9 @@ import ru.tech.imageresizershrinker.core.ui.theme.Green
import ru.tech.imageresizershrinker.core.ui.theme.outlineVariant
import ru.tech.imageresizershrinker.core.ui.utils.confetti.LocalConfettiHostState
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.getFilename
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.openWriteableStream
import ru.tech.imageresizershrinker.core.ui.utils.helper.ImageUtils.fileSize
import ru.tech.imageresizershrinker.core.ui.utils.helper.ReviewHandler.showReview
import ru.tech.imageresizershrinker.core.ui.utils.helper.isScrollingUp
import ru.tech.imageresizershrinker.core.ui.utils.helper.parseFileSaveResult
import ru.tech.imageresizershrinker.core.ui.widget.buttons.EnhancedButton
import ru.tech.imageresizershrinker.core.ui.widget.buttons.EnhancedFloatingActionButton
import ru.tech.imageresizershrinker.core.ui.widget.buttons.EnhancedIconButton
Expand Down Expand Up @@ -171,37 +169,19 @@ fun FileCipherScreen(
else onGoBack()
}

val writeDenied: (Throwable) -> Unit = {
scope.launch {
toastHostState.showError(context, it)
}
}
val saveLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.CreateDocument("*/*"),
onResult = {
it?.let { uri ->
viewModel.saveCryptographyTo(
outputStream = context.openWriteableStream(uri, writeDenied)
) { t ->
if (t != null) {
scope.launch {
toastHostState.showError(context, t)
}
} else {
scope.launch {
viewModel.saveCryptographyTo(uri) { result ->
context.parseFileSaveResult(
saveResult = result,
onSuccess = {
confettiHostState.showConfetti()
}
scope.launch {
toastHostState.showToast(
context.getString(
R.string.saved_to_without_filename,
""
),
Icons.Rounded.Save
)
showReview(context)
}
}
},
toastHostState = toastHostState,
scope = scope
)
}
}
}
Expand Down
Loading

0 comments on commit 96c6f4e

Please sign in to comment.