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 } } }