Cleaning up styling and using registerForActivityResult

This commit is contained in:
ThomasSession 2024-08-09 12:32:15 +10:00
parent cab8c03a84
commit fea17d77a1
2 changed files with 38 additions and 45 deletions

View File

@ -6,17 +6,14 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Build
import android.provider.MediaStore import android.provider.MediaStore
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.canhub.cropper.CropImage
import com.canhub.cropper.CropImageContract
import com.canhub.cropper.CropImageContractOptions import com.canhub.cropper.CropImageContractOptions
import com.canhub.cropper.CropImageView import com.canhub.cropper.CropImageView
import com.canhub.cropper.options import com.canhub.cropper.options
import network.loki.messenger.R import network.loki.messenger.R
import org.session.libsession.utilities.getColorFromAttr
import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir import org.session.libsignal.utilities.ExternalStorageUtil.getImageDir
import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.NoExternalStorageException import org.session.libsignal.utilities.NoExternalStorageException
@ -26,24 +23,26 @@ import java.io.File
import java.io.IOException import java.io.IOException
import java.util.LinkedList import java.util.LinkedList
object AvatarSelection { class AvatarSelection(
private val activity: Activity,
private val onAvatarCropped: ActivityResultLauncher<CropImageContractOptions>,
private val onPickImage: ActivityResultLauncher<Intent>
) {
private val TAG: String = AvatarSelection::class.java.simpleName 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] * Returns result on [.REQUEST_CODE_CROP_IMAGE]
*/ */
fun circularCropImage( fun circularCropImage(
activity: Activity,
launcher: ActivityResultLauncher<CropImageContractOptions>,
inputFile: Uri?, inputFile: Uri?,
outputFile: Uri?, outputFile: Uri?
@StringRes title: Int,
bgColor: Int,
txtColor: Int
) { ) {
launcher.launch( onAvatarCropped.launch(
options(inputFile) { options(inputFile) {
setGuidelines(CropImageView.Guidelines.ON) setGuidelines(CropImageView.Guidelines.ON)
setAspectRatio(1, 1) setAspectRatio(1, 1)
@ -51,11 +50,11 @@ object AvatarSelection {
setOutputUri(outputFile) setOutputUri(outputFile)
setAllowRotation(true) setAllowRotation(true)
setAllowFlipping(true) setAllowFlipping(true)
setBackgroundColor(ContextCompat.getColor(activity, R.color.avatar_background)) setBackgroundColor(imageScrim)
setToolbarColor(bgColor) setToolbarColor(bgColor)
setActivityBackgroundColor(bgColor) setActivityBackgroundColor(bgColor)
setToolbarTintColor(txtColor) setToolbarTintColor(txtColor)
setActivityTitle(activity.getString(title)) setActivityTitle(activityTitle)
} }
) )
} }
@ -66,7 +65,6 @@ object AvatarSelection {
* @return Temporary capture file if created. * @return Temporary capture file if created.
*/ */
fun startAvatarSelection( fun startAvatarSelection(
activity: Activity,
includeClear: Boolean, includeClear: Boolean,
attemptToIncludeCamera: Boolean attemptToIncludeCamera: Boolean
): File? { ): File? {
@ -87,7 +85,7 @@ object AvatarSelection {
} }
val chooserIntent = createAvatarSelectionIntent(activity, captureFile, includeClear) val chooserIntent = createAvatarSelectionIntent(activity, captureFile, includeClear)
activity.startActivityForResult(chooserIntent, REQUEST_CODE_IMAGE_PICK) onPickImage.launch(chooserIntent)
return captureFile return captureFile
} }

View File

@ -18,6 +18,7 @@ import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.Crossfade import androidx.compose.animation.Crossfade
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column 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.ProfilePictureUtilities
import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.getColorFromAttr
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
import org.session.libsession.utilities.truncateIdForDisplay import org.session.libsession.utilities.truncateIdForDisplay
import org.session.libsignal.utilities.Log 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.Divider
import org.thoughtcrime.securesms.ui.LargeItemButton import org.thoughtcrime.securesms.ui.LargeItemButton
import org.thoughtcrime.securesms.ui.LargeItemButtonWithDrawable 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.PrimaryOutlineButton
import org.thoughtcrime.securesms.ui.components.PrimaryOutlineCopyButton import org.thoughtcrime.securesms.ui.components.PrimaryOutlineCopyButton
import org.thoughtcrime.securesms.ui.contentDescription import org.thoughtcrime.securesms.ui.contentDescription
import org.thoughtcrime.securesms.ui.setThemedContent 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.BitmapDecodingException
import org.thoughtcrime.securesms.util.BitmapUtil import org.thoughtcrime.securesms.util.BitmapUtil
import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities
@ -112,9 +112,6 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
private val hexEncodedPublicKey: String get() = TextSecurePreferences.getLocalNumber(this)!! 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 -> private val onAvatarCropped = registerForActivityResult(CropImageContract()) { result ->
when { when {
result.isSuccessful -> { 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 { companion object {
private const val SCROLL_STATE = "SCROLL_STATE" 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<out String>, grantResults: IntArray) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults)
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults) Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults)
@ -439,10 +427,17 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
Permissions.with(this) Permissions.with(this)
.request(Manifest.permission.CAMERA) .request(Manifest.permission.CAMERA)
.onAnyResult { .onAnyResult {
tempFile = AvatarSelection.startAvatarSelection(this, false, true) tempFile = avatarSelection.startAvatarSelection( false, true)
} }
.execute() .execute()
} }
private fun cropImage(inputFile: Uri?, outputFile: Uri?){
avatarSelection.circularCropImage(
inputFile = inputFile,
outputFile = outputFile,
)
}
// endregion // endregion
private inner class DisplayNameEditActionModeCallback: ActionMode.Callback { private inner class DisplayNameEditActionModeCallback: ActionMode.Callback {