package com.airbnb.android.react.navigation; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.FragmentActivity; import com.airbnb.android.R; import com.facebook.react.bridge.ReactContext; import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; public final class ReactNativeUtils { static final String VERSION_CONSTANT_KEY = "VERSION"; private static final String IS_SHARED_ELEMENT_TRANSITION = "isSharedElementTransition"; private static final int SHARED_ELEMENT_TARGET_API = Build.VERSION_CODES.LOLLIPOP_MR1; private ReactNativeUtils() { } public static void pushScreen(Context context, String moduleName) { pushScreen(context, moduleName, null); } public static void pushScreen(Context context, String moduleName, @Nullable Bundle props) { Bundle options = ActivityOptionsCompat .makeCustomAnimation(context, R.anim.slide_in_right, R.anim.delay) .toBundle(); showScreen(context, moduleName, props, options, false); } public static void presentScreen(Context context, String moduleName) { presentScreen(context, moduleName, null); } public static void presentScreen(Context context, String moduleName, @Nullable Bundle props) { Bundle options = ActivityOptionsCompat .makeCustomAnimation(context, R.anim.slide_up, R.anim.delay) .toBundle(); showScreen(context, moduleName, props, options, true); } private static void showScreen( Context context, String moduleName, Bundle props, Bundle options, boolean isModal) { Intent intent = intent(context, moduleName, props, isModal); context.startActivity(intent, options); } // TODO: delete this? public static Intent intentWithDismissFlag() { return new Intent().putExtra(ReactNativeIntents.EXTRA_IS_DISMISS, true); } private static Intent intent(Context context, String moduleName, Bundle props, boolean isModal) { return new Intent(context, ReactNativeActivity.class) .putExtra(ReactNativeFragment.EXTRA_IS_MODAL, isModal) .putExtra(ReactNativeFragment.EXTRA_REACT_MODULE_NAME, moduleName) .putExtra(ReactNativeFragment.EXTRA_REACT_PROPS, props); } /** Emits a JS event with the provided name and data if the rect context is initialized */ static void maybeEmitEvent(ReactContext context, String name, Object data) { if (context == null) { throw new IllegalArgumentException( String.format("reactContext is null (calling event: %s)", name)); } if (context.hasActiveCatalystInstance()) { try { context.getJSModule(RCTDeviceEventEmitter.class).emit(name, data); } catch (RuntimeException e) { // the JS bundle hasn't finished executing, so this call is going to be lost. // In the future, we could maybe set something up to queue the call, and then pass them through once // the bundle has finished getting parsed, but for now I am going to just swallow the error. } } } /** Returns true if the provided intent will launch a ReactNative Activity, false otherwise. */ static boolean isReactNativeIntent(Intent intent) { String className = intent.getComponent().getClassName(); return ReactNativeActivity.class.getName().equals(className); } static boolean isSharedElementTransition(Activity activity) { return isSharedElementTransition(activity.getIntent().getExtras()); } static boolean isSharedElementTransition(Intent intent) { return isSharedElementTransition(intent.getExtras()); } static boolean isSharedElementTransition(@Nullable Bundle args) { return Build.VERSION.SDK_INT >= SHARED_ELEMENT_TARGET_API && args != null && args.getBoolean(IS_SHARED_ELEMENT_TRANSITION, false); } static void setIsSharedElementTransition(Intent intent) { intent.putExtra(IS_SHARED_ELEMENT_TRANSITION, true); } // static boolean isSuccessfullyInitialized(ReactInstanceManager reactInstanceManager) { // // TODO // return false; // } static void showAlertBecauseChecksFailed(FragmentActivity activity, Object o) { // TODO } }