From e9e2221510524531ac23b5687e33b29d636ddc4c Mon Sep 17 00:00:00 2001 From: PhilKes Date: Mon, 28 Oct 2024 20:07:18 +0100 Subject: [PATCH] Migrate startActivityForResult and other minor deprecations --- .../notallyx/presentation/UiExtensions.kt | 41 ++++++++ .../presentation/activity/LockedActivity.kt | 32 +++--- .../activity/main/MainActivity.kt | 38 +++---- .../activity/main/fragment/NotallyFragment.kt | 65 ++++++------ .../activity/main/fragment/SearchFragment.kt | 4 +- .../main/fragment/SettingsFragment.kt | 85 ++++++++++------ .../activity/note/EditActivity.kt | 99 +++++++++++-------- .../activity/note/EditNoteActivity.kt | 49 +++++---- .../activity/note/PlayAudioActivity.kt | 23 +++-- .../activity/note/RecordAudioActivity.kt | 45 +++++---- .../activity/note/ViewImageActivity.kt | 37 ++++--- .../presentation/view/main/ColorAdapter.kt | 2 +- .../view/misc/EditTextWithHistory.kt | 13 +-- .../note/listitem/ListItemDragCallback.kt | 2 +- .../view/note/listitem/ListManager.kt | 2 +- .../listitem/sorting/ListItemSortedList.kt | 6 +- .../sorting/ListItemSortedListExtensions.kt | 2 +- .../presentation/widget/WidgetProvider.kt | 6 +- .../utils/audio/AudioRecordService.kt | 9 +- .../notallyx/utils/security/LockUtils.kt | 21 ++-- 20 files changed, 353 insertions(+), 228 deletions(-) diff --git a/app/src/main/java/com/philkes/notallyx/presentation/UiExtensions.kt b/app/src/main/java/com/philkes/notallyx/presentation/UiExtensions.kt index fd319abf..7ede122d 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/UiExtensions.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/UiExtensions.kt @@ -7,6 +7,7 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.ContentResolver import android.content.Context +import android.content.Intent import android.content.pm.PackageManager import android.graphics.Typeface import android.hardware.biometrics.BiometricManager @@ -14,6 +15,8 @@ import android.hardware.biometrics.BiometricManager.Authenticators.BIOMETRIC_STR import android.hardware.biometrics.BiometricManager.Authenticators.DEVICE_CREDENTIAL import android.net.Uri import android.os.Build +import android.os.Bundle +import android.os.Parcelable import android.provider.OpenableColumns import android.text.Editable import android.text.InputType @@ -486,3 +489,41 @@ fun MaterialAlertDialogBuilder.showAndFocus(view: View): AlertDialog { fun Context.getQuantityString(id: Int, quantity: Int, vararg formatArgs: Any): String { return resources.getQuantityString(id, quantity, quantity, *formatArgs) } + +fun Bundle?.getParcelableCompat(key: String, clazz: Class): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + this?.getParcelable(key, clazz) + } else { + this?.getParcelable(key) + } +} + +fun Bundle?.getParcelableArrayListCompat( + key: String, + clazz: Class, +): ArrayList? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + this?.getParcelableArrayList(key, clazz) + } else { + this?.getParcelableArrayList(key) + } +} + +fun Intent?.getParcelableArrayListExtraCompat( + key: String, + clazz: Class, +): ArrayList? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + this?.getParcelableArrayListExtra(key, clazz) + } else { + this?.getParcelableArrayListExtra(key) + } +} + +fun Intent?.getParcelableExtraCompat(key: String, clazz: Class): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + this?.getParcelableExtra(key, clazz) + } else { + this?.getParcelableExtra(key) + } +} diff --git a/app/src/main/java/com/philkes/notallyx/presentation/activity/LockedActivity.kt b/app/src/main/java/com/philkes/notallyx/presentation/activity/LockedActivity.kt index bc78b105..2247d428 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/activity/LockedActivity.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/activity/LockedActivity.kt @@ -7,6 +7,8 @@ import android.os.Build import android.os.Bundle import android.view.View.INVISIBLE import android.view.View.VISIBLE +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.viewbinding.ViewBinding import com.philkes.notallyx.NotallyXApplication @@ -18,6 +20,8 @@ import com.philkes.notallyx.utils.security.showBiometricOrPinPrompt abstract class LockedActivity : AppCompatActivity() { private lateinit var notallyXApplication: NotallyXApplication + private lateinit var biometricAuthenticationActivityResultLauncher: + ActivityResultLauncher protected lateinit var binding: T protected lateinit var preferences: Preferences @@ -26,6 +30,16 @@ abstract class LockedActivity : AppCompatActivity() { super.onCreate(savedInstanceState) notallyXApplication = (application as NotallyXApplication) preferences = Preferences.getInstance(application) + + biometricAuthenticationActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + notallyXApplication.isLocked = false + show() + } else { + finish() + } + } } override fun onResume() { @@ -47,23 +61,11 @@ abstract class LockedActivity : AppCompatActivity() { } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_BIOMETRIC_AUTHENTICATION) { - if (resultCode == Activity.RESULT_OK) { - notallyXApplication.isLocked = false - show() - } else { - finish() - } - } - } - open fun showLockScreen() { showBiometricOrPinPrompt( true, preferences.iv!!, - REQUEST_BIOMETRIC_AUTHENTICATION, + biometricAuthenticationActivityResultLauncher, R.string.unlock, onSuccess = { notallyXApplication.isLocked = false @@ -91,8 +93,4 @@ abstract class LockedActivity : AppCompatActivity() { false } } - - companion object { - private const val REQUEST_BIOMETRIC_AUTHENTICATION = 11 - } } diff --git a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/MainActivity.kt b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/MainActivity.kt index 8b8afa55..b786f8cc 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/MainActivity.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/MainActivity.kt @@ -1,6 +1,5 @@ package com.philkes.notallyx.presentation.activity.main -import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.net.Uri @@ -12,6 +11,9 @@ import android.view.MenuItem import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.Toast +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.content.FileProvider import androidx.core.view.GravityCompat @@ -55,14 +57,15 @@ class MainActivity : LockedActivity() { private lateinit var navController: NavController private lateinit var configuration: AppBarConfiguration + private lateinit var exportFileActivityResultLauncher: ActivityResultLauncher private val model: BaseNoteModel by viewModels() - - override fun onBackPressed() { - if (model.actionMode.enabled.value) { - model.actionMode.close(true) - } else super.onBackPressed() - } + private val actionModeCancelCallback = + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + model.actionMode.close(true) + } + } override fun onSupportNavigateUp(): Boolean { return navController.navigateUp(configuration) @@ -78,13 +81,9 @@ class MainActivity : LockedActivity() { setupActionMode() setupNavigation() setupSearch() - } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_EXPORT_FILE && resultCode == Activity.RESULT_OK) { - data?.data?.let { uri -> model.writeCurrentFileToUri(uri) } - } + setupActivityResultLaunchers() + onBackPressedDispatcher.addCallback(this, actionModeCancelCallback) } private fun setupFAB() { @@ -141,6 +140,7 @@ class MainActivity : LockedActivity() { binding.ActionMode.visibility = View.GONE binding.DrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED) } + actionModeCancelCallback.isEnabled = enabled } val menu = binding.ActionMode.menu @@ -387,9 +387,8 @@ class MainActivity : LockedActivity() { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_TITLE, file.nameWithoutExtension) } - model.currentFile = file - startActivityForResult(intent, REQUEST_EXPORT_FILE) + exportFileActivityResultLauncher.launch(intent) } private fun setupNavigation() { @@ -472,7 +471,12 @@ class MainActivity : LockedActivity() { } } - companion object { - private const val REQUEST_EXPORT_FILE = 10 + private fun setupActivityResultLaunchers() { + exportFileActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> model.writeCurrentFileToUri(uri) } + } + } } } diff --git a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/NotallyFragment.kt b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/NotallyFragment.kt index 2b2e61f6..a4df0d1f 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/NotallyFragment.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/NotallyFragment.kt @@ -6,6 +6,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -36,6 +38,8 @@ import com.philkes.notallyx.presentation.viewmodel.BaseNoteModel abstract class NotallyFragment : Fragment(), ListItemListener { private var notesAdapter: BaseNoteAdapter? = null + private lateinit var openNoteActivityResultLauncher: ActivityResultLauncher + internal var binding: FragmentNotesBinding? = null internal val model: BaseNoteModel by activityViewModels() @@ -52,6 +56,35 @@ abstract class NotallyFragment : Fragment(), ListItemListener { setupAdapter() setupRecyclerView() setupObserver() + + setupActivityResultLaunchers() + } + + private fun setupActivityResultLaunchers() { + openNoteActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + // If a note has been moved inside of EditActivity + // present snackbar to undo it + val data = result.data + val id = data?.getLongExtra(NOTE_ID, -1) + if (id != null) { + val folderFrom = Folder.valueOf(data.getStringExtra(FOLDER_FROM)!!) + val folderTo = Folder.valueOf(data.getStringExtra(FOLDER_TO)!!) + Snackbar.make( + binding!!.root, + requireContext().getQuantityString(folderTo.movedToResId(), 1), + Snackbar.LENGTH_SHORT, + ) + .apply { + setAction(R.string.undo) { + model.moveBaseNotes(longArrayOf(id), folderFrom) + } + } + .show() + } + } + } } override fun onCreateView( @@ -92,32 +125,6 @@ abstract class NotallyFragment : Fragment(), ListItemListener { } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == RESULT_OK) { - if (requestCode == REQUEST_NOTE_EDIT) { - // If a note has been moved inside of EditActivity - // present snackbar to undo it - val id = data?.getLongExtra(NOTE_ID, -1) - if (id != null) { - val folderFrom = Folder.valueOf(data.getStringExtra(FOLDER_FROM)!!) - val folderTo = Folder.valueOf(data.getStringExtra(FOLDER_TO)!!) - Snackbar.make( - binding!!.root, - requireContext().getQuantityString(folderTo.movedToResId(), 1), - Snackbar.LENGTH_SHORT, - ) - .apply { - setAction(R.string.undo) { - model.moveBaseNotes(longArrayOf(id), folderFrom) - } - } - .show() - } - } - } - } - private fun handleNoteSelection(id: Long, position: Int, baseNote: BaseNote) { if (model.actionMode.selectedNotes.contains(id)) { model.actionMode.remove(id) @@ -188,14 +195,10 @@ abstract class NotallyFragment : Fragment(), ListItemListener { private fun goToActivity(activity: Class<*>, baseNote: BaseNote) { val intent = Intent(requireContext(), activity) intent.putExtra(Constants.SelectedBaseNote, baseNote.id) - startActivityForResult(intent, REQUEST_NOTE_EDIT) + openNoteActivityResultLauncher.launch(intent) } abstract fun getBackground(): Int abstract fun getObservable(): LiveData> - - companion object { - private const val REQUEST_NOTE_EDIT = 11 - } } diff --git a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SearchFragment.kt b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SearchFragment.kt index dc60ff14..2995b549 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SearchFragment.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SearchFragment.kt @@ -23,8 +23,8 @@ class SearchFragment : NotallyFragment() { } binding?.ChipGroup?.apply { - setOnCheckedChangeListener { _, checkedId -> - when (checkedId) { + setOnCheckedStateChangeListener { _, checkedId -> + when (checkedId.first()) { R.id.Notes -> model.folder = Folder.NOTES R.id.Deleted -> model.folder = Folder.DELETED R.id.Archived -> model.folder = Folder.ARCHIVED diff --git a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SettingsFragment.kt b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SettingsFragment.kt index b13e211d..57cbc10b 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/activity/main/fragment/SettingsFragment.kt @@ -1,6 +1,5 @@ package com.philkes.notallyx.presentation.activity.main.fragment -import android.app.Activity import android.app.Application import android.content.ActivityNotFoundException import android.content.Intent @@ -14,6 +13,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity.RESULT_OK import androidx.core.content.ContextCompat import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.Fragment @@ -63,6 +65,12 @@ import com.philkes.notallyx.utils.security.showBiometricOrPinPrompt class SettingsFragment : Fragment() { private val model: BaseNoteModel by activityViewModels() + private lateinit var importBackupActivityResultLauncher: ActivityResultLauncher + private lateinit var importOtherActivityResultLauncher: ActivityResultLauncher + private lateinit var exportBackupActivityResultLauncher: ActivityResultLauncher + private lateinit var chooseFolderActivityResultLauncher: ActivityResultLauncher + private lateinit var setupLockActivityResultLauncher: ActivityResultLauncher + private lateinit var disableLockActivityResultLauncher: ActivityResultLauncher private lateinit var selectedImportSource: ImportSource @@ -149,22 +157,46 @@ class SettingsFragment : Fragment() { return binding.root } - override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { - if (resultCode == Activity.RESULT_OK) { - intent?.data?.let { uri -> - when (requestCode) { - REQUEST_IMPORT_BACKUP -> importBackup(uri) - REQUEST_EXPORT_BACKUP -> model.exportBackup(uri) - REQUEST_CHOOSE_FOLDER -> model.setAutoBackupPath(uri) - REQUEST_IMPORT_OTHER -> model.importFromOtherApp(uri, selectedImportSource) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupActivityResultLaunchers() + } + + private fun setupActivityResultLaunchers() { + importBackupActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> importBackup(uri) } } - return } - } - when (requestCode) { - REQUEST_SETUP_LOCK -> showEnableBiometricLock() - REQUEST_DISABLE_LOCK -> showDisableBiometricLock() - } + importOtherActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> + model.importFromOtherApp(uri, selectedImportSource) + } + } + } + exportBackupActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> model.exportBackup(uri) } + } + } + chooseFolderActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> model.setAutoBackupPath(uri) } + } + } + setupLockActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + showEnableBiometricLock() + } + disableLockActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + showDisableBiometricLock() + } } private fun importBackup(uri: Uri) { @@ -208,7 +240,7 @@ class SettingsFragment : Fragment() { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_TITLE, "NotallyX Backup") } - startActivityForResult(intent, REQUEST_EXPORT_BACKUP) + exportBackupActivityResultLauncher.launch(intent) } private fun importBackup() { @@ -218,7 +250,7 @@ class SettingsFragment : Fragment() { putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/zip", "text/xml")) addCategory(Intent.CATEGORY_OPENABLE) } - startActivityForResult(intent, REQUEST_IMPORT_BACKUP) + importBackupActivityResultLauncher.launch(intent) } private fun clearData() { @@ -254,7 +286,7 @@ class SettingsFragment : Fragment() { ) addCategory(Intent.CATEGORY_OPENABLE) } - startActivityForResult(intent, REQUEST_IMPORT_OTHER) + importOtherActivityResultLauncher.launch(intent) } .setNegativeButton(R.string.help) { _, _ -> val intent = @@ -347,7 +379,7 @@ class SettingsFragment : Fragment() { .setMessage(R.string.notes_will_be) .setPositiveButton(R.string.choose_folder) { _, _ -> val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - startActivityForResult(intent, REQUEST_CHOOSE_FOLDER) + chooseFolderActivityResultLauncher.launch(intent) } .show() } @@ -522,7 +554,7 @@ class SettingsFragment : Fragment() { private fun showEnableBiometricLock() { showBiometricOrPinPrompt( false, - REQUEST_SETUP_LOCK, + setupLockActivityResultLauncher, R.string.enable_lock_title, R.string.enable_lock_description, onSuccess = { cipher -> @@ -543,7 +575,7 @@ class SettingsFragment : Fragment() { private fun showDisableBiometricLock() { showBiometricOrPinPrompt( true, - REQUEST_DISABLE_LOCK, + disableLockActivityResultLauncher, R.string.disable_lock_title, R.string.disable_lock_description, model.preferences.iv!!, @@ -594,7 +626,7 @@ class SettingsFragment : Fragment() { } else { Intent(Settings.ACTION_SECURITY_SETTINGS) } - startActivityForResult(intent, REQUEST_SETUP_LOCK) + setupLockActivityResultLauncher.launch(intent) } .show() } @@ -642,13 +674,4 @@ class SettingsFragment : Fragment() { Toast.makeText(requireContext(), R.string.install_a_browser, Toast.LENGTH_LONG).show() } } - - companion object { - private const val REQUEST_IMPORT_BACKUP = 20 - private const val REQUEST_EXPORT_BACKUP = 21 - private const val REQUEST_CHOOSE_FOLDER = 22 - private const val REQUEST_SETUP_LOCK = 23 - private const val REQUEST_DISABLE_LOCK = 24 - private const val REQUEST_IMPORT_OTHER = 25 - } } diff --git a/app/src/main/java/com/philkes/notallyx/presentation/activity/note/EditActivity.kt b/app/src/main/java/com/philkes/notallyx/presentation/activity/note/EditActivity.kt index 18ae7e13..c500daa3 100644 --- a/app/src/main/java/com/philkes/notallyx/presentation/activity/note/EditActivity.kt +++ b/app/src/main/java/com/philkes/notallyx/presentation/activity/note/EditActivity.kt @@ -1,7 +1,6 @@ package com.philkes.notallyx.presentation.activity.note import android.Manifest -import android.app.Activity import android.content.ActivityNotFoundException import android.content.Intent import android.content.pm.PackageManager @@ -16,6 +15,8 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup.LayoutParams import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.core.content.FileProvider @@ -34,6 +35,8 @@ import com.philkes.notallyx.databinding.ActivityEditBinding import com.philkes.notallyx.presentation.activity.LockedActivity import com.philkes.notallyx.presentation.add import com.philkes.notallyx.presentation.displayFormattedTimestamp +import com.philkes.notallyx.presentation.getParcelableArrayListExtraCompat +import com.philkes.notallyx.presentation.getParcelableExtraCompat import com.philkes.notallyx.presentation.getQuantityString import com.philkes.notallyx.presentation.setupProgressDialog import com.philkes.notallyx.presentation.view.Constants @@ -53,6 +56,13 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch abstract class EditActivity(private val type: Type) : LockedActivity() { + private lateinit var recordAudioActivityResultLauncher: ActivityResultLauncher + private lateinit var addImagesActivityResultLauncher: ActivityResultLauncher + private lateinit var viewImagesActivityResultLauncher: ActivityResultLauncher + private lateinit var selectLabelsActivityResultLauncher: ActivityResultLauncher + private lateinit var playAudioActivityResultLauncher: ActivityResultLauncher + private lateinit var attachFilesActivityResultLauncher: ActivityResultLauncher + internal val model: NotallyModel by viewModels() internal lateinit var changeHistory: ChangeHistory @@ -98,15 +108,22 @@ abstract class EditActivity(private val type: Type) : LockedActivity { - val uri = data?.data - val clipData = data?.clipData + private fun setupActivityResultLaunchers() { + recordAudioActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + model.addAudio() + } + } + addImagesActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val uri = result.data?.data + val clipData = result.data?.clipData if (uri != null) { val uris = arrayOf(uri) model.addImages(uris) @@ -116,36 +133,49 @@ abstract class EditActivity(private val type: Type) : LockedActivity { + } + viewImagesActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { val list = - data?.getParcelableArrayListExtra( - ViewImageActivity.DELETED_IMAGES + result.data?.getParcelableArrayListExtraCompat( + ViewImageActivity.DELETED_IMAGES, + FileAttachment::class.java, ) if (!list.isNullOrEmpty()) { model.deleteImages(list) } } - - REQUEST_SELECT_LABELS -> { - val list = data?.getStringArrayListExtra(SelectLabelsActivity.SELECTED_LABELS) + } + selectLabelsActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val list = + result.data?.getStringArrayListExtra(SelectLabelsActivity.SELECTED_LABELS) if (list != null && list != model.labels) { model.setLabels(list) Operations.bindLabels(binding.LabelGroup, model.labels, model.textSize) } } - - REQUEST_RECORD_AUDIO -> model.addAudio() - REQUEST_PLAY_AUDIO -> { - val audio = data?.getParcelableExtra