From 4abbf3091f2f98cf5601c4a0fcf5d3c031b9250e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 18 Feb 2026 22:58:21 +0100 Subject: [PATCH 01/12] avoid deprecated in ProfileFragment.onActivityResult() --- .../securesms/ProfileFragment.java | 72 ++++++++++--------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java index 4a8cc6f5c..cabb0bcae 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java @@ -11,6 +11,8 @@ 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.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; @@ -42,8 +44,7 @@ public class ProfileFragment extends Fragment public static final String CHAT_ID_EXTRA = "chat_id"; public static final String CONTACT_ID_EXTRA = "contact_id"; - private static final int REQUEST_CODE_PICK_CONTACT = 2; - + private ActivityResultLauncher pickContactLauncher; private ProfileAdapter adapter; private ActionMode actionMode; private final ActionModeCallback actionModeCallback = new ActionModeCallback(); @@ -60,6 +61,39 @@ public class ProfileFragment extends Fragment chatId = getArguments() != null ? getArguments().getInt(CHAT_ID_EXTRA, -1) : -1; contactId = getArguments().getInt(CONTACT_ID_EXTRA, -1); dcContext = DcHelper.getContext(requireContext()); + pickContactLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + Intent data = result.getData(); + List selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA); + List deselected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.DESELECTED_CONTACTS_EXTRA); + Util.runOnAnyBackgroundThread(() -> { + if (deselected != null) { + // Remove members that were deselected + int[] members = dcContext.getChatContacts(chatId); + for (int contactId : deselected) { + for (int memberId : members) { + if (memberId == contactId) { + dcContext.removeContactFromChat(chatId, memberId); + break; + } + } + } + } + + if (selected != null) { + // Add new members + for (Integer contactId : selected) { + if (contactId != null) { + dcContext.addContactToChat(chatId, contactId); + } + } + } + }); + } + } + ); } @Override @@ -210,7 +244,7 @@ public class ProfileFragment extends Fragment preselectedContacts.add(memberId); } intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts); - startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT); + pickContactLauncher.launch(intent); } public void onQrInvite() { @@ -304,36 +338,4 @@ public class ProfileFragment extends Fragment adapter.clearSelection(); } } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) { - List selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA); - List deselected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.DESELECTED_CONTACTS_EXTRA); - Util.runOnAnyBackgroundThread(() -> { - if (deselected != null) { - // Remove members that were deselected - int[] members = dcContext.getChatContacts(chatId); - for (int contactId : deselected) { - for (int memberId : members) { - if (memberId == contactId) { - dcContext.removeContactFromChat(chatId, memberId); - break; - } - } - } - } - - if (selected != null) { - // Add new members - for (Integer contactId : selected) { - if (contactId != null) { - dcContext.addContactToChat(chatId, contactId); - } - } - } - }); - } - } } From 4b9642f51fd6095a36c4610de10430058aedb68d Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 18 Feb 2026 23:29:54 +0100 Subject: [PATCH 02/12] add more logging to ProfileFragment --- .../thoughtcrime/securesms/ProfileFragment.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java index cabb0bcae..e1c9a072c 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -41,6 +42,7 @@ import java.util.List; public class ProfileFragment extends Fragment implements ProfileAdapter.ItemClickListener, DcEventCenter.DcEventDelegate { + private static final String TAG = ProfileFragment.class.getSimpleName(); public static final String CHAT_ID_EXTRA = "chat_id"; public static final String CONTACT_ID_EXTRA = "contact_id"; @@ -64,13 +66,14 @@ public class ProfileFragment extends Fragment pickContactLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { - if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { - Intent data = result.getData(); + Intent data = result.getData(); + Log.i(TAG, "Received result from activity, resultCode=" + result.getResultCode() + ", data=" + data); + if (result.getResultCode() == Activity.RESULT_OK && data != null) { List selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA); List deselected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.DESELECTED_CONTACTS_EXTRA); Util.runOnAnyBackgroundThread(() -> { - if (deselected != null) { - // Remove members that were deselected + if (deselected != null) { // Remove members that were deselected + Log.i(TAG, deselected.size() + " members removed"); int[] members = dcContext.getChatContacts(chatId); for (int contactId : deselected) { for (int memberId : members) { @@ -82,8 +85,8 @@ public class ProfileFragment extends Fragment } } - if (selected != null) { - // Add new members + if (selected != null) { // Add new members + Log.i(TAG, selected.size() + " members added"); for (Integer contactId : selected) { if (contactId != null) { dcContext.addContactToChat(chatId, contactId); From 5ee360731225ddfdafaa61a46872e56d3e284e24 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 18 Feb 2026 23:32:54 +0100 Subject: [PATCH 03/12] avoid deprecated ConversationFragment.onActivityResult() --- .../thoughtcrime/securesms/ConversationFragment.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index e1ab38daf..b5fa8eed3 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -86,7 +86,6 @@ public class ConversationFragment extends MessageSelectorFragment private static final String TAG = ConversationFragment.class.getSimpleName(); private static final int SCROLL_ANIMATION_THRESHOLD = 50; - private static final int CODE_ADD_EDIT_CONTACT = 77; private final ActionModeCallback actionModeCallback = new ActionModeCallback(); private final ItemClickListener selectionClickListener = new ConversationFragmentItemClickListener(); @@ -927,17 +926,6 @@ public class ConversationFragment extends MessageSelectorFragment } } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (requestCode == CODE_ADD_EDIT_CONTACT && getContext() != null) { -// ApplicationContext.getInstance(getContext().getApplicationContext()) -// .getJobManager() -// .add(new DirectoryRefreshJob(getContext().getApplicationContext(), false)); - } - } - private class ActionModeCallback implements ActionMode.Callback { @Override From cdcb7fab4b206583a2778ba3d962f60f7ebec10e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 18 Feb 2026 23:53:30 +0100 Subject: [PATCH 04/12] avoid deprecated `AdvancedPreferenceFragment.onActivityResult()` --- .../AdvancedPreferenceFragment.java | 22 +++++++++++-------- .../securesms/util/ScreenLockUtil.java | 15 +++++++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index ae870df8c..989957f71 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -18,6 +18,8 @@ import android.view.View; import android.widget.EditText; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -55,11 +57,21 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment CheckBoxPreference multiDeviceCheckbox; CheckBoxPreference mvboxMoveCheckbox; CheckBoxPreference onlyFetchMvboxCheckbox; + private ActivityResultLauncher screenLockLauncher; @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); + screenLockLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + openRelayListActivity(); + } + } + ); + showEmails = (ListPreference) this.findPreference("pref_show_emails"); if (showEmails != null) { showEmails.setOnPreferenceChangeListener((preference, newValue) -> { @@ -211,7 +223,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment Preference relayListBtn = this.findPreference("pref_relay_list_button"); if (relayListBtn != null) { relayListBtn.setOnPreferenceClickListener(((preference) -> { - boolean result = ScreenLockUtil.applyScreenLock(requireActivity(), getString(R.string.transports), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT); + boolean result = ScreenLockUtil.applyScreenLock(requireActivity(), getString(R.string.transports), getString(R.string.enter_system_secret_to_continue), screenLockLauncher); if (!result) { openRelayListActivity(); } @@ -244,14 +256,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment onlyFetchMvboxCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_ONLY_FETCH_MVBOX)); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT) { - openRelayListActivity(); - } - } - protected File copyToCacheDir(Uri uri) throws IOException { try (InputStream inputStream = requireActivity().getContentResolver().openInputStream(uri)) { File file = File.createTempFile("tmp-keys-file", ".tmp", requireActivity().getCacheDir()); diff --git a/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java b/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java index d2136e153..3e0394202 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java +++ b/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java @@ -5,6 +5,8 @@ import android.app.KeyguardManager; import android.content.Context; import android.content.Intent; +import androidx.activity.result.ActivityResultLauncher; + public class ScreenLockUtil { public static final int REQUEST_CODE_CONFIRM_CREDENTIALS = 1001; @@ -22,4 +24,17 @@ public class ScreenLockUtil { return false; } + public static boolean applyScreenLock(Activity activity, String title, String descr, ActivityResultLauncher launcher) { + KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); + Intent intent; + if (keyguardManager != null) { + intent = keyguardManager.createConfirmDeviceCredentialIntent(title, descr); + if (intent != null) { + launcher.launch(intent); + return true; + } + } + return false; + } + } From 23f6803be9f73f3e3b89cff08df8cfe30b61eee2 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 00:05:39 +0100 Subject: [PATCH 05/12] avoid deprecated `ChatsPreferenceFragment.onActivityResult()` also remove now unused fields in `ListSummaryPreferenceFragment` --- .../preferences/ChatsPreferenceFragment.java | 23 +++++++++++-------- .../ListSummaryPreferenceFragment.java | 3 --- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index 0c5140bbf..31d5aa0c8 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java @@ -10,6 +10,8 @@ import android.view.View; import android.widget.CheckBox; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -28,6 +30,8 @@ import org.thoughtcrime.securesms.util.ScreenLockUtil; import org.thoughtcrime.securesms.util.Util; public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { + private ActivityResultLauncher screenLockLauncher; + private ListPreference mediaQuality; private ListPreference autoDownload; private CheckBoxPreference readReceiptsCheckbox; @@ -39,6 +43,15 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); + screenLockLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + performBackup(); + } + } + ); + mediaQuality = (ListPreference) this.findPreference("pref_compression"); if (mediaQuality != null) { mediaQuality.setOnPreferenceChangeListener((preference, newValue) -> { @@ -151,14 +164,6 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { } } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS_BACKUP) { - performBackup(); - } - } - public static CharSequence getSummary(Context context) { DcContext dcContext = DcHelper.getContext(context); final String onRes = context.getString(R.string.on); @@ -253,7 +258,7 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { private class BackupListener implements Preference.OnPreferenceClickListener { @Override public boolean onPreferenceClick(@NonNull Preference preference) { - boolean result = ScreenLockUtil.applyScreenLock(requireActivity(), getString(R.string.pref_backup), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_BACKUP); + boolean result = ScreenLockUtil.applyScreenLock(requireActivity(), getString(R.string.pref_backup), getString(R.string.enter_system_secret_to_continue), screenLockLauncher); if (!result) { performBackup(); } diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java index b6e541806..517ec13e4 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java @@ -27,9 +27,6 @@ import java.util.HashMap; import java.util.Map; public abstract class ListSummaryPreferenceFragment extends CorrectedPreferenceFragment implements DcEventCenter.DcEventDelegate { - protected static final int REQUEST_CODE_CONFIRM_CREDENTIALS_BACKUP = ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS + 1; - protected static final int REQUEST_CODE_CONFIRM_CREDENTIALS_KEYS = REQUEST_CODE_CONFIRM_CREDENTIALS_BACKUP + 1; - protected static final int REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT = REQUEST_CODE_CONFIRM_CREDENTIALS_KEYS + 1; protected DcContext dcContext; private NotificationController notificationController; From f6f42991e8e52c577928803b9defccffe334f945 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 02:08:24 +0100 Subject: [PATCH 06/12] avoid deprecated `NotificationsPreferenceFragment.onActivityResult()` --- .../NotificationsPreferenceFragment.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java index e6e282cd7..256ebb010 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java @@ -16,6 +16,8 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationManagerCompat; @@ -34,17 +36,34 @@ import org.thoughtcrime.securesms.util.Prefs; public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragment implements Preference.OnPreferenceChangeListener { private static final String TAG = NotificationsPreferenceFragment.class.getSimpleName(); - private static final int REQUEST_CODE_NOTIFICATION_SELECTED = 1; private CheckBoxPreference ignoreBattery; private CheckBoxPreference notificationsEnabled; private CheckBoxPreference mentionNotifEnabled; private CheckBoxPreference reliableService; + private ActivityResultLauncher ringtonePickerLauncher; @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); + ringtonePickerLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri uri = result.getData().getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); + + if (Settings.System.DEFAULT_NOTIFICATION_URI.equals(uri)) { + Prefs.removeNotificationRingtone(getContext()); + } else { + Prefs.setNotificationRingtone(getContext(), uri != null ? uri : Uri.EMPTY); + } + + initializeRingtoneSummary(findPreference(Prefs.RINGTONE_PREF)); + } + } + ); + this.findPreference(Prefs.LED_COLOR_PREF) .setOnPreferenceChangeListener(new ListSummaryListener()); this.findPreference(Prefs.RINGTONE_PREF) @@ -65,8 +84,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, Settings.System.DEFAULT_NOTIFICATION_URI); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, current); - - startActivityForResult(intent, REQUEST_CODE_NOTIFICATION_SELECTED); + ringtonePickerLauncher.launch(intent); return true; }); @@ -137,22 +155,6 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme reliableService.setOnPreferenceChangeListener(this); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_CODE_NOTIFICATION_SELECTED && resultCode == RESULT_OK && data != null) { - Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); - - if (Settings.System.DEFAULT_NOTIFICATION_URI.equals(uri)) { - Prefs.removeNotificationRingtone(getContext()); - } else { - Prefs.setNotificationRingtone(getContext(), uri != null ? uri : Uri.EMPTY); - } - - initializeRingtoneSummary(findPreference(Prefs.RINGTONE_PREF)); - } - } - @Override public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) { Context context = getContext(); From 694f3bf0131c32461a2837259d8e840e653a72c7 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 02:08:47 +0100 Subject: [PATCH 07/12] remove unused import in ListSummaryPreferenceFragment --- .../securesms/preferences/ListSummaryPreferenceFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java index 517ec13e4..7ad5ec0a0 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java @@ -19,7 +19,6 @@ import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.service.GenericForegroundService; import org.thoughtcrime.securesms.service.NotificationController; -import org.thoughtcrime.securesms.util.ScreenLockUtil; import org.thoughtcrime.securesms.util.views.ProgressDialog; import java.util.Arrays; From 7c24e836feaff863ee6274244a6aa9ebf046e15b Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 02:26:09 +0100 Subject: [PATCH 08/12] avoid deprecated `ContactSelectionListFragment.onActivityResult()` --- .../ContactSelectionListFragment.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index ff45edbae..fde94c9e0 100644 --- a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -32,6 +32,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; @@ -79,7 +81,6 @@ public class ContactSelectionListFragment extends Fragment public static final String SELECT_UNENCRYPTED_EXTRA = "select_unencrypted_extra"; public static final String ALLOW_CREATION = "allow_creation"; public static final String PRESELECTED_CONTACTS = "preselected_contacts"; - public static final int CONTACT_ADDR_RESULT_CODE = 61123; private DcContext dcContext; @@ -91,11 +92,26 @@ public class ContactSelectionListFragment extends Fragment private TextView emptyView; private ActionMode actionMode; private ActionMode.Callback actionModeCallback; + private ActivityResultLauncher newContactLauncher; @Override public void onActivityCreated(Bundle icicle) { super.onActivityCreated(icicle); + newContactLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + int contactId = result.getData().getIntExtra(NewContactActivity.CONTACT_ID_EXTRA, 0); + if (contactId != 0) { + selectedContacts.add(contactId); + deselectedContacts.remove(contactId); + } + getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this); + } + } + ); + dcContext = DcHelper.getContext(getActivity()); DcHelper.getEventCenter(getActivity()).addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this); initializeCursor(); @@ -314,7 +330,7 @@ public class ContactSelectionListFragment extends Fragment intent.putExtra(NewContactActivity.ADDR_EXTRA, cursorFilter); } if (isMulti()) { - startActivityForResult(intent, CONTACT_ADDR_RESULT_CODE); + newContactLauncher.launch(intent); } else { requireContext().startActivity(intent); } @@ -363,16 +379,4 @@ public class ContactSelectionListFragment extends Fragment } } - @Override - public void onActivityResult(int reqCode, int resultCode, final Intent data) { - super.onActivityResult(reqCode, resultCode, data); - if (resultCode == Activity.RESULT_OK && reqCode == CONTACT_ADDR_RESULT_CODE) { - int contactId = data.getIntExtra(NewContactActivity.CONTACT_ID_EXTRA, 0); - if (contactId != 0) { - selectedContacts.add(contactId); - deselectedContacts.remove(contactId); - } - getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this); - } - } } From b66bf595e2ae2c4bd09c86a7d303ca125fb608e5 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 03:08:46 +0100 Subject: [PATCH 09/12] avoid call to fragment.onActivityResult in ApplicationPreferencesActivity --- .../ApplicationPreferencesActivity.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java index 96c66e195..a01169b59 100644 --- a/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java @@ -22,6 +22,8 @@ import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -87,18 +89,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA } } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && requestCode == ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS) { - showBackupProvider(); - return; - } - Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment); - fragment.onActivityResult(requestCode, resultCode, data); - } - @Override public boolean onSupportNavigateUp() { FragmentManager fragmentManager = getSupportFragmentManager(); @@ -130,11 +120,21 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA } public static class ApplicationPreferenceFragment extends CorrectedPreferenceFragment implements DcEventCenter.DcEventDelegate { + private ActivityResultLauncher screenLockLauncher; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + screenLockLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + ((ApplicationPreferencesActivity)getActivity()).showBackupProvider(); + } + } + ); + this.findPreference(PREFERENCE_CATEGORY_PROFILE) .setOnPreferenceClickListener(new ProfileClickListener()); this.findPreference(PREFERENCE_CATEGORY_NOTIFICATIONS) @@ -238,7 +238,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA case PREFERENCE_CATEGORY_MULTIDEVICE: if (!ScreenLockUtil.applyScreenLock(getActivity(), getString(R.string.multidevice_title), getString(R.string.multidevice_this_creates_a_qr_code) + "\n\n" + getString(R.string.enter_system_secret_to_continue), - ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS)) { + screenLockLauncher)) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.multidevice_title) .setMessage(R.string.multidevice_this_creates_a_qr_code) From 00b52d4fe6ec27027b317244b20ff22fc639f00d Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 03:34:05 +0100 Subject: [PATCH 10/12] don't call registerForActivityResult in onActivityCreated --- .../securesms/ContactSelectionListFragment.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index fde94c9e0..1043def73 100644 --- a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -95,9 +95,10 @@ public class ContactSelectionListFragment extends Fragment private ActivityResultLauncher newContactLauncher; @Override - public void onActivityCreated(Bundle icicle) { - super.onActivityCreated(icicle); + public void onCreate(Bundle paramBundle) { + super.onCreate(paramBundle); + dcContext = DcHelper.getContext(requireContext()); newContactLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { @@ -107,14 +108,10 @@ public class ContactSelectionListFragment extends Fragment selectedContacts.add(contactId); deselectedContacts.remove(contactId); } - getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this); + LoaderManager.getInstance(this).restartLoader(0, null, ContactSelectionListFragment.this); } } ); - - dcContext = DcHelper.getContext(getActivity()); - DcHelper.getEventCenter(getActivity()).addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this); - initializeCursor(); } @Override @@ -178,6 +175,9 @@ public class ContactSelectionListFragment extends Fragment } }; + DcHelper.getEventCenter(requireActivity()).addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this); + initializeCursor(); + return view; } From c3dac043cb70a893f0ddce8194603820509fcfc0 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 19 Feb 2026 04:59:24 +0100 Subject: [PATCH 11/12] remove ScreenLockUtil.applyScreenLock(Activity, String, String, int) --- .../securesms/ConversationListActivity.java | 60 +++++++++++-------- .../securesms/qr/QrCodeHandler.java | 21 +++---- .../securesms/relay/RelayListActivity.java | 40 +++++++------ .../securesms/util/ScreenLockUtil.java | 15 ----- 4 files changed, 69 insertions(+), 67 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index cf5c3179f..c37585a39 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -46,6 +46,8 @@ import android.widget.TextView; import android.widget.Toast; import androidx.activity.OnBackPressedCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; @@ -98,7 +100,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit public static final String ACCOUNT_ID_EXTRA = "account_id"; public static final String FROM_WELCOME = "from_welcome"; public static final String FROM_WELCOME_RAW_QR = "from_welcome_raw_qr"; - private static final int REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE = ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS+1; private ConversationListFragment conversationListFragment; public TextView title; @@ -112,8 +113,11 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit /** used to store temporarily scanned QR to pass it back to QrCodeHandler when ScreenLockUtil is used */ private String qrData = null; + private ActivityResultLauncher relayLockLauncher; + /** used to store temporarily profile ID to delete after authorization is granted via ScreenLockUtil */ private int deleteProfileId = 0; + private ActivityResultLauncher deleteProfileLockLauncher; @Override protected void onPreCreate() { @@ -123,6 +127,31 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit @Override protected void onCreate(Bundle icicle, boolean ready) { + relayLockLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + // QrCodeHandler requested user authorization before adding a relay + // and it was granted, so proceed to add the relay + if (qrData != null) { + new QrCodeHandler(this).addRelay(qrData); + qrData = null; + } + } + } + ); + deleteProfileLockLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + if (deleteProfileId != 0) { + deleteProfile(deleteProfileId); + deleteProfileId = 0; + } + } + } + ); + addDeviceMessages(getIntent().getBooleanExtra(FROM_WELCOME, false)); if (getIntent().getIntExtra(ACCOUNT_ID_EXTRA, -1) <= 0) { getIntent().putExtra(ACCOUNT_ID_EXTRA, DcHelper.getContext(this).getAccountId()); @@ -628,7 +657,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit public void onDeleteProfile(int profileId) { deleteProfileId = profileId; - boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.delete_account), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE); + boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.delete_account), getString(R.string.enter_system_secret_to_continue), deleteProfileLockLauncher); if (!result) { deleteProfile(profileId); } @@ -660,29 +689,10 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) return; - QrCodeHandler qrCodeHandler = new QrCodeHandler(this); - switch (requestCode) { - case IntentIntegrator.REQUEST_CODE: - IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data); - qrData = scanResult.getContents(); - qrCodeHandler.handleQrData(qrData, SecurejoinSource.Scan, SecurejoinUiPath.QrIcon); - break; - case ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS: - // QrCodeHandler requested user authorization before adding a relay - // and it was granted, so proceed to add the relay - if (qrData != null) { - qrCodeHandler.addRelay(qrData); - qrData = null; - } - break; - case REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE: - if (deleteProfileId != 0) { - deleteProfile(deleteProfileId); - deleteProfileId = 0; - } - break; - default: - break; + if (requestCode == IntentIntegrator.REQUEST_CODE) { + IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data); + qrData = scanResult.getContents(); + new QrCodeHandler(this).handleQrData(qrData, SecurejoinSource.Scan, SecurejoinUiPath.QrIcon, relayLockLauncher); } } diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java index 3cef03312..55d925af5 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java @@ -6,6 +6,8 @@ import android.content.Intent; import android.util.Log; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; @@ -121,16 +123,16 @@ public class QrCodeHandler { } /** Process only QR about adding relays/profiles (DCACCOUNT: / DCLOGIN:) */ - public void handleOnlyAddRelayQr(String rawString) { + public void handleOnlyAddRelayQr(String rawString, @Nullable ActivityResultLauncher screenLockLauncher) { final DcLot qrParsed = dcContext.checkQr(rawString); - if (!handleAddRelayQr(qrParsed, rawString)) { + if (!handleAddRelayQr(qrParsed, rawString, screenLockLauncher)) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); handleDefault(builder, rawString, qrParsed); builder.create().show(); } } - private boolean handleAddRelayQr(DcLot qrParsed, String rawString) { + private boolean handleAddRelayQr(DcLot qrParsed, String rawString, @Nullable ActivityResultLauncher screenLockLauncher) { switch (qrParsed.getState()) { case DcContext.DC_QR_ACCOUNT: case DcContext.DC_QR_LOGIN: @@ -138,14 +140,13 @@ public class QrCodeHandler { builder.setTitle(R.string.confirm_add_transport); builder.setMessage(qrParsed.getText1()); builder.setPositiveButton(R.string.ok, (d, w) -> { - if (activity instanceof RelayListActivity) { - // no need to protect with lock, RelayListActivity is already protected - addRelay(rawString); - } else { - boolean result = ScreenLockUtil.applyScreenLock(activity, activity.getString(R.string.add_transport), activity.getString(R.string.enter_system_secret_to_continue), ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS); + if (screenLockLauncher != null) { + boolean result = ScreenLockUtil.applyScreenLock(activity, activity.getString(R.string.add_transport), activity.getString(R.string.enter_system_secret_to_continue), screenLockLauncher); if (!result) { addRelay(rawString); } + } else { // Screen lock not needed + addRelay(rawString); } }); builder.setNegativeButton(R.string.cancel, null); @@ -219,10 +220,10 @@ public class QrCodeHandler { } /** Handle any kind of QR showing an AlertDialog adapted to the QR type. */ - public void handleQrData(String rawString, SecurejoinSource source, SecurejoinUiPath uiPath) { + public void handleQrData(String rawString, SecurejoinSource source, SecurejoinUiPath uiPath, ActivityResultLauncher relayLockLauncher) { final DcLot qrParsed = dcContext.checkQr(rawString); if (handleSecureJoinQr(qrParsed, rawString, source, uiPath) - || handleAddRelayQr(qrParsed, rawString) + || handleAddRelayQr(qrParsed, rawString, relayLockLauncher) || handleProxyQr(qrParsed, rawString) || handleBackupQr(qrParsed, rawString)) return; diff --git a/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java b/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java index b4493d22b..0aff977c3 100644 --- a/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java @@ -7,6 +7,8 @@ import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; @@ -48,6 +50,7 @@ public class RelayListActivity extends BaseActionBarActivity /** QR provided via Intent extras needs to be saved to pass it to QrCodeHandler when authorization finishes */ private String qrData = null; + private ActivityResultLauncher screenLockLauncher; /** Relay selected for context menu via onRelayLongClick() */ private EnteredLoginParam contextMenuRelay = null; @@ -57,6 +60,22 @@ public class RelayListActivity extends BaseActionBarActivity super.onCreate(savedInstanceState); setContentView(R.layout.activity_relay_list); + screenLockLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() != RESULT_OK) { + // if user canceled unlocking, then finish + finish(); + return; + } + // user authorized, then proceed to handle the QR data + if (qrData != null) { + new QrCodeHandler(this).handleOnlyAddRelayQr(qrData, null); + qrData = null; + } + } + ); + rpc = DcHelper.getRpc(this); accId = DcHelper.getContext(this).getAccountId(); @@ -77,9 +96,9 @@ public class RelayListActivity extends BaseActionBarActivity qrData = getIntent().getStringExtra(EXTRA_QR_DATA); if (qrData != null) { // when the activity is opened with a QR data, we need to ask for authorization first - boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.add_transport), getString(R.string.enter_system_secret_to_continue), ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS); + boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.add_transport), getString(R.string.enter_system_secret_to_continue), screenLockLauncher); if (!result) { - new QrCodeHandler(this).handleOnlyAddRelayQr(qrData); + new QrCodeHandler(this).handleOnlyAddRelayQr(qrData, null); } } @@ -223,22 +242,9 @@ public class RelayListActivity extends BaseActionBarActivity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK) { - // if user canceled unlocking, then finish - if (requestCode == ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS) finish(); - return; - } - - QrCodeHandler qrCodeHandler = new QrCodeHandler(this); - if (requestCode == IntentIntegrator.REQUEST_CODE) { + if (resultCode == RESULT_OK && requestCode == IntentIntegrator.REQUEST_CODE) { IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data); - qrCodeHandler.handleOnlyAddRelayQr(scanResult.getContents()); - } else if (requestCode == ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS) { - // user authorized, then proceed to handle the QR data - if (qrData != null) { - qrCodeHandler.handleOnlyAddRelayQr(qrData); - qrData = null; - } + new QrCodeHandler(this).handleOnlyAddRelayQr(scanResult.getContents(), null); } } diff --git a/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java b/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java index 3e0394202..3b07b0025 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java +++ b/src/main/java/org/thoughtcrime/securesms/util/ScreenLockUtil.java @@ -9,21 +9,6 @@ import androidx.activity.result.ActivityResultLauncher; public class ScreenLockUtil { - public static final int REQUEST_CODE_CONFIRM_CREDENTIALS = 1001; - - public static boolean applyScreenLock(Activity activity, String title, String descr, int requestCode) { - KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); - Intent intent; - if (keyguardManager != null) { - intent = keyguardManager.createConfirmDeviceCredentialIntent(title, descr); - if (intent != null) { - activity.startActivityForResult(intent, requestCode); - return true; - } - } - return false; - } - public static boolean applyScreenLock(Activity activity, String title, String descr, ActivityResultLauncher launcher) { KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); Intent intent; From f909174119b0ae57aae7acad35b98dc2168af082 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Mon, 23 Feb 2026 18:59:54 +0100 Subject: [PATCH 12/12] tweak ConversationListActivity and RelayListActivity don't relay in onActivityResult --- .../securesms/ConversationListActivity.java | 28 ++++++++++--------- .../securesms/relay/RelayListActivity.java | 25 ++++++++++------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index c37585a39..2b7413cd8 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -114,6 +114,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit /** used to store temporarily scanned QR to pass it back to QrCodeHandler when ScreenLockUtil is used */ private String qrData = null; private ActivityResultLauncher relayLockLauncher; + private ActivityResultLauncher qrScannerLauncher; /** used to store temporarily profile ID to delete after authorization is granted via ScreenLockUtil */ private int deleteProfileId = 0; @@ -151,6 +152,16 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit } } ); + qrScannerLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + IntentResult scanResult = IntentIntegrator.parseActivityResult(result.getResultCode(), result.getData()); + qrData = scanResult.getContents(); + new QrCodeHandler(this).handleQrData(qrData, SecurejoinSource.Scan, SecurejoinUiPath.QrIcon, relayLockLauncher); + } + } + ); addDeviceMessages(getIntent().getBooleanExtra(FROM_WELCOME, false)); if (getIntent().getIntExtra(ACCOUNT_ID_EXTRA, -1) <= 0) { @@ -480,7 +491,10 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit startActivity(new Intent(this, ApplicationPreferencesActivity.class)); return true; } else if (itemId == R.id.menu_qr) { - new IntentIntegrator(this).setCaptureActivity(QrActivity.class).initiateScan(); + Intent intent = new IntentIntegrator(this) + .setCaptureActivity(QrActivity.class) + .createScanIntent(); + qrScannerLauncher.launch(intent); return true; } else if (itemId == R.id.menu_global_map) { WebxdcActivity.openMaps(this, 0); @@ -684,18 +698,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit refreshTitle(); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK) return; - - if (requestCode == IntentIntegrator.REQUEST_CODE) { - IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data); - qrData = scanResult.getContents(); - new QrCodeHandler(this).handleQrData(qrData, SecurejoinSource.Scan, SecurejoinUiPath.QrIcon, relayLockLauncher); - } - } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); diff --git a/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java b/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java index 0aff977c3..35e8b0210 100644 --- a/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/relay/RelayListActivity.java @@ -51,6 +51,7 @@ public class RelayListActivity extends BaseActionBarActivity /** QR provided via Intent extras needs to be saved to pass it to QrCodeHandler when authorization finishes */ private String qrData = null; private ActivityResultLauncher screenLockLauncher; + private ActivityResultLauncher qrScannerLauncher; /** Relay selected for context menu via onRelayLongClick() */ private EnteredLoginParam contextMenuRelay = null; @@ -60,6 +61,15 @@ public class RelayListActivity extends BaseActionBarActivity super.onCreate(savedInstanceState); setContentView(R.layout.activity_relay_list); + qrScannerLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + IntentResult scanResult = IntentIntegrator.parseActivityResult(result.getResultCode(), result.getData()); + new QrCodeHandler(this).handleOnlyAddRelayQr(scanResult.getContents(), null); + } + } + ); screenLockLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { @@ -103,7 +113,11 @@ public class RelayListActivity extends BaseActionBarActivity } fabAdd.setOnClickListener(v -> { - new IntentIntegrator(this).setCaptureActivity(QrActivity.class).addExtra(QrActivity.EXTRA_SCAN_RELAY, true).initiateScan(); + Intent intent = new IntentIntegrator(this) + .setCaptureActivity(QrActivity.class) + .addExtra(QrActivity.EXTRA_SCAN_RELAY, true) + .createScanIntent(); + qrScannerLauncher.launch(intent); }); LinearLayoutManager layoutManager = new LinearLayoutManager(this); @@ -239,15 +253,6 @@ public class RelayListActivity extends BaseActionBarActivity return super.onOptionsItemSelected(item); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && requestCode == IntentIntegrator.REQUEST_CODE) { - IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data); - new QrCodeHandler(this).handleOnlyAddRelayQr(scanResult.getContents(), null); - } - } - @Override public void handleEvent(@NonNull DcEvent event) { int eventId = event.getId();