From 7851629a27f01c65a81d26e308e94a2b13acf2e5 Mon Sep 17 00:00:00 2001 From: Vasil Chimev Date: Wed, 23 May 2018 14:59:24 +0300 Subject: [PATCH] fix: crash at application launch on Android P (#5831) * fix: crash at application launch on Android P Reference: https://developer.android.com/preview/restrictions-non-sdk-interfaces Android P introduces new restrictions on the use of non-SDK interfaces, whether directly, via reflection, or via JNI. These restrictions are applied whenever an app references a non-SDK interface or attempts to obtain its handle using reflection or JNI. In particular, remove reflection via Class.getDeclaredField() and fallback default transition to fade transition. * refactor: create default transition based on SDK version Create default transition and setup default animations based on SDK version. This is to avoid reflection via Class.getDeclaredMethod() for Android P where it throws. * refactor: extract isAndroidP method --- .../ui/frame/fragment.transitions.android.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tns-core-modules/ui/frame/fragment.transitions.android.ts b/tns-core-modules/ui/frame/fragment.transitions.android.ts index 584fc9f16..6996bf8a3 100644 --- a/tns-core-modules/ui/frame/fragment.transitions.android.ts +++ b/tns-core-modules/ui/frame/fragment.transitions.android.ts @@ -50,6 +50,10 @@ const sdkVersion = lazy(() => parseInt(device.sdkVersion)); const intEvaluator = lazy(() => new android.animation.IntEvaluator()); const defaultInterpolator = lazy(() => new android.view.animation.AccelerateDecelerateInterpolator()); +// NOTE: Android P Beta SDK version returns 27, which is API level for Android 8.1 +// TODO: Update condition when Android P SDK version returns 28 +const isAndroidP = lazy(() => sdkVersion() >= 27); + export const waitingQueue = new Map>(); export const completedEntries = new Map(); @@ -76,7 +80,9 @@ export function _setAndroidFragmentTransitions( throw new Error("Calling navigation before previous navigation finish."); } - initDefaultAnimations(manager); + if (!isAndroidP()) { + initDefaultAnimations(manager); + } if (sdkVersion() >= 21) { allowTransitionOverlap(currentFragment); @@ -116,7 +122,11 @@ export function _setAndroidFragmentTransitions( if (name === "none") { transition = new NoTransition(0, null); } else if (name === "default") { - transition = new DefaultTransition(0, null); + if (isAndroidP()) { + transition = new FadeTransition(150, null); + } else { + transition = new DefaultTransition(0, null); + } } else if (useLollipopTransition) { // setEnterTransition: Enter // setExitTransition: Exit @@ -170,7 +180,11 @@ export function _setAndroidFragmentTransitions( } } - setupDefaultAnimations(newEntry, new DefaultTransition(0, null)); + if (isAndroidP()) { + setupDefaultAnimations(newEntry, new FadeTransition(150, null)); + } else { + setupDefaultAnimations(newEntry, new DefaultTransition(0, null)); + } printTransitions(currentEntry); printTransitions(newEntry);