From 23316f5e9ccb12cd90d6686400effc57f72ab9a4 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 18 Apr 2022 15:42:24 +0100 Subject: [PATCH] Don't use OPEN_DOCUMENT launchers on API < 19. --- .../conversation/ConversationActivity.java | 8 +++---- .../removabledrive/ReceiveFragment.java | 2 ++ .../android/removabledrive/SendFragment.java | 2 ++ .../android/settings/SettingsFragment.java | 7 ++++-- .../briar/android/util/ActivityLaunchers.java | 9 +++++--- .../briar/android/util/UiUtils.java | 23 +++++++++++-------- 6 files changed, 31 insertions(+), 20 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 12ca3077b..80a912178 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -58,7 +58,6 @@ import org.briarproject.briar.android.privategroup.conversation.GroupActivity; import org.briarproject.briar.android.removabledrive.RemovableDriveActivity; import org.briarproject.briar.android.util.ActivityLaunchers.GetImageAdvanced; import org.briarproject.briar.android.util.ActivityLaunchers.GetMultipleImagesAdvanced; -import org.briarproject.briar.android.util.ActivityLaunchers.OpenImageDocumentAdvanced; import org.briarproject.briar.android.util.ActivityLaunchers.OpenMultipleImageDocumentsAdvanced; import org.briarproject.briar.android.util.BriarSnackbarBuilder; import org.briarproject.briar.android.view.BriarRecyclerView; @@ -199,12 +198,11 @@ public class ConversationActivity extends BriarActivity requireNonNull(name); loadMessages(); }; - private final ActivityResultLauncher docLauncher = SDK_INT >= 18 ? + @Nullable + private final ActivityResultLauncher docLauncher = SDK_INT >= 19 ? registerForActivityResult(new OpenMultipleImageDocumentsAdvanced(), this::onImagesChosen) : - registerForActivityResult(new OpenImageDocumentAdvanced(), uri -> { - if (uri != null) onImagesChosen(singletonList(uri)); - }); + null; private final ActivityResultLauncher contentLauncher = SDK_INT >= 18 ? registerForActivityResult(new GetMultipleImagesAdvanced(), diff --git a/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/ReceiveFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/ReceiveFragment.java index a8e31fd74..548382d1c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/ReceiveFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/ReceiveFragment.java @@ -21,6 +21,7 @@ import javax.inject.Inject; import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.ViewModelProvider; @@ -31,6 +32,7 @@ import static android.widget.Toast.LENGTH_LONG; import static org.briarproject.briar.android.AppModule.getAndroidComponent; import static org.briarproject.briar.android.util.UiUtils.launchActivityToOpenFile; +@RequiresApi(19) @MethodsNotNullByDefault @ParametersNotNullByDefault public class ReceiveFragment extends Fragment { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/SendFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/SendFragment.java index 15caf6b54..f42bdcef7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/SendFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/SendFragment.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.ViewModelProvider; @@ -38,6 +39,7 @@ import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.briar.android.AppModule.getAndroidComponent; +@RequiresApi(19) @MethodsNotNullByDefault @ParametersNotNullByDefault public class SendFragment extends Fragment { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java index d516b2daf..348fcc4ac 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java @@ -24,6 +24,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceGroup; +import static android.os.Build.VERSION.SDK_INT; import static java.util.Objects.requireNonNull; import static org.briarproject.briar.android.AppModule.getAndroidComponent; import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; @@ -48,9 +49,11 @@ public class SettingsFragment extends PreferenceFragmentCompat { private SettingsViewModel viewModel; private AvatarPreference prefAvatar; - private final ActivityResultLauncher docLauncher = + @Nullable + private final ActivityResultLauncher docLauncher = SDK_INT >= 19 ? registerForActivityResult(new OpenImageDocumentAdvanced(), - this::onImageSelected); + this::onImageSelected) : + null; private final ActivityResultLauncher contentLauncher = registerForActivityResult(new GetImageAdvanced(), this::onImageSelected); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/ActivityLaunchers.java b/briar-android/src/main/java/org/briarproject/briar/android/util/ActivityLaunchers.java index 24aa5fb9b..f71755596 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/util/ActivityLaunchers.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/util/ActivityLaunchers.java @@ -1,6 +1,5 @@ package org.briarproject.briar.android.util; -import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; @@ -14,6 +13,7 @@ import androidx.activity.result.contract.ActivityResultContracts.OpenDocument; import androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import static android.app.Activity.RESULT_CANCELED; import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE; @@ -26,6 +26,7 @@ import static org.briarproject.bramble.util.AndroidUtils.getSupportedImageConten @NotNullByDefault public class ActivityLaunchers { + @RequiresApi(19) public static class CreateDocumentAdvanced extends CreateDocument { @NonNull @Override @@ -47,6 +48,7 @@ public class ActivityLaunchers { } } + @RequiresApi(19) public static class OpenDocumentAdvanced extends OpenDocument { @NonNull @Override @@ -73,7 +75,7 @@ public class ActivityLaunchers { } } - @TargetApi(18) + @RequiresApi(18) public static class GetMultipleImagesAdvanced extends GetMultipleContents { @NonNull @Override @@ -88,6 +90,7 @@ public class ActivityLaunchers { } } + @RequiresApi(19) public static class OpenImageDocumentAdvanced extends OpenDocument { @NonNull @Override @@ -102,7 +105,7 @@ public class ActivityLaunchers { } } - @TargetApi(18) + @RequiresApi(19) public static class OpenMultipleImageDocumentsAdvanced extends OpenMultipleDocuments { @NonNull diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java index 21ad79a1e..9c59633aa 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java @@ -607,21 +607,24 @@ public class UiUtils { } public static void launchActivityToOpenFile(Context ctx, - ActivityResultLauncher docLauncher, + @Nullable ActivityResultLauncher docLauncher, ActivityResultLauncher contentLauncher, String contentType) { - // Try OPEN_DOCUMENT, fall back to GET_CONTENT + // Try OPEN_DOCUMENT if available, fall back to GET_CONTENT + if (docLauncher != null) { + try { + docLauncher.launch(new String[] {contentType}); + return; + } catch (ActivityNotFoundException e) { + logException(LOG, WARNING, e); + } + } try { - docLauncher.launch(new String[] {contentType}); + contentLauncher.launch(contentType); } catch (ActivityNotFoundException e) { logException(LOG, WARNING, e); - try { - contentLauncher.launch(contentType); - } catch (ActivityNotFoundException e1) { - logException(LOG, WARNING, e); - Toast.makeText(ctx, R.string.error_start_activity, - LENGTH_LONG).show(); - } + Toast.makeText(ctx, R.string.error_start_activity, + LENGTH_LONG).show(); } } }