From 93805343991ab735c5a59f54c593115ebe4337c4 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 10 Oct 2023 16:47:23 +0200 Subject: [PATCH 01/21] use more permissive mime type in key selection --- .../securesms/preferences/AdvancedPreferenceFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 30c165d60..99f917b82 100644 --- a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -373,7 +373,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment } else { if (Build.VERSION.SDK_INT >= 30) { - AttachmentManager.selectMediaType(getActivity(), "application/pgp-keys", new String[]{"text/plain"}, PICK_SELF_KEYS, StorageUtil.getDownloadUri()); + AttachmentManager.selectMediaType(getActivity(), "*/*", null, PICK_SELF_KEYS, StorageUtil.getDownloadUri()); } else { String path = DcHelper.getImexDir().getAbsolutePath(); showImportKeysDialog(path, path); From 65254c030cd1419fb726bd02702058cebe95439e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 11 Oct 2023 18:14:14 +0200 Subject: [PATCH 02/21] avoid NullPointerException in ConversationListFragment.updateReminders() --- .../thoughtcrime/securesms/ConversationListFragment.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListFragment.java b/src/org/thoughtcrime/securesms/ConversationListFragment.java index 20e96ef28..9fdb7e443 100644 --- a/src/org/thoughtcrime/securesms/ConversationListFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationListFragment.java @@ -254,6 +254,8 @@ public class ConversationListFragment extends Fragment @SuppressLint({"StaticFieldLeak", "NewApi"}) private void updateReminders() { + // by the time onPostExecute() is asynchronously run, getActivity() might return null, so get the activity here: + Activity activity = getActivity(); new AsyncTask() { @Override protected Void doInBackground(Context... params) { @@ -270,7 +272,6 @@ public class ConversationListFragment extends Fragment @Override protected void onPostExecute(Void result) { - Activity activity = ConversationListFragment.this.getActivity(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (!Prefs.getBooleanPreference(activity, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, false)) { Prefs.setBooleanPreference(activity, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, true); @@ -278,7 +279,7 @@ public class ConversationListFragment extends Fragment .request(Manifest.permission.POST_NOTIFICATIONS) .ifNecessary() .onAllGranted(() -> { - DozeReminder.maybeAskDirectly(getActivity()); + DozeReminder.maybeAskDirectly(activity); }) .onAnyDenied(() -> { final DcContext dcContext = DcHelper.getContext(activity); @@ -290,10 +291,10 @@ public class ConversationListFragment extends Fragment .execute(); } } else { - DozeReminder.maybeAskDirectly(getActivity()); + DozeReminder.maybeAskDirectly(activity); } } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getActivity()); + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, activity); } private void handlePinAllSelected() { From b0c473378d95ffdec0629dad2c7ffd83a9b49add Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 11 Oct 2023 20:40:39 +0200 Subject: [PATCH 03/21] tweak action bar theme for dark mode --- res/values-night/colors.xml | 2 ++ res/values/themes.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml index 9c1530a47..b4c595e89 100644 --- a/res/values-night/colors.xml +++ b/res/values-night/colors.xml @@ -6,4 +6,6 @@ #ff282828 @color/reaction_pill_border @color/reaction_pill_text_color + + @color/gray95 diff --git a/res/values/themes.xml b/res/values/themes.xml index d1be60280..39b60ca92 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -198,7 +198,7 @@ @style/TextSecure.DarkActionBar @style/TextSecure.DarkActionBar.TabBar @style/ThemeOverlay.AppCompat.Dark - @color/gray50 + @color/gray78 @color/text_color_dark_theme @color/text_color_secondary_dark_theme From 9b9d2e4daa7fb6b0976a3fefdf845f28941dca3c Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 9 Oct 2023 18:01:57 +0200 Subject: [PATCH 04/21] READ_EXTERNAL_STORAGE permission is still needed for + From 0588b07e526423daf2b9f4532c631ddc3cb09068 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 9 Oct 2023 18:21:53 +0200 Subject: [PATCH 05/21] factor out 'always grant on sdk 33' --- .../securesms/LogViewActivity.java | 1 + .../securesms/MediaPreviewActivity.java | 1 + .../securesms/MessageSelectorFragment.java | 1 + .../thoughtcrime/securesms/ShareActivity.java | 1 + .../securesms/WelcomeActivity.java | 1 + .../securesms/mms/AttachmentManager.java | 1 + .../securesms/permissions/Permissions.java | 22 ++++++++++--------- .../AdvancedPreferenceFragment.java | 1 + .../preferences/ChatsPreferenceFragment.java | 1 + 9 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/org/thoughtcrime/securesms/LogViewActivity.java b/src/org/thoughtcrime/securesms/LogViewActivity.java index 315390b59..1a4ec70b8 100644 --- a/src/org/thoughtcrime/securesms/LogViewActivity.java +++ b/src/org/thoughtcrime/securesms/LogViewActivity.java @@ -56,6 +56,7 @@ public class LogViewActivity extends BaseActionBarActivity { case R.id.save_log: Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .onAllGranted(() -> { boolean success = logViewFragment.saveLogFile(); diff --git a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java index 26acf07b6..d0c2b30be 100644 --- a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java +++ b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java @@ -305,6 +305,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { diff --git a/src/org/thoughtcrime/securesms/MessageSelectorFragment.java b/src/org/thoughtcrime/securesms/MessageSelectorFragment.java index 3451ceb05..cdc70d23b 100644 --- a/src/org/thoughtcrime/securesms/MessageSelectorFragment.java +++ b/src/org/thoughtcrime/securesms/MessageSelectorFragment.java @@ -86,6 +86,7 @@ public abstract class MessageSelectorFragment Permissions.with(getActivity()) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> performSave(messageRecords)) diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index 92710d00f..cce5517b3 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -138,6 +138,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement private void requestPermissionForFiles(List streamExtras) { Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> resolveUris(streamExtras)) diff --git a/src/org/thoughtcrime/securesms/WelcomeActivity.java b/src/org/thoughtcrime/securesms/WelcomeActivity.java index 8f8505caf..f6ed9e172 100644 --- a/src/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/org/thoughtcrime/securesms/WelcomeActivity.java @@ -170,6 +170,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen private void startImportBackup() { Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java index b14fd1f14..0077fecce 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -464,6 +464,7 @@ public class AttachmentManager { public static void selectAudio(Activity activity, int requestCode) { Permissions.with(activity) .request(Manifest.permission.READ_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(activity.getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> selectMediaType(activity, "audio/*", null, requestCode)) diff --git a/src/org/thoughtcrime/securesms/permissions/Permissions.java b/src/org/thoughtcrime/securesms/permissions/Permissions.java index caee223ac..f94877e58 100644 --- a/src/org/thoughtcrime/securesms/permissions/Permissions.java +++ b/src/org/thoughtcrime/securesms/permissions/Permissions.java @@ -80,6 +80,8 @@ public class Permissions { private boolean condition = true; + private boolean alwaysGranted = false; + PermissionsBuilder(PermissionObject permissionObject) { this.permissionObject = permissionObject; } @@ -100,6 +102,13 @@ public class Permissions { return this; } + public PermissionsBuilder alwaysGrantOnSdk33() { + if (Build.VERSION.SDK_INT >= 33) { + alwaysGranted = true; + } + return this; + } + public PermissionsBuilder withRationaleDialog(@NonNull String message, @NonNull @DrawableRes int... headers) { this.rationalDialogHeader = headers; this.rationaleDialogMessage = message; @@ -147,16 +156,9 @@ public class Permissions { } public void execute() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - // READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE does not exist on modern androids - // as file access is done by pickers - String[] r = requestedPermissions; - Arrays.sort(r); - if ( (r.length == 1 && (r[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) || r[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE))) - || (r.length == 2 && r[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) && r[1].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) ) { - allGrantedListener.run(); - return; - } + if (alwaysGranted) { + allGrantedListener.run(); + return; } PermissionsRequest request = new PermissionsRequest(allGrantedListener, anyDeniedListener, anyPermanentlyDeniedListener, anyResultListener, diff --git a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 99f917b82..22058f907 100644 --- a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -353,6 +353,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment private void exportKeys() { Permissions.with(getActivity()) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { diff --git a/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index 967b937a2..5d85b3b6b 100644 --- a/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java @@ -267,6 +267,7 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { private void performBackup() { Permissions.with(getActivity()) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .alwaysGrantOnSdk33() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { From b38dbd67977c59a89320d908dc17feaf78a81e5b Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 9 Oct 2023 18:26:58 +0200 Subject: [PATCH 06/21] fix welcome for android 11 --- src/org/thoughtcrime/securesms/WelcomeActivity.java | 2 +- .../thoughtcrime/securesms/permissions/Permissions.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/WelcomeActivity.java b/src/org/thoughtcrime/securesms/WelcomeActivity.java index f6ed9e172..2f0f2344a 100644 --- a/src/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/org/thoughtcrime/securesms/WelcomeActivity.java @@ -170,7 +170,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen private void startImportBackup() { Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { diff --git a/src/org/thoughtcrime/securesms/permissions/Permissions.java b/src/org/thoughtcrime/securesms/permissions/Permissions.java index f94877e58..c009ad693 100644 --- a/src/org/thoughtcrime/securesms/permissions/Permissions.java +++ b/src/org/thoughtcrime/securesms/permissions/Permissions.java @@ -102,6 +102,13 @@ public class Permissions { return this; } + public PermissionsBuilder alwaysGrantOnSdk30() { + if (Build.VERSION.SDK_INT >= 30) { + alwaysGranted = true; + } + return this; + } + public PermissionsBuilder alwaysGrantOnSdk33() { if (Build.VERSION.SDK_INT >= 33) { alwaysGranted = true; From 321c8db1e175f7dfea65945054e52a658ff995d6 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 9 Oct 2023 23:36:13 +0200 Subject: [PATCH 07/21] support writings backups and logs on android11 --- src/org/thoughtcrime/securesms/LogViewActivity.java | 2 +- .../securesms/preferences/ChatsPreferenceFragment.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/thoughtcrime/securesms/LogViewActivity.java b/src/org/thoughtcrime/securesms/LogViewActivity.java index 1a4ec70b8..db725e87a 100644 --- a/src/org/thoughtcrime/securesms/LogViewActivity.java +++ b/src/org/thoughtcrime/securesms/LogViewActivity.java @@ -56,7 +56,7 @@ public class LogViewActivity extends BaseActionBarActivity { case R.id.save_log: Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .alwaysGrantOnSdk30() .ifNecessary() .onAllGranted(() -> { boolean success = logViewFragment.saveLogFile(); diff --git a/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index 5d85b3b6b..c2c320fd8 100644 --- a/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java @@ -266,8 +266,8 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { private void performBackup() { Permissions.with(getActivity()) - .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { From 53ee08418699474e079049c2aced81056587b08f Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 9 Oct 2023 23:40:13 +0200 Subject: [PATCH 08/21] import needs READ access only --- src/org/thoughtcrime/securesms/WelcomeActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/WelcomeActivity.java b/src/org/thoughtcrime/securesms/WelcomeActivity.java index 2f0f2344a..3db9c4715 100644 --- a/src/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/org/thoughtcrime/securesms/WelcomeActivity.java @@ -169,7 +169,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen @SuppressLint("InlinedApi") private void startImportBackup() { Permissions.with(this) - .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .request(Manifest.permission.READ_EXTERNAL_STORAGE) .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) From d18ead79dab1342f03c265e6fbcfe97ec0322637 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 9 Oct 2023 23:50:29 +0200 Subject: [PATCH 09/21] use manageKeys() as name for the import/export keys function (exportKeys() is misleading) --- .../securesms/preferences/AdvancedPreferenceFragment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 22058f907..59890f07e 100644 --- a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -191,7 +191,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) return; if (requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS_KEYS) { - exportKeys(); + manageKeys(); } else if (requestCode == PICK_SELF_KEYS) { Uri uri = (data != null ? data.getData() : null); if (uri == null) { @@ -344,13 +344,13 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment public boolean onPreferenceClick(Preference preference) { boolean result = ScreenLockUtil.applyScreenLock(getActivity(), getString(R.string.pref_manage_keys), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_KEYS); if (!result) { - exportKeys(); + manageKeys(); } return true; } } - private void exportKeys() { + private void manageKeys() { Permissions.with(getActivity()) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) .alwaysGrantOnSdk33() From 4d82d04e1f36d8526707902074a6c1628ae465f6 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Tue, 10 Oct 2023 00:04:10 +0200 Subject: [PATCH 10/21] adapt media export, key import/export --- src/org/thoughtcrime/securesms/MediaPreviewActivity.java | 2 +- src/org/thoughtcrime/securesms/MessageSelectorFragment.java | 2 +- .../securesms/preferences/AdvancedPreferenceFragment.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java index d0c2b30be..664f878e8 100644 --- a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java +++ b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java @@ -305,7 +305,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity Permissions.with(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { diff --git a/src/org/thoughtcrime/securesms/MessageSelectorFragment.java b/src/org/thoughtcrime/securesms/MessageSelectorFragment.java index cdc70d23b..c7a95a1cf 100644 --- a/src/org/thoughtcrime/securesms/MessageSelectorFragment.java +++ b/src/org/thoughtcrime/securesms/MessageSelectorFragment.java @@ -86,7 +86,7 @@ public abstract class MessageSelectorFragment Permissions.with(getActivity()) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> performSave(messageRecords)) diff --git a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 59890f07e..048f462f9 100644 --- a/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -353,7 +353,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment private void manageKeys() { Permissions.with(getActivity()) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> { From aa8fc5f02c74b978c02af4443018aea2047e03a0 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 12 Oct 2023 13:57:23 +0200 Subject: [PATCH 11/21] explain asking for gallery permissions --- src/org/thoughtcrime/securesms/mms/AttachmentManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java index 0077fecce..2180f5958 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -444,6 +444,10 @@ public class AttachmentManager { } public static void selectGallery(Activity activity, int requestCode) { + // to enable camera roll, + // we're asking for "gallery permissions" also on newer systems that do not strictly require that. + // (asking directly after tapping "attachment" would be not-so-good as the user may want to attach sth. else + // and asking for permissions is better done on-point) Permissions.with(activity) .request(Permissions.galleryPermissions()) .ifNecessary() From 4697ed2c295c922b37f49f7eda16c90c495b4a98 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 12 Oct 2023 15:57:06 +0200 Subject: [PATCH 12/21] keep asking for READ_EXTERNAL_STORAGE on backup export (may be needed for getting a fine file name) --- .../securesms/preferences/ChatsPreferenceFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index c2c320fd8..e823f41e9 100644 --- a/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java +++ b/src/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java @@ -266,7 +266,7 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { private void performBackup() { Permissions.with(getActivity()) - .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) // READ_EXTERNAL_STORAGE required to read folder contents and to generate backup names .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) From 5442d48998c7f2741f9b96428bec20533eb2ba24 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 12 Oct 2023 16:17:19 +0200 Subject: [PATCH 13/21] attaching audio is same as attaching files --- src/org/thoughtcrime/securesms/mms/AttachmentManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java index 2180f5958..35f7d7aaa 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -468,7 +468,7 @@ public class AttachmentManager { public static void selectAudio(Activity activity, int requestCode) { Permissions.with(activity) .request(Manifest.permission.READ_EXTERNAL_STORAGE) - .alwaysGrantOnSdk33() + .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(activity.getString(R.string.perm_explain_access_to_storage_denied)) .onAllGranted(() -> selectMediaType(activity, "audio/*", null, requestCode)) From 8c93155e4ab01750eb8123eef56f6d897e58491c Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 12 Oct 2023 16:21:14 +0200 Subject: [PATCH 14/21] do not change things on import-backups on older androids --- src/org/thoughtcrime/securesms/WelcomeActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/WelcomeActivity.java b/src/org/thoughtcrime/securesms/WelcomeActivity.java index 3db9c4715..2f0f2344a 100644 --- a/src/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/org/thoughtcrime/securesms/WelcomeActivity.java @@ -169,7 +169,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen @SuppressLint("InlinedApi") private void startImportBackup() { Permissions.with(this) - .request(Manifest.permission.READ_EXTERNAL_STORAGE) + .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) .alwaysGrantOnSdk30() .ifNecessary() .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) From 54591994c395c3b74d15d9355bf3304cfd5fb22b Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 12 Oct 2023 17:55:58 +0200 Subject: [PATCH 15/21] update dcContext in ConversationListAdapter.changeData() --- .../securesms/ConversationListAdapter.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListAdapter.java b/src/org/thoughtcrime/securesms/ConversationListAdapter.java index 8eb5156c1..84d26f5d9 100644 --- a/src/org/thoughtcrime/securesms/ConversationListAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationListAdapter.java @@ -34,7 +34,6 @@ import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.ViewUtil; -import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashSet; import java.util.Locale; @@ -51,8 +50,8 @@ class ConversationListAdapter extends RecyclerView.Adapter { private static final int MESSAGE_TYPE_THREAD = 2; private static final int MESSAGE_TYPE_INBOX_ZERO = 3; - private final WeakReference context; - private final @NonNull DcContext dcContext; + private final Context context; + private @NonNull DcContext dcContext; private @NonNull DcChatlist dcChatlist; private final @NonNull GlideRequests glideRequests; private final @NonNull Locale locale; @@ -89,7 +88,7 @@ class ConversationListAdapter extends RecyclerView.Adapter { @Nullable ItemClickListener clickListener) { super(); - this.context = new WeakReference<>(context); + this.context = context; this.glideRequests = glideRequests; this.dcContext = DcHelper.getContext(context); this.dcChatlist = new DcChatlist(0, 0); @@ -132,11 +131,6 @@ class ConversationListAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { - Context context = this.context.get(); - if (context == null) { - return; - } - ViewHolder holder = (ViewHolder)viewHolder; DcChat chat = dcContext.getChat(dcChatlist.getChatId(i)); DcLot summary = dcChatlist.getSummary(i, chat); @@ -195,7 +189,12 @@ class ConversationListAdapter extends RecyclerView.Adapter { } void changeData(@Nullable DcChatlist chatlist) { - dcChatlist = chatlist == null ? new DcChatlist(0, 0) : chatlist; + if (chatlist == null) { + dcChatlist = new DcChatlist(0, 0); + } else { + dcChatlist = chatlist; + dcContext = DcHelper.getAccounts(context).getAccount(chatlist.getAccountId()); + } notifyDataSetChanged(); } } From d97777cf66c24c736fcd7adb1c18117c2f14b298 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 12 Oct 2023 19:06:41 +0200 Subject: [PATCH 16/21] add comment in SearchListAdapter --- src/org/thoughtcrime/securesms/search/SearchListAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/search/SearchListAdapter.java b/src/org/thoughtcrime/securesms/search/SearchListAdapter.java index 6b3d1429d..7923822a3 100644 --- a/src/org/thoughtcrime/securesms/search/SearchListAdapter.java +++ b/src/org/thoughtcrime/securesms/search/SearchListAdapter.java @@ -40,7 +40,7 @@ class SearchListAdapter extends RecyclerView.Adapter Date: Thu, 12 Oct 2023 19:13:16 +0200 Subject: [PATCH 17/21] add back WeakReference --- .../securesms/ConversationListAdapter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListAdapter.java b/src/org/thoughtcrime/securesms/ConversationListAdapter.java index 84d26f5d9..ea6e42412 100644 --- a/src/org/thoughtcrime/securesms/ConversationListAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationListAdapter.java @@ -34,6 +34,7 @@ import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.ViewUtil; +import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashSet; import java.util.Locale; @@ -50,7 +51,7 @@ class ConversationListAdapter extends RecyclerView.Adapter { private static final int MESSAGE_TYPE_THREAD = 2; private static final int MESSAGE_TYPE_INBOX_ZERO = 3; - private final Context context; + private final WeakReference context; private @NonNull DcContext dcContext; private @NonNull DcChatlist dcChatlist; private final @NonNull GlideRequests glideRequests; @@ -88,7 +89,7 @@ class ConversationListAdapter extends RecyclerView.Adapter { @Nullable ItemClickListener clickListener) { super(); - this.context = context; + this.context = new WeakReference<>(context); this.glideRequests = glideRequests; this.dcContext = DcHelper.getContext(context); this.dcChatlist = new DcChatlist(0, 0); @@ -131,6 +132,11 @@ class ConversationListAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { + Context context = this.context.get(); + if (context == null) { + return; + } + ViewHolder holder = (ViewHolder)viewHolder; DcChat chat = dcContext.getChat(dcChatlist.getChatId(i)); DcLot summary = dcChatlist.getSummary(i, chat); From eff3c3cf4f41a270effe090f555287bbc61799bf Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 12 Oct 2023 19:50:06 +0200 Subject: [PATCH 18/21] remove unnecesary code in ChatBackgroundActivity --- .../securesms/preferences/ChatBackgroundActivity.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/org/thoughtcrime/securesms/preferences/ChatBackgroundActivity.java b/src/org/thoughtcrime/securesms/preferences/ChatBackgroundActivity.java index dea68ce2d..a120f65a7 100644 --- a/src/org/thoughtcrime/securesms/preferences/ChatBackgroundActivity.java +++ b/src/org/thoughtcrime/securesms/preferences/ChatBackgroundActivity.java @@ -38,7 +38,6 @@ public class ChatBackgroundActivity extends PassphraseRequiredActionBarActivity Button galleryButton; Button defaultButton; - MenuItem acceptMenuItem; ImageView preview; String tempDestinationPath; @@ -80,7 +79,6 @@ public class ChatBackgroundActivity extends PassphraseRequiredActionBarActivity MenuInflater inflater = this.getMenuInflater(); menu.clear(); inflater.inflate(R.menu.chat_background, menu); - acceptMenuItem = menu.findItem(R.id.apply_background); super.onPrepareOptionsMenu(menu); return true; } @@ -173,7 +171,6 @@ public class ChatBackgroundActivity extends PassphraseRequiredActionBarActivity if (data != null && context != null && resultCode == RESULT_OK && requestCode == ApplicationPreferencesActivity.REQUEST_CODE_SET_BACKGROUND) { imageUri = data.getData(); if (imageUri != null) { - acceptMenuItem.setEnabled(true); Thread thread = new Thread(){ @Override public void run() { From 7ef7aba4a1ff4dfae14c85feee27875c2db9c87a Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 12 Oct 2023 19:57:46 +0200 Subject: [PATCH 19/21] fix context weak reference usage --- src/org/thoughtcrime/securesms/ConversationListAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListAdapter.java b/src/org/thoughtcrime/securesms/ConversationListAdapter.java index ea6e42412..009c9c1f7 100644 --- a/src/org/thoughtcrime/securesms/ConversationListAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationListAdapter.java @@ -199,7 +199,7 @@ class ConversationListAdapter extends RecyclerView.Adapter { dcChatlist = new DcChatlist(0, 0); } else { dcChatlist = chatlist; - dcContext = DcHelper.getAccounts(context).getAccount(chatlist.getAccountId()); + dcContext = DcHelper.getAccounts(context.get()).getAccount(chatlist.getAccountId()); } notifyDataSetChanged(); } From 1553c411475f12b65fcd3aa3ec47e4181d6fc1c4 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 12 Oct 2023 21:33:25 +0200 Subject: [PATCH 20/21] get global DcContext instance from ApplicationContext --- src/org/thoughtcrime/securesms/ConversationListAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListAdapter.java b/src/org/thoughtcrime/securesms/ConversationListAdapter.java index 009c9c1f7..f5c5112d9 100644 --- a/src/org/thoughtcrime/securesms/ConversationListAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationListAdapter.java @@ -199,7 +199,7 @@ class ConversationListAdapter extends RecyclerView.Adapter { dcChatlist = new DcChatlist(0, 0); } else { dcChatlist = chatlist; - dcContext = DcHelper.getAccounts(context.get()).getAccount(chatlist.getAccountId()); + dcContext = DcHelper.getContext(context.get()); } notifyDataSetChanged(); } From 4a59e2cfd3fc1d36de18bc66b41dfdc8c85e9e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asiel=20D=C3=ADaz=20Ben=C3=ADtez?= Date: Thu, 12 Oct 2023 16:01:42 -0400 Subject: [PATCH 21/21] Update src/org/thoughtcrime/securesms/ConversationListAdapter.java Co-authored-by: bjoern --- src/org/thoughtcrime/securesms/ConversationListAdapter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListAdapter.java b/src/org/thoughtcrime/securesms/ConversationListAdapter.java index f5c5112d9..4b502a301 100644 --- a/src/org/thoughtcrime/securesms/ConversationListAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationListAdapter.java @@ -195,11 +195,15 @@ class ConversationListAdapter extends RecyclerView.Adapter { } void changeData(@Nullable DcChatlist chatlist) { + Context context = this.context.get(); + if (context == null) { + return; + } if (chatlist == null) { dcChatlist = new DcChatlist(0, 0); } else { dcChatlist = chatlist; - dcContext = DcHelper.getContext(context.get()); + dcContext = DcHelper.getContext(context); } notifyDataSetChanged(); }