16aecae58SJesse Ruder // Copyright 2015-present 650 Industries. All rights reserved.
26aecae58SJesse Ruder 
36aecae58SJesse Ruder package host.exp.exponent;
46aecae58SJesse Ruder 
56aecae58SJesse Ruder import android.content.Context;
66aecae58SJesse Ruder import android.content.pm.PackageInfo;
76aecae58SJesse Ruder import android.content.pm.PackageManager;
86aecae58SJesse Ruder import android.text.TextUtils;
96aecae58SJesse Ruder 
10fa822585SJesse Ruder import java.lang.reflect.InvocationTargetException;
116aecae58SJesse Ruder import java.util.ArrayList;
12c5a18838SStanisław Chmiela import java.util.HashSet;
136aecae58SJesse Ruder import java.util.List;
14c5a18838SStanisław Chmiela import java.util.Set;
156aecae58SJesse Ruder 
1655092376SBartłomiej Bukowski import expo.modules.splashscreen.SplashScreenImageResizeMode;
176aecae58SJesse Ruder import host.exp.exponent.analytics.EXL;
186aecae58SJesse Ruder 
196aecae58SJesse Ruder public class Constants {
206aecae58SJesse Ruder 
21fa822585SJesse Ruder   public static class ExpoViewAppConstants {
22fa822585SJesse Ruder     public String VERSION_NAME;
23fa822585SJesse Ruder     public String INITIAL_URL;
24fa822585SJesse Ruder     public String SHELL_APP_SCHEME;
25fa822585SJesse Ruder     public String RELEASE_CHANNEL;
26fa822585SJesse Ruder     public boolean SHOW_LOADING_VIEW_IN_SHELL_APP;
2730fccd70SEric Samelson     public boolean ARE_REMOTE_UPDATES_ENABLED;
28734a9caaSEric Samelson     public boolean UPDATES_CHECK_AUTOMATICALLY;
29734a9caaSEric Samelson     public int UPDATES_FALLBACK_TO_CACHE_TIMEOUT;
30fa822585SJesse Ruder     public List<Constants.EmbeddedResponse> EMBEDDED_RESPONSES;
31236bbff4SJesse Ruder     public int ANDROID_VERSION_CODE;
3246664d58SJesse Ruder     public boolean FCM_ENABLED;
3355092376SBartłomiej Bukowski     public SplashScreenImageResizeMode SPLASH_SCREEN_IMAGE_RESIZE_MODE;
34e6f5cd44SEric Samelson     // no longer used, but we need to leave this here so that people's old detached apps don't break
35f05989faSEric Samelson     public boolean ANALYTICS_ENABLED;
3688204d82SStanisław Chmiela     // same but since SDK32
3788204d82SStanisław Chmiela     public boolean IS_DETACHED;
38fa822585SJesse Ruder   }
39fa822585SJesse Ruder 
406aecae58SJesse Ruder   private static final String TAG = Constants.class.getSimpleName();
416aecae58SJesse Ruder 
42fa822585SJesse Ruder   public static String VERSION_NAME = null;
43443f4243SJesse Ruder   public static String INITIAL_URL = null;
44fa822585SJesse Ruder   public static String SHELL_APP_SCHEME = null;
45aa1f6391SJanic Duplessis   public static final String SHELL_APP_EMBEDDED_MANIFEST_PATH = "shell-app-manifest.json";
466aecae58SJesse Ruder   public static final String API_HOST = "https://exp.host";
476aecae58SJesse Ruder   public static String ABI_VERSIONS;
486aecae58SJesse Ruder   public static String SDK_VERSIONS;
496aecae58SJesse Ruder   public static List<String> SDK_VERSIONS_LIST;
50b69c5097STomasz Sapeta   public static final String TEMPORARY_ABI_VERSION = null;
516aecae58SJesse Ruder   public static final String EMBEDDED_KERNEL_PATH = "assets://kernel.android.bundle";
52fa822585SJesse Ruder   public static List<EmbeddedResponse> EMBEDDED_RESPONSES;
538ddfc38dSJesse Ruder   public static boolean DISABLE_NUX = false;
54fa822585SJesse Ruder   public static String RELEASE_CHANNEL = "default";
55f8e58d76SAlicja Warchal   public static boolean SHOW_LOADING_VIEW_IN_SHELL_APP = false;
5630fccd70SEric Samelson   public static boolean ARE_REMOTE_UPDATES_ENABLED = true;
57734a9caaSEric Samelson   public static boolean UPDATES_CHECK_AUTOMATICALLY = true;
58734a9caaSEric Samelson   public static int UPDATES_FALLBACK_TO_CACHE_TIMEOUT = 0;
59236bbff4SJesse Ruder   public static int ANDROID_VERSION_CODE;
6046664d58SJesse Ruder   public static boolean FCM_ENABLED;
61f05989faSEric Samelson   public static boolean ANALYTICS_ENABLED;
6255092376SBartłomiej Bukowski   public static SplashScreenImageResizeMode SPLASH_SCREEN_IMAGE_RESIZE_MODE;
636aecae58SJesse Ruder 
setSdkVersions(List<String> sdkVersions)646aecae58SJesse Ruder   public static void setSdkVersions(List<String> sdkVersions) {
656aecae58SJesse Ruder     ABI_VERSIONS = TextUtils.join(",", sdkVersions);
666aecae58SJesse Ruder 
676aecae58SJesse Ruder     // NOTE: Currently public-facing SDK versions and internal ABI versions are the same, but
686aecae58SJesse Ruder     // eventually we may decouple them
696aecae58SJesse Ruder     SDK_VERSIONS = ABI_VERSIONS;
706aecae58SJesse Ruder     SDK_VERSIONS_LIST = sdkVersions;
716aecae58SJesse Ruder   }
726aecae58SJesse Ruder 
736aecae58SJesse Ruder   static {
7425e44ca2SCharlie Cruzan     List<String> abiVersions = new ArrayList<>();
75b69c5097STomasz Sapeta     // WHEN_DISTRIBUTING_REMOVE_FROM_HERE
76c5a18838SStanisław Chmiela     // WHEN_PREPARING_SHELL_REMOVE_FROM_HERE
77c5a18838SStanisław Chmiela     // ADD ABI VERSIONS HERE DO NOT MODIFY
78*4440fb50SKudo Chien     // BEGIN_SDK_49
79*4440fb50SKudo Chien     abiVersions.add("49.0.0");
80*4440fb50SKudo Chien     // END_SDK_49
81ab11e3c9SKudo Chien     // BEGIN_SDK_48
82ab11e3c9SKudo Chien     abiVersions.add("48.0.0");
83ab11e3c9SKudo Chien     // END_SDK_48
84023bc8eaSKudo Chien     // BEGIN_SDK_47
85023bc8eaSKudo Chien     abiVersions.add("47.0.0");
86023bc8eaSKudo Chien     // END_SDK_47
87c5a18838SStanisław Chmiela     // WHEN_PREPARING_SHELL_REMOVE_TO_HERE
88b69c5097STomasz Sapeta     // WHEN_DISTRIBUTING_REMOVE_TO_HERE
896aecae58SJesse Ruder 
906aecae58SJesse Ruder     if (TEMPORARY_ABI_VERSION != null) {
916aecae58SJesse Ruder       abiVersions.add(TEMPORARY_ABI_VERSION);
926aecae58SJesse Ruder     }
936aecae58SJesse Ruder 
9425e44ca2SCharlie Cruzan     setSdkVersions(abiVersions);
956aecae58SJesse Ruder 
966aecae58SJesse Ruder     List<EmbeddedResponse> embeddedResponses = new ArrayList<>();
97068c5923SStanisław Chmiela     // WHEN_PREPARING_SHELL_REMOVE_FROM_HERE
embeddedResponses.add(new EmbeddedResponse(R, EMBEDDED_KERNEL_PATH, R))986aecae58SJesse Ruder     embeddedResponses.add(new EmbeddedResponse("https://exp.host/@exponent/home/bundle", EMBEDDED_KERNEL_PATH, "application/javascript"));
99068c5923SStanisław Chmiela     // WHEN_PREPARING_SHELL_REMOVE_TO_HERE
100fa822585SJesse Ruder 
1016aecae58SJesse Ruder     // ADD EMBEDDED RESPONSES HERE
1028763767aSJesse Ruder     // START EMBEDDED RESPONSES
1038763767aSJesse Ruder     // END EMBEDDED RESPONSES
104fa822585SJesse Ruder 
105fa822585SJesse Ruder     try {
106fa822585SJesse Ruder       Class appConstantsClass = Class.forName("host.exp.exponent.generated.AppConstants");
107fa822585SJesse Ruder       ExpoViewAppConstants appConstants = (ExpoViewAppConstants) appConstantsClass.getMethod("get").invoke(null);
108fa822585SJesse Ruder       VERSION_NAME = appConstants.VERSION_NAME;
109fa822585SJesse Ruder       INITIAL_URL = appConstants.INITIAL_URL;
110fa822585SJesse Ruder       SHELL_APP_SCHEME = appConstants.SHELL_APP_SCHEME;
111fa822585SJesse Ruder       RELEASE_CHANNEL = appConstants.RELEASE_CHANNEL;
112fa822585SJesse Ruder       SHOW_LOADING_VIEW_IN_SHELL_APP = appConstants.SHOW_LOADING_VIEW_IN_SHELL_APP;
11330fccd70SEric Samelson       ARE_REMOTE_UPDATES_ENABLED = appConstants.ARE_REMOTE_UPDATES_ENABLED;
114734a9caaSEric Samelson       UPDATES_CHECK_AUTOMATICALLY = appConstants.UPDATES_CHECK_AUTOMATICALLY;
115734a9caaSEric Samelson       UPDATES_FALLBACK_TO_CACHE_TIMEOUT = appConstants.UPDATES_FALLBACK_TO_CACHE_TIMEOUT;
116236bbff4SJesse Ruder       ANDROID_VERSION_CODE = appConstants.ANDROID_VERSION_CODE;
11746664d58SJesse Ruder       FCM_ENABLED = appConstants.FCM_ENABLED;
11888204d82SStanisław Chmiela       ANALYTICS_ENABLED = !isStandaloneApp();
119fa822585SJesse Ruder 
120fa822585SJesse Ruder       embeddedResponses.addAll(appConstants.EMBEDDED_RESPONSES);
1216aecae58SJesse Ruder       EMBEDDED_RESPONSES = embeddedResponses;
12255092376SBartłomiej Bukowski       SPLASH_SCREEN_IMAGE_RESIZE_MODE = appConstants.SPLASH_SCREEN_IMAGE_RESIZE_MODE;
123fa822585SJesse Ruder     } catch (ClassNotFoundException e) {
124fa822585SJesse Ruder       e.printStackTrace();
125fa822585SJesse Ruder     } catch (IllegalAccessException e) {
126fa822585SJesse Ruder       e.printStackTrace();
127fa822585SJesse Ruder     } catch (NoSuchMethodException e) {
128fa822585SJesse Ruder       e.printStackTrace();
129fa822585SJesse Ruder     } catch (InvocationTargetException e) {
130fa822585SJesse Ruder       e.printStackTrace();
131fa822585SJesse Ruder     }
1326aecae58SJesse Ruder   }
1336aecae58SJesse Ruder 
1346aecae58SJesse Ruder   public static final boolean DEBUG_COLD_START_METHOD_TRACING = false;
1356aecae58SJesse Ruder   public static final boolean DEBUG_MANIFEST_METHOD_TRACING = false;
1366aecae58SJesse Ruder   public static final boolean DEBUG_METHOD_TRACING = DEBUG_COLD_START_METHOD_TRACING || DEBUG_MANIFEST_METHOD_TRACING;
1376aecae58SJesse Ruder   public static final boolean ENABLE_LEAK_CANARY = false;
1386aecae58SJesse Ruder   public static final boolean WRITE_BUNDLE_TO_LOG = false;
1396aecae58SJesse Ruder   public static final boolean WAIT_FOR_DEBUGGER = false;
1406aecae58SJesse Ruder 
isStandaloneApp()14188204d82SStanisław Chmiela   public static boolean isStandaloneApp() {
1426aecae58SJesse Ruder     return INITIAL_URL != null;
1436aecae58SJesse Ruder   }
1446aecae58SJesse Ruder 
1456aecae58SJesse Ruder   public static class EmbeddedResponse {
1466aecae58SJesse Ruder     public final String url;
1476aecae58SJesse Ruder     public final String responseFilePath;
1486aecae58SJesse Ruder     public final String mediaType;
1496aecae58SJesse Ruder 
EmbeddedResponse(final String url, final String responseFilePath, final String mediaType)1506aecae58SJesse Ruder     public EmbeddedResponse(final String url, final String responseFilePath, final String mediaType) {
1516aecae58SJesse Ruder       this.url = url;
1526aecae58SJesse Ruder       this.responseFilePath = responseFilePath;
1536aecae58SJesse Ruder       this.mediaType = mediaType;
1546aecae58SJesse Ruder     }
1556aecae58SJesse Ruder   }
1566aecae58SJesse Ruder 
getVersionName(Context context)1576aecae58SJesse Ruder   public static String getVersionName(Context context) {
1586aecae58SJesse Ruder     if (VERSION_NAME != null) {
1596aecae58SJesse Ruder       // This will be set in shell apps
1606aecae58SJesse Ruder       return VERSION_NAME;
1616aecae58SJesse Ruder     } else {
1626aecae58SJesse Ruder       try {
1636aecae58SJesse Ruder         PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
1646aecae58SJesse Ruder         return pInfo.versionName;
1656aecae58SJesse Ruder       } catch (PackageManager.NameNotFoundException e) {
1666aecae58SJesse Ruder         EXL.e(TAG, e.toString());
1676aecae58SJesse Ruder         return "";
1686aecae58SJesse Ruder       }
1696aecae58SJesse Ruder     }
1706aecae58SJesse Ruder   }
1716aecae58SJesse Ruder 
172431806bbSJesse Ruder   private static boolean sIsTest = false;
173431806bbSJesse Ruder 
setInTest()174431806bbSJesse Ruder   public static void setInTest() {
175431806bbSJesse Ruder     sIsTest = true;
176431806bbSJesse Ruder   }
177431806bbSJesse Ruder 
isTest()178431806bbSJesse Ruder   public static boolean isTest() {
179431806bbSJesse Ruder     return sIsTest;
180431806bbSJesse Ruder   }
1816aecae58SJesse Ruder }
182