From 4bb583e7d9e569f749411f29ba816318d4367547 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 9 Aug 2024 10:38:10 +1000 Subject: [PATCH 1/5] Moved to the new Cropping library v4.3.3 --- app/build.gradle | 2 +- .../securesms/avatar/AvatarSelection.kt | 40 +++++++------- .../securesms/preferences/SettingsActivity.kt | 54 ++++++++++++++----- 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 90202707e3..4da9ed5ebe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -284,7 +284,7 @@ dependencies { implementation 'com.pnikosis:materialish-progress:1.5' implementation 'org.greenrobot:eventbus:3.0.0' implementation 'pl.tajchert:waitingdots:0.1.0' - implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' + implementation 'com.vanniktech:android-image-cropper:4.3.3' implementation 'com.melnykov:floatingactionbutton:1.3.0' implementation 'com.google.zxing:android-integration:3.1.0' implementation 'mobi.upod:time-duration-picker:1.1.3' diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt index 2907821081..6b712ff67d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt @@ -8,10 +8,14 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.provider.MediaStore +import androidx.activity.result.ActivityResultLauncher import androidx.annotation.StringRes import androidx.core.content.ContextCompat -import com.theartofdev.edmodo.cropper.CropImage -import com.theartofdev.edmodo.cropper.CropImageView +import com.canhub.cropper.CropImage +import com.canhub.cropper.CropImageContract +import com.canhub.cropper.CropImageContractOptions +import com.canhub.cropper.CropImageView +import com.canhub.cropper.options import network.loki.messenger.R import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir import org.session.libsignal.utilities.Log @@ -25,32 +29,30 @@ import java.util.LinkedList object AvatarSelection { private val TAG: String = AvatarSelection::class.java.simpleName - const val REQUEST_CODE_CROP_IMAGE: Int = CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE - const val REQUEST_CODE_AVATAR: Int = REQUEST_CODE_CROP_IMAGE + 1 + const val REQUEST_CODE_IMAGE_PICK: Int = 888 /** * Returns result on [.REQUEST_CODE_CROP_IMAGE] */ fun circularCropImage( activity: Activity, + launcher: ActivityResultLauncher, inputFile: Uri?, outputFile: Uri?, @StringRes title: Int ) { - CropImage.activity(inputFile) - .setGuidelines(CropImageView.Guidelines.ON) - .setAspectRatio(1, 1) - .setCropShape(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CropImageView.CropShape.RECTANGLE else CropImageView.CropShape.OVAL) - .setOutputUri(outputFile) - .setAllowRotation(true) - .setAllowFlipping(true) - .setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background)) - .setActivityTitle(activity.getString(title)) - .start(activity) - } - - fun getResultUri(data: Intent?): Uri { - return CropImage.getActivityResult(data).uri + launcher.launch( + options(inputFile) { + setGuidelines(CropImageView.Guidelines.ON) + setAspectRatio(1, 1) + setCropShape(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CropImageView.CropShape.RECTANGLE else CropImageView.CropShape.OVAL) + setOutputUri(outputFile) + setAllowRotation(true) + setAllowFlipping(true) + setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background)) + setActivityTitle(activity.getString(title)) + } + ) } /** @@ -80,7 +82,7 @@ object AvatarSelection { } val chooserIntent = createAvatarSelectionIntent(activity, captureFile, includeClear) - activity.startActivityForResult(chooserIntent, REQUEST_CODE_AVATAR) + activity.startActivityForResult(chooserIntent, REQUEST_CODE_IMAGE_PICK) return captureFile } diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt index dc1011d970..7cc98b22f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt @@ -34,6 +34,8 @@ import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.canhub.cropper.CropImage +import com.canhub.cropper.CropImageContract import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose @@ -109,6 +111,36 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { private val hexEncodedPublicKey: String get() = TextSecurePreferences.getLocalNumber(this)!! + private val onAvatarCropped = registerForActivityResult(CropImageContract()) { result -> + when { + result.isSuccessful -> { + Log.i(TAG, result.getUriFilePath(this).toString()) + + lifecycleScope.launch(Dispatchers.IO) { + try { + val profilePictureToBeUploaded = + BitmapUtil.createScaledBytes( + this@SettingsActivity, + result.getUriFilePath(this@SettingsActivity).toString(), + ProfileMediaConstraints() + ).bitmap + launch(Dispatchers.Main) { + updateProfilePicture(profilePictureToBeUploaded) + } + } catch (e: BitmapDecodingException) { + Log.e(TAG, e) + } + } + } + result is CropImage.CancelledResult -> { + Log.i(TAG, "Cropping image was cancelled by the user") + } + else -> { + Log.e(TAG, "Cropping image failed") + } + } + } + companion object { private const val SCROLL_STATE = "SCROLL_STATE" } @@ -186,22 +218,16 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { super.onActivityResult(requestCode, resultCode, data) if (resultCode != Activity.RESULT_OK) return when (requestCode) { - AvatarSelection.REQUEST_CODE_AVATAR -> { + AvatarSelection.REQUEST_CODE_IMAGE_PICK -> { val outputFile = Uri.fromFile(File(cacheDir, "cropped")) val inputFile: Uri? = data?.data ?: tempFile?.let(Uri::fromFile) - AvatarSelection.circularCropImage(this, inputFile, outputFile, R.string.CropImageActivity_profile_avatar) - } - AvatarSelection.REQUEST_CODE_CROP_IMAGE -> { - lifecycleScope.launch(Dispatchers.IO) { - try { - val profilePictureToBeUploaded = BitmapUtil.createScaledBytes(this@SettingsActivity, AvatarSelection.getResultUri(data), ProfileMediaConstraints()).bitmap - launch(Dispatchers.Main) { - updateProfilePicture(profilePictureToBeUploaded) - } - } catch (e: BitmapDecodingException) { - Log.e(TAG, e) - } - } + AvatarSelection.circularCropImage( + activity = this, + launcher = onAvatarCropped, + inputFile = inputFile, + outputFile = outputFile, + title = R.string.CropImageActivity_profile_avatar + ) } } } From 6fff1e18321b799df25108ec248617a00227a2fa Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 9 Aug 2024 11:08:04 +1000 Subject: [PATCH 2/5] Better styling --- .../org/thoughtcrime/securesms/avatar/AvatarSelection.kt | 7 +++++-- .../thoughtcrime/securesms/preferences/SettingsActivity.kt | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt index 6b712ff67d..d4184cd32d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt @@ -39,17 +39,20 @@ object AvatarSelection { launcher: ActivityResultLauncher, inputFile: Uri?, outputFile: Uri?, - @StringRes title: Int + @StringRes title: Int, + bgColor: Int ) { launcher.launch( options(inputFile) { setGuidelines(CropImageView.Guidelines.ON) setAspectRatio(1, 1) - setCropShape(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CropImageView.CropShape.RECTANGLE else CropImageView.CropShape.OVAL) + setCropShape(CropImageView.CropShape.OVAL) setOutputUri(outputFile) setAllowRotation(true) setAllowFlipping(true) setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background)) + setToolbarColor(bgColor) + setActivityBackgroundColor(bgColor) setActivityTitle(activity.getString(title)) } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt index 7cc98b22f1..dac2329f5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt @@ -61,6 +61,7 @@ import org.session.libsession.utilities.ProfileKeyUtil import org.session.libsession.utilities.ProfilePictureUtilities import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol import org.session.libsession.utilities.TextSecurePreferences +import org.session.libsession.utilities.getColorFromAttr import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.truncateIdForDisplay import org.session.libsignal.utilities.Log @@ -111,6 +112,8 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { private val hexEncodedPublicKey: String get() = TextSecurePreferences.getLocalNumber(this)!! + private val bgColor by lazy { getColorFromAttr(android.R.attr.colorPrimary) } + private val onAvatarCropped = registerForActivityResult(CropImageContract()) { result -> when { result.isSuccessful -> { @@ -226,7 +229,8 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { launcher = onAvatarCropped, inputFile = inputFile, outputFile = outputFile, - title = R.string.CropImageActivity_profile_avatar + title = R.string.CropImageActivity_profile_avatar, + bgColor = bgColor ) } } From cab8c03a8414686940c0425f385ba7835c780f60 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 9 Aug 2024 11:14:50 +1000 Subject: [PATCH 3/5] Better styling --- .../java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt | 4 +++- .../thoughtcrime/securesms/preferences/SettingsActivity.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt index d4184cd32d..d84bc9508c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt @@ -40,7 +40,8 @@ object AvatarSelection { inputFile: Uri?, outputFile: Uri?, @StringRes title: Int, - bgColor: Int + bgColor: Int, + txtColor: Int ) { launcher.launch( options(inputFile) { @@ -53,6 +54,7 @@ object AvatarSelection { setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background)) setToolbarColor(bgColor) setActivityBackgroundColor(bgColor) + setToolbarTintColor(txtColor) setActivityTitle(activity.getString(title)) } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt index dac2329f5d..b6ba9730ce 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt @@ -113,6 +113,7 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { private val hexEncodedPublicKey: String get() = TextSecurePreferences.getLocalNumber(this)!! private val bgColor by lazy { getColorFromAttr(android.R.attr.colorPrimary) } + private val txtColor by lazy { getColorFromAttr(android.R.attr.textColorPrimary) } private val onAvatarCropped = registerForActivityResult(CropImageContract()) { result -> when { @@ -230,7 +231,8 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { inputFile = inputFile, outputFile = outputFile, title = R.string.CropImageActivity_profile_avatar, - bgColor = bgColor + bgColor = bgColor, + txtColor = txtColor ) } } From fea17d77a114e668d4e35ce8d8c220dddc3fd583 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 9 Aug 2024 12:32:15 +1000 Subject: [PATCH 4/5] Cleaning up styling and using registerForActivityResult --- .../securesms/avatar/AvatarSelection.kt | 32 ++++++------ .../securesms/preferences/SettingsActivity.kt | 51 +++++++++---------- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt index d84bc9508c..961700089a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt @@ -6,17 +6,14 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri -import android.os.Build import android.provider.MediaStore import androidx.activity.result.ActivityResultLauncher -import androidx.annotation.StringRes import androidx.core.content.ContextCompat -import com.canhub.cropper.CropImage -import com.canhub.cropper.CropImageContract import com.canhub.cropper.CropImageContractOptions import com.canhub.cropper.CropImageView import com.canhub.cropper.options import network.loki.messenger.R +import org.session.libsession.utilities.getColorFromAttr import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.NoExternalStorageException @@ -26,24 +23,26 @@ import java.io.File import java.io.IOException import java.util.LinkedList -object AvatarSelection { +class AvatarSelection( + private val activity: Activity, + private val onAvatarCropped: ActivityResultLauncher, + private val onPickImage: ActivityResultLauncher +) { private val TAG: String = AvatarSelection::class.java.simpleName - const val REQUEST_CODE_IMAGE_PICK: Int = 888 + private val bgColor by lazy { activity.getColorFromAttr(android.R.attr.colorPrimary) } + private val txtColor by lazy { activity.getColorFromAttr(android.R.attr.textColorPrimary) } + private val imageScrim by lazy { ContextCompat.getColor(activity, R.color.avatar_background) } + private val activityTitle by lazy { activity.getString(R.string.CropImageActivity_profile_avatar) } /** * Returns result on [.REQUEST_CODE_CROP_IMAGE] */ fun circularCropImage( - activity: Activity, - launcher: ActivityResultLauncher, inputFile: Uri?, - outputFile: Uri?, - @StringRes title: Int, - bgColor: Int, - txtColor: Int + outputFile: Uri? ) { - launcher.launch( + onAvatarCropped.launch( options(inputFile) { setGuidelines(CropImageView.Guidelines.ON) setAspectRatio(1, 1) @@ -51,11 +50,11 @@ object AvatarSelection { setOutputUri(outputFile) setAllowRotation(true) setAllowFlipping(true) - setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background)) + setBackgroundColor(imageScrim) setToolbarColor(bgColor) setActivityBackgroundColor(bgColor) setToolbarTintColor(txtColor) - setActivityTitle(activity.getString(title)) + setActivityTitle(activityTitle) } ) } @@ -66,7 +65,6 @@ object AvatarSelection { * @return Temporary capture file if created. */ fun startAvatarSelection( - activity: Activity, includeClear: Boolean, attemptToIncludeCamera: Boolean ): File? { @@ -87,7 +85,7 @@ object AvatarSelection { } val chooserIntent = createAvatarSelectionIntent(activity, captureFile, includeClear) - activity.startActivityForResult(chooserIntent, REQUEST_CODE_IMAGE_PICK) + onPickImage.launch(chooserIntent) return captureFile } diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt index b6ba9730ce..d8d8a4172d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt @@ -18,6 +18,7 @@ import android.view.View import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -61,7 +62,6 @@ import org.session.libsession.utilities.ProfileKeyUtil import org.session.libsession.utilities.ProfilePictureUtilities import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol import org.session.libsession.utilities.TextSecurePreferences -import org.session.libsession.utilities.getColorFromAttr import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.truncateIdForDisplay import org.session.libsignal.utilities.Log @@ -81,12 +81,12 @@ import org.thoughtcrime.securesms.ui.Cell import org.thoughtcrime.securesms.ui.Divider import org.thoughtcrime.securesms.ui.LargeItemButton import org.thoughtcrime.securesms.ui.LargeItemButtonWithDrawable -import org.thoughtcrime.securesms.ui.theme.LocalDimensions -import org.thoughtcrime.securesms.ui.theme.dangerButtonColors import org.thoughtcrime.securesms.ui.components.PrimaryOutlineButton import org.thoughtcrime.securesms.ui.components.PrimaryOutlineCopyButton import org.thoughtcrime.securesms.ui.contentDescription import org.thoughtcrime.securesms.ui.setThemedContent +import org.thoughtcrime.securesms.ui.theme.LocalDimensions +import org.thoughtcrime.securesms.ui.theme.dangerButtonColors import org.thoughtcrime.securesms.util.BitmapDecodingException import org.thoughtcrime.securesms.util.BitmapUtil import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities @@ -112,9 +112,6 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { private val hexEncodedPublicKey: String get() = TextSecurePreferences.getLocalNumber(this)!! - private val bgColor by lazy { getColorFromAttr(android.R.attr.colorPrimary) } - private val txtColor by lazy { getColorFromAttr(android.R.attr.textColorPrimary) } - private val onAvatarCropped = registerForActivityResult(CropImageContract()) { result -> when { result.isSuccessful -> { @@ -145,6 +142,18 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { } } + private val onPickImage = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ){ result -> + if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult + + val outputFile = Uri.fromFile(File(cacheDir, "cropped")) + val inputFile: Uri? = result.data?.data ?: tempFile?.let(Uri::fromFile) + cropImage(inputFile, outputFile) + } + + private val avatarSelection = AvatarSelection(this, onAvatarCropped, onPickImage) + companion object { private const val SCROLL_STATE = "SCROLL_STATE" } @@ -217,27 +226,6 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { } } - @Deprecated("Deprecated in Java") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode != Activity.RESULT_OK) return - when (requestCode) { - AvatarSelection.REQUEST_CODE_IMAGE_PICK -> { - val outputFile = Uri.fromFile(File(cacheDir, "cropped")) - val inputFile: Uri? = data?.data ?: tempFile?.let(Uri::fromFile) - AvatarSelection.circularCropImage( - activity = this, - launcher = onAvatarCropped, - inputFile = inputFile, - outputFile = outputFile, - title = R.string.CropImageActivity_profile_avatar, - bgColor = bgColor, - txtColor = txtColor - ) - } - } - } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults) @@ -439,10 +427,17 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { Permissions.with(this) .request(Manifest.permission.CAMERA) .onAnyResult { - tempFile = AvatarSelection.startAvatarSelection(this, false, true) + tempFile = avatarSelection.startAvatarSelection( false, true) } .execute() } + + private fun cropImage(inputFile: Uri?, outputFile: Uri?){ + avatarSelection.circularCropImage( + inputFile = inputFile, + outputFile = outputFile, + ) + } // endregion private inner class DisplayNameEditActionModeCallback: ActionMode.Callback { From 2aeb7698155a71341e7653c39b1c6e2ea1fdcef4 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 9 Aug 2024 12:51:29 +1000 Subject: [PATCH 5/5] Upgraded to 4.5.0 (we can't use 4.6.0 yet due to kotlin 2.0 usage) --- app/build.gradle | 2 +- .../securesms/avatar/AvatarSelection.kt | 37 ++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4da9ed5ebe..f72856553d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -284,7 +284,7 @@ dependencies { implementation 'com.pnikosis:materialish-progress:1.5' implementation 'org.greenrobot:eventbus:3.0.0' implementation 'pl.tajchert:waitingdots:0.1.0' - implementation 'com.vanniktech:android-image-cropper:4.3.3' + implementation 'com.vanniktech:android-image-cropper:4.5.0' implementation 'com.melnykov:floatingactionbutton:1.3.0' implementation 'com.google.zxing:android-integration:3.1.0' implementation 'mobi.upod:time-duration-picker:1.1.3' diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt index 961700089a..adf4b0927c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.kt @@ -10,8 +10,8 @@ import android.provider.MediaStore import androidx.activity.result.ActivityResultLauncher import androidx.core.content.ContextCompat import com.canhub.cropper.CropImageContractOptions +import com.canhub.cropper.CropImageOptions import com.canhub.cropper.CropImageView -import com.canhub.cropper.options import network.loki.messenger.R import org.session.libsession.utilities.getColorFromAttr import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir @@ -43,19 +43,28 @@ class AvatarSelection( outputFile: Uri? ) { onAvatarCropped.launch( - options(inputFile) { - setGuidelines(CropImageView.Guidelines.ON) - setAspectRatio(1, 1) - setCropShape(CropImageView.CropShape.OVAL) - setOutputUri(outputFile) - setAllowRotation(true) - setAllowFlipping(true) - setBackgroundColor(imageScrim) - setToolbarColor(bgColor) - setActivityBackgroundColor(bgColor) - setToolbarTintColor(txtColor) - setActivityTitle(activityTitle) - } + CropImageContractOptions( + uri = inputFile, + cropImageOptions = CropImageOptions( + guidelines = CropImageView.Guidelines.ON, + aspectRatioX = 1, + aspectRatioY = 1, + fixAspectRatio = true, + cropShape = CropImageView.CropShape.OVAL, + customOutputUri = outputFile, + allowRotation = true, + allowFlipping = true, + backgroundColor = imageScrim, + toolbarColor = bgColor, + activityBackgroundColor = bgColor, + toolbarTintColor = txtColor, + toolbarBackButtonColor = txtColor, + toolbarTitleColor = txtColor, + activityMenuIconColor = txtColor, + activityMenuTextColor = txtColor, + activityTitle = activityTitle + ) + ) ) }