package com.reactnativenavigation.params.parsers; import android.graphics.drawable.Drawable; import android.os.Bundle; import com.reactnativenavigation.params.NavigationParams; import com.reactnativenavigation.params.PageParams; import com.reactnativenavigation.params.ScreenParams; import com.reactnativenavigation.react.ImageLoader; import java.util.ArrayList; import java.util.List; public class ScreenParamsParser extends Parser { private static final String KEY_TITLE = "title"; private static final String KEY_SUBTITLE = "subtitle"; private static final String KEY_SCREEN_ID = "screenId"; private static final String KEY_NAVIGATION_PARAMS = "navigationParams"; private static final String STYLE_PARAMS = "styleParams"; private static final String TOP_TABS = "topTabs"; private static final String FRAGMENT_CREATOR_CLASS_NAME = "fragmentCreatorClassName"; private static final String FRAGMENT_CREATOR_PASS_PROPS = "fragmentCreatorPassProps"; private static final String OVERRIDE_BACK_PRESS = "overrideBackPress"; @SuppressWarnings("ConstantConditions") public static ScreenParams parse(Bundle params) { ScreenParams result = new ScreenParams(); result.screenId = params.getString(KEY_SCREEN_ID); assertKeyExists(params, KEY_NAVIGATION_PARAMS); result.navigationParams = new NavigationParams(params.getBundle(KEY_NAVIGATION_PARAMS)); result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse(); result.title = params.getString(KEY_TITLE); result.subtitle = params.getString(KEY_SUBTITLE); result.rightButtons = ButtonParser.parseRightButton(params); result.overrideBackPressInJs = params.getBoolean(OVERRIDE_BACK_PRESS, false); result.leftButton = ButtonParser.parseLeftButton(params); result.topTabParams = parseTopTabs(params); if (hasKey(params, FRAGMENT_CREATOR_CLASS_NAME)) { result.fragmentCreatorClassName = params.getString(FRAGMENT_CREATOR_CLASS_NAME); result.fragmentCreatorPassProps = params.getBundle(FRAGMENT_CREATOR_PASS_PROPS); } result.fabParams = ButtonParser.parseFab(params, result.navigationParams.navigatorEventId, result.navigationParams.screenInstanceId); result.tabLabel = getTabLabel(params); result.tabIcon = new TabIconParser(params).parse(); result.animateScreenTransitions = new AnimationParser(params).parse(); result.sharedElementsTransitions = getSharedElementsTransitions(params); return result; } private static List<String> getSharedElementsTransitions(Bundle params) { Bundle sharedElements = params.getBundle("sharedElements"); if (sharedElements == null) { return new ArrayList<>(); } List<String> result = new ArrayList<>(); for (String key : sharedElements.keySet()) { result.add(sharedElements.getString(key)); } return result; } private static Drawable getTabIcon(Bundle params) { Drawable tabIcon = null; if (hasKey(params, "icon")) { tabIcon = ImageLoader.loadImage(params.getString("icon")); } return tabIcon; } private static String getTabLabel(Bundle params) { String tabLabel = null; if (hasKey(params, "label")) { tabLabel = params.getString("label"); } return tabLabel; } private static List<PageParams> parseTopTabs(Bundle params) { List<PageParams> topTabParams = null; if (hasKey(params, TOP_TABS)) { topTabParams = new TopTabParamsParser().parse(params.getBundle(TOP_TABS)); } return topTabParams; } List<ScreenParams> parseTabs(Bundle params) { return parseBundle(params, new ParseStrategy<ScreenParams>() { @Override public ScreenParams parse(Bundle screen) { return ScreenParamsParser.parse(screen); } }); } }