From 6715a89a251904a2e727baecc79a749129d1dbbc Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 30 Jun 2019 00:45:59 -0400 Subject: [PATCH] Disable default CameraX initializer. CameraX was initializing Camera2 API stuff on API < 21, causing crashes at boot. To handle this, we disable the default ContentProvider initializer and initialize things ourselves for appropriate API levels. --- AndroidManifest.xml | 5 +++++ .../securesms/ApplicationContext.java | 15 +++++++++++++++ .../securesms/mediasend/CameraFragment.java | 5 ++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d213a5dab5..b06617ec3d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -616,6 +616,11 @@ android:authorities="org.thoughtcrime.securesms.database.stickerpack" android:exported="false" /> + + diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 5266d98935..bad17e383f 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -17,6 +17,9 @@ package org.thoughtcrime.securesms; import android.annotation.SuppressLint; + +import androidx.camera.camera2.Camera2AppConfig; +import androidx.camera.core.CameraX; import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ProcessLifecycleOwner; @@ -126,6 +129,7 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc initializePendingMessages(); initializeUnidentifiedDeliveryAbilityRefresh(); initializeBlobProvider(); + initializeCameraX(); NotificationChannels.create(this); ProcessLifecycleOwner.get().getLifecycle().addObserver(this); } @@ -357,6 +361,17 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc }); } + @SuppressLint("RestrictedApi") + private void initializeCameraX() { + if (Build.VERSION.SDK_INT >= 21) { + try { + CameraX.init(this, Camera2AppConfig.create(this)); + } catch (Throwable t) { + Log.w(TAG, "Failed to initialize CameraX."); + } + } + } + @Override protected void attachBaseContext(Context base) { super.attachBaseContext(DynamicLanguageContextWrapper.updateContext(base, TextSecurePreferences.getLanguage(base))); diff --git a/src/org/thoughtcrime/securesms/mediasend/CameraFragment.java b/src/org/thoughtcrime/securesms/mediasend/CameraFragment.java index bc518cbc75..198d5c192d 100644 --- a/src/org/thoughtcrime/securesms/mediasend/CameraFragment.java +++ b/src/org/thoughtcrime/securesms/mediasend/CameraFragment.java @@ -1,14 +1,17 @@ package org.thoughtcrime.securesms.mediasend; +import android.annotation.SuppressLint; import android.os.Build; import androidx.annotation.NonNull; +import androidx.camera.core.CameraX; import androidx.fragment.app.Fragment; public interface CameraFragment { + @SuppressLint("RestrictedApi") static Fragment newInstance() { - if (Build.VERSION.SDK_INT >= 21) { + if (Build.VERSION.SDK_INT >= 21 && CameraX.isInitialized()) { return CameraXFragment.newInstance(); } else { return Camera1Fragment.newInstance();