Files
mobile-android/app/src/main/java/com/rosetta/messenger/utils/ImageCropHelper.kt

129 lines
5.1 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.rosetta.messenger.utils
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
import android.net.Uri
import androidx.activity.result.ActivityResult
import androidx.core.content.FileProvider
import com.yalantis.ucrop.UCrop
import java.io.File
/**
* Помощник для работы с обрезкой изображений через uCrop
*/
object ImageCropHelper {
private const val CROP_IMAGE_FILE_NAME = "cropped_avatar.png"
/**
* Создает Intent для запуска uCrop
* @param context Контекст
* @param sourceUri URI исходного изображения
* @param isDarkTheme Темная тема
* @return Intent для запуска uCrop Activity
*/
fun createCropIntent(
context: Context,
sourceUri: Uri,
isDarkTheme: Boolean
): Intent {
// Создаем файл для результата crop
val destinationFile = File(context.cacheDir, CROP_IMAGE_FILE_NAME)
val destinationUri = Uri.fromFile(destinationFile)
// Настройки uCrop
val options = UCrop.Options().apply {
// Круглый overlay для аватара
setCircleDimmedLayer(true)
// Показываем сетку
setShowCropGrid(true)
setShowCropFrame(true)
// Цвета в тёмной теме приложения
val backgroundColor = Color.parseColor("#121212") // Основной фон
val toolbarColor = Color.parseColor("#1A1A1A") // Цвет тулбара
val accentColor = Color.parseColor("#0A84FF") // Accent синий
// Toolbar (верхняя панель)
setToolbarColor(toolbarColor)
setStatusBarColor(toolbarColor)
setToolbarWidgetColor(Color.WHITE)
// Основной фон и overlay
setRootViewBackgroundColor(backgroundColor)
setDimmedLayerColor(Color.parseColor("#CC000000"))
// Активные элементы управления
setActiveControlsWidgetColor(accentColor)
// Crop frame цвета
setCropFrameColor(accentColor)
setCropGridColor(Color.parseColor("#66FFFFFF"))
// Нижняя панель (bottom controls) - ставим тёмный фон
setLogoColor(accentColor)
// ВАЖНО: Цвет фона для нижней панели управления
// Устанавливаем тот же цвет что и основной фон
try {
// UCrop использует внутренний метод для установки цвета bottom controls
// Используем рефлексию или доступные методы
val methodSetBottomColor = this::class.java.getMethod("setActiveWidgetColor", Int::class.javaPrimitiveType)
methodSetBottomColor?.invoke(this, accentColor)
} catch (e: Exception) {
// Если метод не найден, ничего не делаем
}
// Цвет иконок на нижней панели
setActiveControlsWidgetColor(accentColor)
// Скрываем кнопку поворота по желанию (можно оставить)
setFreeStyleCropEnabled(false)
// Качество сжатия
setCompressionFormat(Bitmap.CompressFormat.PNG)
setCompressionQuality(100)
// Заголовок
setToolbarTitle("Обрезка фото")
// Показываем bottom controls для rotate/scale
setHideBottomControls(false)
}
return UCrop.of(sourceUri, destinationUri)
.withAspectRatio(1f, 1f) // Квадратный crop для аватара
.withMaxResultSize(512, 512) // Максимальный размер
.withOptions(options)
.getIntent(context)
}
/**
* Извлекает результат crop из ActivityResult
* @param result Результат Activity
* @return URI обрезанного изображения или null при ошибке/отмене
*/
fun getCroppedImageUri(result: ActivityResult): Uri? {
return if (result.resultCode == Activity.RESULT_OK && result.data != null) {
UCrop.getOutput(result.data!!)
} else {
null
}
}
/**
* Получает ошибку crop если есть
*/
fun getCropError(result: ActivityResult): Throwable? {
return if (result.data != null) {
UCrop.getError(result.data!!)
} else {
null
}
}
}