From 9cc5878347a8b92cfd3d076989ab1eca1923849a Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 27 Dec 2023 18:54:52 +0900 Subject: [PATCH] Moving initialization of pspdfkit from Application start to PdfReaderScreen to prevent app crash on app start due to problems with PSPDFKit Possible fix for pspdfkit not finding it's own binaries on some devices --- app/build.gradle.kts | 4 +++ app/src/main/AndroidManifest.xml | 6 ++--- .../org/zotero/android/ZoteroApplication.kt | 8 ------ .../phone/DashboardRootPhoneNavigation.kt | 7 +++-- .../DashboardRootTopLevelTabletNavigation.kt | 4 ++- .../zotero/android/pdf/PdfReaderNavigation.kt | 26 +++++++++++++++++-- 6 files changed, 39 insertions(+), 16 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 42cfaa3f..f74ec779 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -32,6 +32,10 @@ android { buildConfigField("boolean", "EVENT_AND_CRASH_LOGGING_ENABLED", "false") buildConfigField("String", "PSPDFKIT_KEY", "\"\"") manifestPlaceholders["enableCrashReporting"] = false + + ndk { + abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + } } signingConfigs { create("release") { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36541a7a..9fe18dc4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,9 +37,9 @@ tools:ignore="GoogleAppIndexingWarning" tools:replace="android:requestLegacyExternalStorage" tools:targetApi="n"> - - - + diff --git a/app/src/main/java/org/zotero/android/ZoteroApplication.kt b/app/src/main/java/org/zotero/android/ZoteroApplication.kt index ff56cdf6..1c7ddd93 100644 --- a/app/src/main/java/org/zotero/android/ZoteroApplication.kt +++ b/app/src/main/java/org/zotero/android/ZoteroApplication.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner import com.google.gson.Gson -import com.pspdfkit.PSPDFKit import dagger.hilt.android.HiltAndroidApp import org.zotero.android.BuildConfig.EVENT_AND_CRASH_LOGGING_ENABLED import org.zotero.android.api.ForGsonWithRoundedDecimals @@ -56,13 +55,6 @@ open class ZoteroApplication: Application(), DefaultLifecycleObserver { controllers.init() ProcessLifecycleOwner.get().lifecycle.addObserver(this) - initializePspdfKit() - } - - private fun initializePspdfKit() { - if (BuildConfig.PSPDFKIT_KEY.isNotBlank()) { - PSPDFKit.initialize(this, BuildConfig.PSPDFKIT_KEY) - } } override fun onStart(owner: LifecycleOwner) { diff --git a/app/src/main/java/org/zotero/android/architecture/navigation/phone/DashboardRootPhoneNavigation.kt b/app/src/main/java/org/zotero/android/architecture/navigation/phone/DashboardRootPhoneNavigation.kt index 966a2f33..f9e3c728 100644 --- a/app/src/main/java/org/zotero/android/architecture/navigation/phone/DashboardRootPhoneNavigation.kt +++ b/app/src/main/java/org/zotero/android/architecture/navigation/phone/DashboardRootPhoneNavigation.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavHostController import com.google.accompanist.insets.navigationBarsPadding import com.google.accompanist.navigation.animation.composable @@ -71,6 +72,8 @@ internal fun DashboardRootPhoneNavigation( val navigation = remember(navController) { ZoteroNavigation(navController, dispatcher) } + val context = LocalContext.current + Box{ Column(modifier = Modifier.background(color = CustomTheme.colors.surface)) { ZoteroNavHost( @@ -114,7 +117,7 @@ internal fun DashboardRootPhoneNavigation( navigateToZoterWebViewScreen = navigation::toZoteroWebViewScreen, navigateToTagFilter = navigation::toTagFilter, navigateToCollectionPicker = navigation::toCollectionPicker, - onShowPdf = navigation::toPdfScreen, + onShowPdf = { navigation.toPdfScreen(context) }, ) itemDetailsScreen( navigateToCreatorEdit = navigation::toCreatorEdit, @@ -128,7 +131,7 @@ internal fun DashboardRootPhoneNavigation( onOpenFile = onOpenFile, onOpenWebpage = onOpenWebpage, onPickFile = { onPickFile(EventBusConstants.FileWasSelected.CallPoint.ItemDetails) }, - onShowPdf = navigation::toPdfScreen, + onShowPdf = { navigation.toPdfScreen(context) }, ) composable( diff --git a/app/src/main/java/org/zotero/android/architecture/navigation/tablet/DashboardRootTopLevelTabletNavigation.kt b/app/src/main/java/org/zotero/android/architecture/navigation/tablet/DashboardRootTopLevelTabletNavigation.kt index 1c1965bf..1e04051c 100644 --- a/app/src/main/java/org/zotero/android/architecture/navigation/tablet/DashboardRootTopLevelTabletNavigation.kt +++ b/app/src/main/java/org/zotero/android/architecture/navigation/tablet/DashboardRootTopLevelTabletNavigation.kt @@ -6,6 +6,7 @@ import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavGraphBuilder import com.google.accompanist.insets.navigationBarsPadding import com.google.accompanist.navigation.animation.composable @@ -31,6 +32,7 @@ internal fun DashboardRootTopLevelTabletNavigation( onOpenWebpage: (uri: Uri) -> Unit, viewModel: DashboardViewModel, ) { + val context = LocalContext.current val navController = rememberAnimatedNavController() val dispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher val navigation = remember(navController) { @@ -47,7 +49,7 @@ internal fun DashboardRootTopLevelTabletNavigation( onOpenFile = onOpenFile, onOpenWebpage = onOpenWebpage, viewModel = viewModel, - onShowPdf = navigation::toPdfScreen, + onShowPdf = { navigation.toPdfScreen(context) }, toAddOrEditNote = navigation::toAddOrEditNote, toZoteroWebViewScreen = navigation::toZoteroWebViewScreen, ) diff --git a/app/src/main/java/org/zotero/android/pdf/PdfReaderNavigation.kt b/app/src/main/java/org/zotero/android/pdf/PdfReaderNavigation.kt index d148f1b9..2085607b 100644 --- a/app/src/main/java/org/zotero/android/pdf/PdfReaderNavigation.kt +++ b/app/src/main/java/org/zotero/android/pdf/PdfReaderNavigation.kt @@ -1,12 +1,16 @@ package org.zotero.android.pdf +import android.content.Context import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.width import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder import com.google.accompanist.navigation.animation.composable +import com.pspdfkit.PSPDFKit +import org.zotero.android.BuildConfig +import org.zotero.android.androidx.content.longToast import org.zotero.android.architecture.navigation.ZoteroNavigation import org.zotero.android.architecture.navigation.dialogFixedDimens import org.zotero.android.pdf.annotation.PdfAnnotationNavigation @@ -21,6 +25,7 @@ import org.zotero.android.pdf.settings.PdfSettingsScreen import org.zotero.android.pdffilter.PdfFilterNavigation import org.zotero.android.pdffilter.pdfFilterNavScreens import org.zotero.android.pdffilter.toPdfFilterScreen +import timber.log.Timber internal fun NavGraphBuilder.pdfReaderScreenAndNavigationForTablet( navigation: ZoteroNavigation, @@ -150,8 +155,25 @@ private object PdfReaderDestinations { const val PDF_ANNOTATION_MORE_NAVIGATION = "pdfAnnotationMoreNavigation" } -fun ZoteroNavigation.toPdfScreen() { - navController.navigate(PdfReaderDestinations.PDF_SCREEN) +fun ZoteroNavigation.toPdfScreen(context: Context) { + if (initializePspdfKit(context)) { + navController.navigate(PdfReaderDestinations.PDF_SCREEN) + } +} + +private fun initializePspdfKit(context: Context): Boolean { + try { + if (BuildConfig.PSPDFKIT_KEY.isNotBlank()) { + PSPDFKit.initialize(context, BuildConfig.PSPDFKIT_KEY) + } else { + PSPDFKit.initialize(context, null) + } + } catch (e: Exception) { + Timber.e(e, "Unable to initialize PSPDFKIT") + context.longToast("Unable to initialize PSPDFKIT") + return false + } + return true } private fun ZoteroNavigation.toPdfFilterNavigation() {