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.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<CropImageContractOptions>,
private val onPickImage: ActivityResultLauncher<Intent>
) {
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<CropImageContractOptions>,
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
}

View File

@ -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<out String>, 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 {