129 lines
5.1 KiB
Kotlin
129 lines
5.1 KiB
Kotlin
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
|
||
}
|
||
}
|
||
}
|