From fea17d77a114e668d4e35ce8d8c220dddc3fd583 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 9 Aug 2024 12:32:15 +1000 Subject: [PATCH] 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 {