diff --git a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index ff45edbae..1c7c3749b 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; @@ -91,6 +93,7 @@ public class ContactSelectionListFragment extends Fragment private TextView emptyView; private ActionMode actionMode; private ActionMode.Callback actionModeCallback; + private ActivityResultLauncher newContactLauncher; @Override public void onActivityCreated(Bundle icicle) { @@ -98,6 +101,22 @@ public class ContactSelectionListFragment extends Fragment dcContext = DcHelper.getContext(getActivity()); DcHelper.getEventCenter(getActivity()).addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this); + + // Register activity result launcher + 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); + } + } + ); + initializeCursor(); } @@ -314,7 +333,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); } @@ -362,17 +381,4 @@ public class ContactSelectionListFragment extends Fragment getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this); } } - - @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); - } - } } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index 3dce1f2ac..2e5da0784 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -87,7 +87,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(); @@ -949,17 +948,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 diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java index 4a8cc6f5c..4d650921e 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; @@ -48,6 +50,7 @@ public class ProfileFragment extends Fragment private ActionMode actionMode; private final ActionModeCallback actionModeCallback = new ActionModeCallback(); + private ActivityResultLauncher pickContactLauncher; private DcContext dcContext; protected int chatId; @@ -60,6 +63,41 @@ 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()); + + // Register activity result launcher + 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 +248,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 +342,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); - } - } - } - }); - } - } } diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 2e3a5a1ea..adfa1e4c6 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,22 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment CheckBoxPreference multiDeviceCheckbox; CheckBoxPreference mvboxMoveCheckbox; CheckBoxPreference onlyFetchMvboxCheckbox; + private ActivityResultLauncher screenLockLauncher; @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); + // Register activity result launcher for screen lock + 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) -> { @@ -158,8 +171,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); - if (!result) { + if (!applyScreenLockWithLauncher()) { openRelayListActivity(); } return true; @@ -191,12 +203,17 @@ 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(); + private boolean applyScreenLockWithLauncher() { + android.app.KeyguardManager keyguardManager = (android.app.KeyguardManager) requireActivity().getSystemService(Context.KEYGUARD_SERVICE); + Intent intent; + if (keyguardManager != null) { + intent = keyguardManager.createConfirmDeviceCredentialIntent(getString(R.string.transports), getString(R.string.enter_system_secret_to_continue)); + if (intent != null) { + screenLockLauncher.launch(intent); + return true; + } } + return false; } protected File copyToCacheDir(Uri uri) throws IOException { diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index 607225eb6..1a86aedc6 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; @@ -30,11 +32,22 @@ import org.thoughtcrime.securesms.util.Util; public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { private ListPreference mediaQuality; private ListPreference autoDownload; + private ActivityResultLauncher screenLockLauncher; @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); + // Register activity result launcher for screen lock + 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) -> { @@ -113,14 +126,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) { final String quality; if (Prefs.isHardCompressionEnabled(context)) { @@ -131,6 +136,19 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { return context.getString(R.string.pref_outgoing_media_quality) + " " + quality; } + private boolean applyScreenLockWithLauncher() { + android.app.KeyguardManager keyguardManager = (android.app.KeyguardManager) requireActivity().getSystemService(Context.KEYGUARD_SERVICE); + Intent intent; + if (keyguardManager != null) { + intent = keyguardManager.createConfirmDeviceCredentialIntent(getString(R.string.pref_backup), getString(R.string.enter_system_secret_to_continue)); + if (intent != null) { + screenLockLauncher.launch(intent); + return true; + } + } + return false; + } + /*********************************************************************************************** * Backup **********************************************************************************************/ @@ -138,8 +156,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); - if (!result) { + if (!applyScreenLockWithLauncher()) { performBackup(); } return true; diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java index e6e282cd7..2e70c2dee 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; @@ -40,11 +42,30 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme private CheckBoxPreference notificationsEnabled; private CheckBoxPreference mentionNotifEnabled; private CheckBoxPreference reliableService; + private ActivityResultLauncher ringtonePickerLauncher; @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); + // Register activity result launcher for ringtone picker + 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) @@ -66,7 +87,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme 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 +158,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(); diff --git a/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java index 3e299cfd7..08960e2a9 100644 --- a/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java @@ -44,8 +44,6 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu private static final String KEY_IMAGE_URI = "image_uri"; - public static final int SELECT_STICKER_REQUEST_CODE = 123; - private EditorModel restoredModel; @Nullable @@ -195,12 +193,6 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu startTextEntityEditing(element, true); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - imageEditorHud.enterMode(ImageEditorHud.Mode.NONE); - } - @Override public void onModeStarted(@NonNull ImageEditorHud.Mode mode) { imageEditorView.setMode(ImageEditorView.Mode.MoveAndResize);