react-native-stallion 2.0.0-alpha.1 → 2.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/android/src/main/java/com/stallion/Stallion.java +143 -83
  2. package/android/src/main/java/com/stallion/StallionModule.java +101 -88
  3. package/android/src/main/java/com/stallion/events/StallionEventConstants.java +22 -0
  4. package/android/src/main/java/com/stallion/events/StallionEventManager.java +160 -0
  5. package/android/src/main/java/com/stallion/networkmanager/StallionApiConstants.java +28 -0
  6. package/android/src/main/java/com/stallion/networkmanager/StallionApiManager.java +96 -0
  7. package/android/src/main/java/com/stallion/{StallionDownloadCallback.java → networkmanager/StallionDownloadCallback.java} +1 -1
  8. package/android/src/main/java/com/stallion/networkmanager/StallionFileDownloader.java +224 -0
  9. package/android/src/main/java/com/stallion/networkmanager/StallionStageManager.java +77 -0
  10. package/android/src/main/java/com/stallion/networkmanager/StallionSyncHandler.java +183 -0
  11. package/android/src/main/java/com/stallion/storage/StallionConfig.java +120 -0
  12. package/android/src/main/java/com/stallion/storage/StallionConfigConstants.java +24 -0
  13. package/android/src/main/java/com/stallion/storage/StallionMeta.java +206 -0
  14. package/android/src/main/java/com/stallion/storage/StallionMetaConstants.java +30 -0
  15. package/android/src/main/java/com/stallion/storage/StallionStateManager.java +113 -0
  16. package/android/src/main/java/com/stallion/{StallionDefaultErrorActivity.java → utils/StallionErrorActivity.java} +11 -10
  17. package/android/src/main/java/com/stallion/utils/StallionExceptionHandler.java +96 -0
  18. package/android/src/main/java/com/stallion/utils/StallionFileManager.java +205 -0
  19. package/android/src/main/java/com/stallion/utils/StallionSlotManager.java +110 -0
  20. package/ios/main/Stallion-Bridging-Header.h +5 -4
  21. package/ios/main/Stallion.m +26 -9
  22. package/ios/main/Stallion.swift +124 -83
  23. package/ios/main/StallionConfig.h +24 -0
  24. package/ios/main/StallionConfig.m +62 -0
  25. package/ios/main/StallionConfigConstants.h +32 -0
  26. package/ios/main/StallionConfigConstants.m +32 -0
  27. package/ios/main/StallionConstants.swift +2 -1
  28. package/ios/main/StallionEventHandler.h +23 -0
  29. package/ios/main/StallionEventHandler.m +138 -0
  30. package/ios/main/StallionExceptionHandler.h +18 -0
  31. package/ios/main/StallionExceptionHandler.m +94 -0
  32. package/ios/main/StallionFileDownloader.swift +147 -0
  33. package/ios/main/StallionFileManager.h +20 -0
  34. package/ios/main/StallionFileManager.m +126 -0
  35. package/ios/main/StallionMeta.h +29 -0
  36. package/ios/main/StallionMeta.m +98 -0
  37. package/ios/main/StallionMetaConstants.h +28 -0
  38. package/ios/main/StallionMetaConstants.m +42 -0
  39. package/ios/main/StallionModule.m +134 -101
  40. package/ios/main/StallionObjConstants.h +1 -0
  41. package/ios/main/StallionObjConstants.m +4 -0
  42. package/ios/main/StallionSlotManager.h +21 -0
  43. package/ios/main/StallionSlotManager.m +114 -0
  44. package/ios/main/StallionStageManager.swift +84 -0
  45. package/ios/main/StallionStateManager.h +31 -0
  46. package/ios/main/StallionStateManager.m +87 -0
  47. package/ios/main/StallionSyncHandler.swift +212 -0
  48. package/package.json +1 -1
  49. package/src/index.js +1 -1
  50. package/src/index.js.map +1 -1
  51. package/src/main/components/common/Header/index.js +2 -9
  52. package/src/main/components/common/Header/index.js.map +1 -1
  53. package/src/main/components/modules/listing/components/BundleCard.js +4 -4
  54. package/src/main/components/modules/listing/components/BundleCard.js.map +1 -1
  55. package/src/main/components/modules/listing/components/BundleCardInfoSection.js +1 -0
  56. package/src/main/components/modules/listing/components/BundleCardInfoSection.js.map +1 -1
  57. package/src/main/components/modules/listing/components/ConfigView.js +19 -0
  58. package/src/main/components/modules/listing/components/ConfigView.js.map +1 -0
  59. package/src/main/components/modules/listing/components/SlotView.js +15 -13
  60. package/src/main/components/modules/listing/components/SlotView.js.map +1 -1
  61. package/src/main/components/modules/listing/components/styles/index.js +3 -1
  62. package/src/main/components/modules/listing/components/styles/index.js.map +1 -1
  63. package/src/main/components/modules/listing/hooks/useListing.js +1 -7
  64. package/src/main/components/modules/listing/hooks/useListing.js.map +1 -1
  65. package/src/main/components/modules/login/index.js +41 -37
  66. package/src/main/components/modules/login/index.js.map +1 -1
  67. package/src/main/components/modules/login/styles/index.js +14 -1
  68. package/src/main/components/modules/login/styles/index.js.map +1 -1
  69. package/src/main/components/modules/modal/StallionModal.js +22 -27
  70. package/src/main/components/modules/modal/StallionModal.js.map +1 -1
  71. package/src/main/components/modules/modal/hooks/useStallionModal.js +6 -105
  72. package/src/main/components/modules/modal/hooks/useStallionModal.js.map +1 -1
  73. package/src/main/components/modules/prod/prod.js +15 -15
  74. package/src/main/components/modules/prod/prod.js.map +1 -1
  75. package/src/main/components/modules/prod/styles/index.js +5 -2
  76. package/src/main/components/modules/prod/styles/index.js.map +1 -1
  77. package/src/main/constants/apiConstants.js +2 -2
  78. package/src/main/constants/appConstants.js +3 -3
  79. package/src/main/constants/appConstants.js.map +1 -1
  80. package/src/main/state/actionCreators/useBucketActions.js +10 -13
  81. package/src/main/state/actionCreators/useBucketActions.js.map +1 -1
  82. package/src/main/state/actionCreators/useBundleActions.js +14 -17
  83. package/src/main/state/actionCreators/useBundleActions.js.map +1 -1
  84. package/src/main/state/actionCreators/useConfigActions.js +20 -0
  85. package/src/main/state/actionCreators/useConfigActions.js.map +1 -0
  86. package/src/main/state/actionCreators/useDownloadActions.js +3 -5
  87. package/src/main/state/actionCreators/useDownloadActions.js.map +1 -1
  88. package/src/main/state/actionCreators/useMetaActions.js +4 -2
  89. package/src/main/state/actionCreators/useMetaActions.js.map +1 -1
  90. package/src/main/state/actionCreators/useUpdateMetaActions.js +25 -48
  91. package/src/main/state/actionCreators/useUpdateMetaActions.js.map +1 -1
  92. package/src/main/state/actionCreators/useUserActions.js +25 -85
  93. package/src/main/state/actionCreators/useUserActions.js.map +1 -1
  94. package/src/main/state/actions/configActions.js +8 -0
  95. package/src/main/state/actions/configActions.js.map +1 -0
  96. package/src/main/state/actions/userActions.js +3 -15
  97. package/src/main/state/actions/userActions.js.map +1 -1
  98. package/src/main/state/index.js +19 -15
  99. package/src/main/state/index.js.map +1 -1
  100. package/src/main/state/reducers/configReducer.js +19 -0
  101. package/src/main/state/reducers/configReducer.js.map +1 -0
  102. package/src/main/state/reducers/updateMetaReducer.js +3 -3
  103. package/src/main/state/reducers/updateMetaReducer.js.map +1 -1
  104. package/src/main/state/reducers/userReducer.js +3 -37
  105. package/src/main/state/reducers/userReducer.js.map +1 -1
  106. package/src/main/state/useStallionEvents.js +102 -0
  107. package/src/main/state/useStallionEvents.js.map +1 -0
  108. package/src/main/utils/ErrorBoundary.js +4 -2
  109. package/src/main/utils/ErrorBoundary.js.map +1 -1
  110. package/src/main/utils/StallionEventEmitter.js.map +1 -1
  111. package/src/main/utils/StallionNativeUtils.js +27 -52
  112. package/src/main/utils/StallionNativeUtils.js.map +1 -1
  113. package/src/main/utils/debounce.js +16 -0
  114. package/src/main/utils/debounce.js.map +1 -0
  115. package/src/main/utils/useApiClient.js +28 -0
  116. package/src/main/utils/useApiClient.js.map +1 -0
  117. package/src/main/utils/useStallionUpdate.js +4 -3
  118. package/src/main/utils/useStallionUpdate.js.map +1 -1
  119. package/src/types/config.types.js +5 -0
  120. package/src/types/config.types.js.map +1 -0
  121. package/src/types/meta.types.js +4 -6
  122. package/src/types/meta.types.js.map +1 -1
  123. package/src/types/updateMeta.types.js +1 -1
  124. package/src/types/updateMeta.types.js.map +1 -1
  125. package/src/types/user.types.js +1 -2
  126. package/src/types/user.types.js.map +1 -1
  127. package/types/index.d.ts +1 -1
  128. package/types/index.d.ts.map +1 -1
  129. package/types/main/components/common/Header/index.d.ts +0 -2
  130. package/types/main/components/common/Header/index.d.ts.map +1 -1
  131. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts.map +1 -1
  132. package/types/main/components/modules/listing/components/ConfigView.d.ts +8 -0
  133. package/types/main/components/modules/listing/components/ConfigView.d.ts.map +1 -0
  134. package/types/main/components/modules/listing/components/SlotView.d.ts.map +1 -1
  135. package/types/main/components/modules/listing/components/styles/index.d.ts +2 -0
  136. package/types/main/components/modules/listing/components/styles/index.d.ts.map +1 -1
  137. package/types/main/components/modules/listing/hooks/useListing.d.ts.map +1 -1
  138. package/types/main/components/modules/login/index.d.ts.map +1 -1
  139. package/types/main/components/modules/login/styles/index.d.ts +13 -0
  140. package/types/main/components/modules/login/styles/index.d.ts.map +1 -1
  141. package/types/main/components/modules/modal/StallionModal.d.ts.map +1 -1
  142. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts +1 -7
  143. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts.map +1 -1
  144. package/types/main/components/modules/prod/prod.d.ts.map +1 -1
  145. package/types/main/components/modules/prod/styles/index.d.ts +4 -1
  146. package/types/main/components/modules/prod/styles/index.d.ts.map +1 -1
  147. package/types/main/constants/apiConstants.d.ts +2 -2
  148. package/types/main/constants/apiConstants.d.ts.map +1 -1
  149. package/types/main/constants/appConstants.d.ts +3 -3
  150. package/types/main/state/actionCreators/useBucketActions.d.ts +2 -1
  151. package/types/main/state/actionCreators/useBucketActions.d.ts.map +1 -1
  152. package/types/main/state/actionCreators/useBundleActions.d.ts +2 -1
  153. package/types/main/state/actionCreators/useBundleActions.d.ts.map +1 -1
  154. package/types/main/state/actionCreators/useConfigActions.d.ts +7 -0
  155. package/types/main/state/actionCreators/useConfigActions.d.ts.map +1 -0
  156. package/types/main/state/actionCreators/useDownloadActions.d.ts +2 -1
  157. package/types/main/state/actionCreators/useDownloadActions.d.ts.map +1 -1
  158. package/types/main/state/actionCreators/useMetaActions.d.ts.map +1 -1
  159. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts +2 -1
  160. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts.map +1 -1
  161. package/types/main/state/actionCreators/useUserActions.d.ts +5 -7
  162. package/types/main/state/actionCreators/useUserActions.d.ts.map +1 -1
  163. package/types/main/state/actions/configActions.d.ts +3 -0
  164. package/types/main/state/actions/configActions.d.ts.map +1 -0
  165. package/types/main/state/actions/userActions.d.ts +2 -4
  166. package/types/main/state/actions/userActions.d.ts.map +1 -1
  167. package/types/main/state/index.d.ts.map +1 -1
  168. package/types/main/state/reducers/configReducer.d.ts +4 -0
  169. package/types/main/state/reducers/configReducer.d.ts.map +1 -0
  170. package/types/main/state/reducers/updateMetaReducer.d.ts +2 -1
  171. package/types/main/state/reducers/updateMetaReducer.d.ts.map +1 -1
  172. package/types/main/state/reducers/userReducer.d.ts.map +1 -1
  173. package/types/main/state/useStallionEvents.d.ts +12 -0
  174. package/types/main/state/useStallionEvents.d.ts.map +1 -0
  175. package/types/main/utils/ErrorBoundary.d.ts.map +1 -1
  176. package/types/main/utils/StallionEventEmitter.d.ts +3 -6
  177. package/types/main/utils/StallionEventEmitter.d.ts.map +1 -1
  178. package/types/main/utils/StallionNativeUtils.d.ts +6 -10
  179. package/types/main/utils/StallionNativeUtils.d.ts.map +1 -1
  180. package/types/main/utils/debounce.d.ts +3 -0
  181. package/types/main/utils/debounce.d.ts.map +1 -0
  182. package/types/main/utils/useApiClient.d.ts +8 -0
  183. package/types/main/utils/useApiClient.d.ts.map +1 -0
  184. package/types/types/config.types.d.ts +16 -0
  185. package/types/types/config.types.d.ts.map +1 -0
  186. package/types/types/globalProvider.types.d.ts +5 -9
  187. package/types/types/globalProvider.types.d.ts.map +1 -1
  188. package/types/types/meta.types.d.ts +6 -7
  189. package/types/types/meta.types.d.ts.map +1 -1
  190. package/types/types/updateMeta.types.d.ts +7 -5
  191. package/types/types/updateMeta.types.d.ts.map +1 -1
  192. package/types/types/user.types.d.ts +5 -20
  193. package/types/types/user.types.d.ts.map +1 -1
  194. package/types/types/utils.types.d.ts +7 -5
  195. package/types/types/utils.types.d.ts.map +1 -1
  196. package/android/src/main/java/com/stallion/StallionApiUtil.java +0 -58
  197. package/android/src/main/java/com/stallion/StallionCommonUtil.java +0 -25
  198. package/android/src/main/java/com/stallion/StallionConstants.java +0 -73
  199. package/android/src/main/java/com/stallion/StallionDownloadManager.java +0 -121
  200. package/android/src/main/java/com/stallion/StallionErrorBoundary.java +0 -73
  201. package/android/src/main/java/com/stallion/StallionEventEmitter.java +0 -144
  202. package/android/src/main/java/com/stallion/StallionFileUtil.java +0 -129
  203. package/android/src/main/java/com/stallion/StallionRollbackManager.java +0 -82
  204. package/android/src/main/java/com/stallion/StallionStorage.java +0 -64
  205. package/android/src/main/java/com/stallion/StallionSynManager.java +0 -142
  206. package/ios/main/StallionDownloader.swift +0 -111
  207. package/ios/main/StallionErrorBoundary.h +0 -17
  208. package/ios/main/StallionErrorBoundary.m +0 -79
  209. package/ios/main/StallionEventEmitter.swift +0 -20
  210. package/ios/main/StallionEventManager.h +0 -21
  211. package/ios/main/StallionEventManager.m +0 -57
  212. package/ios/main/StallionObjUtil.h +0 -14
  213. package/ios/main/StallionObjUtil.m +0 -22
  214. package/ios/main/StallionRollbackHandler.h +0 -22
  215. package/ios/main/StallionRollbackHandler.m +0 -128
  216. package/ios/main/StallionSyncManager.swift +0 -149
  217. package/ios/main/StallionUtil.swift +0 -19
  218. package/src/main/components/common/ProfileOverlay/index.js +0 -50
  219. package/src/main/components/common/ProfileOverlay/index.js.map +0 -1
  220. package/src/main/components/common/ProfileOverlay/styles.js +0 -72
  221. package/src/main/components/common/ProfileOverlay/styles.js.map +0 -1
  222. package/src/main/components/modules/login/components/Email.js +0 -41
  223. package/src/main/components/modules/login/components/Email.js.map +0 -1
  224. package/src/main/components/modules/login/components/Otp.js +0 -45
  225. package/src/main/components/modules/login/components/Otp.js.map +0 -1
  226. package/src/main/components/modules/login/components/styles/index.js +0 -28
  227. package/src/main/components/modules/login/components/styles/index.js.map +0 -1
  228. package/src/main/components/modules/login/hooks/useLoginFlow.js +0 -60
  229. package/src/main/components/modules/login/hooks/useLoginFlow.js.map +0 -1
  230. package/src/main/utils/EventUtil.js +0 -28
  231. package/src/main/utils/EventUtil.js.map +0 -1
  232. package/src/main/utils/SharedDataManager.js +0 -37
  233. package/src/main/utils/SharedDataManager.js.map +0 -1
  234. package/src/main/utils/apiUtils.js +0 -24
  235. package/src/main/utils/apiUtils.js.map +0 -1
  236. package/types/main/components/common/ProfileOverlay/index.d.ts +0 -10
  237. package/types/main/components/common/ProfileOverlay/index.d.ts.map +0 -1
  238. package/types/main/components/common/ProfileOverlay/styles.d.ts +0 -69
  239. package/types/main/components/common/ProfileOverlay/styles.d.ts.map +0 -1
  240. package/types/main/components/modules/login/components/Email.d.ts +0 -13
  241. package/types/main/components/modules/login/components/Email.d.ts.map +0 -1
  242. package/types/main/components/modules/login/components/Otp.d.ts +0 -12
  243. package/types/main/components/modules/login/components/Otp.d.ts.map +0 -1
  244. package/types/main/components/modules/login/components/styles/index.d.ts +0 -25
  245. package/types/main/components/modules/login/components/styles/index.d.ts.map +0 -1
  246. package/types/main/components/modules/login/hooks/useLoginFlow.d.ts +0 -18
  247. package/types/main/components/modules/login/hooks/useLoginFlow.d.ts.map +0 -1
  248. package/types/main/utils/EventUtil.d.ts +0 -9
  249. package/types/main/utils/EventUtil.d.ts.map +0 -1
  250. package/types/main/utils/SharedDataManager.d.ts +0 -20
  251. package/types/main/utils/SharedDataManager.d.ts.map +0 -1
  252. package/types/main/utils/apiUtils.d.ts +0 -12
  253. package/types/main/utils/apiUtils.d.ts.map +0 -1
@@ -1,110 +1,170 @@
1
1
  package com.stallion;
2
2
 
3
3
  import android.content.Context;
4
- import android.content.pm.PackageInfo;
5
- import android.content.pm.PackageManager;
6
4
 
7
- import com.facebook.react.bridge.Arguments;
8
- import com.facebook.react.bridge.WritableMap;
5
+ import com.stallion.events.StallionEventConstants;
6
+ import com.stallion.events.StallionEventManager;
7
+ import com.stallion.storage.StallionConfigConstants;
8
+ import com.stallion.storage.StallionStateManager;
9
+ import com.stallion.storage.StallionMeta;
10
+ import com.stallion.storage.StallionMetaConstants;
11
+ import com.stallion.utils.StallionFileManager;
12
+ import com.stallion.utils.StallionSlotManager;
13
+
14
+ import org.json.JSONObject;
9
15
 
10
16
  import java.io.File;
11
17
 
12
18
  public class Stallion {
13
19
 
20
+ private static StallionStateManager stateManager;
21
+
14
22
  public static String getJSBundleFile(Context applicationContext) {
15
23
  return getJSBundleFile(applicationContext, null);
16
24
  }
17
25
 
18
- private static String getDefaultBundle(String defaultBundlePath) {
19
- if(defaultBundlePath != null && !defaultBundlePath.isEmpty()) {
20
- return defaultBundlePath;
21
- } else {
22
- return StallionConstants.DEFAULT_JS_BUNDLE_LOCATION_BASE + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
26
+ public static String getJSBundleFile(Context applicationContext, String defaultBundlePath) {
27
+ StallionStateManager.init(applicationContext);
28
+ stateManager = StallionStateManager.getInstance();
29
+
30
+ validateAppVersion(stateManager.getStallionConfig().getAppVersion());
31
+
32
+ StallionEventManager.init(stateManager);
33
+
34
+ String baseFolderPath = stateManager.getStallionConfig().getFilesDirectory();
35
+ StallionMeta stallionMeta = stateManager.stallionMeta;
36
+ StallionMetaConstants.SwitchState switchState = stallionMeta.getSwitchState();
37
+
38
+ if (switchState == StallionMetaConstants.SwitchState.PROD) {
39
+ return getProdBundlePath(baseFolderPath, defaultBundlePath);
40
+ } else if (switchState == StallionMetaConstants.SwitchState.STAGE) {
41
+ return getStageBundlePath(baseFolderPath, defaultBundlePath);
42
+ }
43
+ return getDefaultBundle(defaultBundlePath);
44
+ }
45
+
46
+ private static void validateAppVersion(String currentAppVersion) {
47
+ StallionStateManager stallionStateManager = StallionStateManager.getInstance();
48
+ String cachedAppVersion = stallionStateManager.getString(StallionConfigConstants.STALLION_APP_VERSION_IDENTIFIER, "");;
49
+ if (
50
+ currentAppVersion != null
51
+ && !currentAppVersion.isEmpty()
52
+ && !cachedAppVersion.equals(currentAppVersion)
53
+ ) {
54
+ stallionStateManager.setString(StallionConfigConstants.STALLION_APP_VERSION_IDENTIFIER, currentAppVersion);
55
+ StallionSlotManager.fallbackProd();
23
56
  }
24
57
  }
25
58
 
26
- private static String getAppVersion() throws PackageManager.NameNotFoundException {
27
- Context appContext = StallionStorage.getInstance().mContext;
28
- String parentPackageName= appContext.getPackageName();
29
- PackageInfo pInfo = appContext.getPackageManager().getPackageInfo(parentPackageName, 0);
30
- return pInfo.versionName;
59
+ private static void mountNewProdBundle(String baseFolderPath) {
60
+ StallionMeta stallionMeta = stateManager.stallionMeta;
61
+ String prodTempHash = stallionMeta.getProdTempHash();
62
+ if(prodTempHash != null && !prodTempHash.isEmpty()) {
63
+ try {
64
+ StallionFileManager.moveFile(
65
+ new File(baseFolderPath, StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.TEMP_FOLDER_SLOT),
66
+ new File(baseFolderPath, StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.NEW_FOLDER_SLOT)
67
+ );
68
+ stallionMeta.setProdNewHash(prodTempHash);
69
+ stallionMeta.setProdTempHash("");
70
+ stateManager.syncStallionMeta();
71
+ sendInstallEvent(prodTempHash);
72
+ } catch (Exception ignored) {}
73
+ }
31
74
  }
32
75
 
33
- private static void sendInstallEvent(String installedReleaseHash) {
34
- WritableMap successEventPayload = Arguments.createMap();
35
- successEventPayload.putString("releaseHash", installedReleaseHash);
36
- StallionEventEmitter.sendEvent(
37
- StallionEventEmitter.getEventPayload(
38
- StallionConstants.NativeEventTypesProd.INSTALLED_PROD.toString(),
39
- successEventPayload
40
- )
41
- );
76
+ private static void mountNewStageBundle(String baseFolderPath) {
77
+ StallionMeta stallionMeta = stateManager.stallionMeta;
78
+ String stageTempHash = stallionMeta.getStageTempHash();
79
+ if(stageTempHash != null && !stageTempHash.isEmpty()) {
80
+ try {
81
+ StallionFileManager.moveFile(
82
+ new File(baseFolderPath, StallionConfigConstants.STAGE_DIRECTORY + StallionConfigConstants.TEMP_FOLDER_SLOT),
83
+ new File(baseFolderPath, StallionConfigConstants.STAGE_DIRECTORY + StallionConfigConstants.NEW_FOLDER_SLOT)
84
+ );
85
+ stallionMeta.setStageNewHash(stageTempHash);
86
+ stallionMeta.setStageTempHash("");
87
+ stateManager.syncStallionMeta();
88
+ } catch (Exception ignored) {}
89
+ }
42
90
  }
43
91
 
44
- public static String getJSBundleFile(Context applicationContext, String defaultBundlePath) {
45
- StallionStorage.getInstance().Initialize(applicationContext);
46
- StallionStorage stallionStorageInstance = StallionStorage.getInstance();
47
- String baseFolderPath = applicationContext.getFilesDir().getAbsolutePath();
48
- String switchState = stallionStorageInstance.get(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER);
49
- String currentAppVersion = "";
92
+ private static String getProdBundlePath(String baseFolderPath, String defaultBundlePath) {
93
+ StallionMeta stallionMeta = stateManager.stallionMeta;
94
+
95
+ mountNewProdBundle(baseFolderPath);
96
+
97
+ switch (stallionMeta.getCurrentProdSlot()) {
98
+ case NEW_SLOT:
99
+ return resolveBundlePath(baseFolderPath + StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.NEW_FOLDER_SLOT, defaultBundlePath, stallionMeta.getProdNewHash(), true);
100
+ case STABLE_SLOT:
101
+ return resolveBundlePath(baseFolderPath + StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.STABLE_FOLDER_SLOT, defaultBundlePath, stallionMeta.getProdStableHash(), true);
102
+ default:
103
+ return getDefaultBundle(defaultBundlePath);
104
+ }
105
+ }
106
+
107
+ private static String getStageBundlePath(String baseFolderPath, String defaultBundlePath) {
108
+ StallionMeta stallionMeta = stateManager.stallionMeta;
109
+
110
+ mountNewStageBundle(baseFolderPath);
111
+
112
+ switch (stallionMeta.getCurrentStageSlot()) {
113
+ case NEW_SLOT:
114
+ return resolveBundlePath(baseFolderPath + StallionConfigConstants.STAGE_DIRECTORY + StallionConfigConstants.NEW_FOLDER_SLOT, defaultBundlePath, stallionMeta.getStageNewHash(), false);
115
+ default:
116
+ return getDefaultBundle(defaultBundlePath);
117
+ }
118
+ }
119
+
120
+ private static void sendInstallEvent(String releaseHash) {
50
121
  try {
51
- String stallionAppVersionCache = stallionStorageInstance.get(StallionConstants.STALLION_APP_VERSION_IDENTIFIER);
52
- currentAppVersion = getAppVersion();
53
- if(!stallionAppVersionCache.equals(currentAppVersion)) {
54
- stallionStorageInstance.set(StallionConstants.STALLION_APP_VERSION_IDENTIFIER, currentAppVersion);
55
- StallionRollbackManager.fallbackProd();
56
- }
57
- } catch (PackageManager.NameNotFoundException e) {}
58
-
59
- if(switchState.isEmpty()) {
60
- stallionStorageInstance.set(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER, StallionConstants.SwitchState.PROD.toString());
61
- switchState = StallionConstants.SwitchState.PROD.toString();
122
+ JSONObject eventPayload = new JSONObject();
123
+ eventPayload.put("releaseHash", releaseHash);
124
+
125
+ StallionEventManager.getInstance().sendEvent(
126
+ StallionEventConstants.NativeProdEventTypes.INSTALLED_PROD.toString(),
127
+ eventPayload
128
+ );
129
+ } catch (Exception e) {
130
+ e.printStackTrace();
62
131
  }
63
- if(switchState.equals(StallionConstants.SwitchState.PROD.toString())) {
64
- String currentProdSlot = stallionStorageInstance.get(StallionConstants.CURRENT_PROD_SLOT_KEY);
65
- switch (currentProdSlot) {
66
- case StallionConstants.TEMP_FOLDER_SLOT:
67
- String newReleaseHash = stallionStorageInstance.get(StallionConstants.PROD_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT);
68
- if(!newReleaseHash.isEmpty()) {
69
- StallionRollbackManager.stabilizeRelease();
70
- }
71
- StallionFileUtil.moveFile(
72
- new File(baseFolderPath, StallionConstants.PROD_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT),
73
- new File(baseFolderPath, StallionConstants.PROD_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT)
74
- );
75
- String tempReleaseHash = stallionStorageInstance.get(StallionConstants.PROD_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT);
76
- stallionStorageInstance.set(StallionConstants.PROD_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT, tempReleaseHash);
77
- stallionStorageInstance.set(StallionConstants.CURRENT_PROD_SLOT_KEY, StallionConstants.NEW_FOLDER_SLOT);
78
- stallionStorageInstance.set(StallionConstants.PROD_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT, "");
79
- sendInstallEvent(tempReleaseHash);
80
- return baseFolderPath + StallionConstants.PROD_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT + StallionConstants.UNZIP_FOLDER_NAME + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
81
- case StallionConstants.NEW_FOLDER_SLOT:
82
- return baseFolderPath + StallionConstants.PROD_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT + StallionConstants.UNZIP_FOLDER_NAME + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
83
- case StallionConstants.STABLE_FOLDER_SLOT:
84
- return baseFolderPath + StallionConstants.PROD_DIRECTORY + StallionConstants.STABLE_FOLDER_SLOT + StallionConstants.UNZIP_FOLDER_NAME + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
85
- default:
86
- return getDefaultBundle(defaultBundlePath);
87
- }
132
+ }
133
+
134
+ private static void sendCorruptionEvent(String releaseHash, String folderPath) {
135
+ try {
136
+ JSONObject eventPayload = new JSONObject();
137
+ eventPayload.put("releaseHash", releaseHash);
138
+ eventPayload.put("meta", folderPath);
139
+
140
+ StallionEventManager.getInstance().sendEvent(
141
+ StallionEventConstants.NativeProdEventTypes.CORRUPTED_FILE_ERROR.toString(),
142
+ eventPayload
143
+ );
144
+ } catch (Exception e) {
145
+ e.printStackTrace();
88
146
  }
89
- if(switchState.equals(StallionConstants.SwitchState.STAGE.toString())) {
90
- String currentStageSlot = stallionStorageInstance.get(StallionConstants.CURRENT_STAGE_SLOT_KEY);
91
- switch (currentStageSlot) {
92
- case StallionConstants.TEMP_FOLDER_SLOT:
93
- StallionFileUtil.moveFile(
94
- new File(baseFolderPath, StallionConstants.STAGE_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT),
95
- new File(baseFolderPath, StallionConstants.STAGE_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT)
96
- );
97
- String tempReleaseHash = stallionStorageInstance.get(StallionConstants.STAGE_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT);
98
- stallionStorageInstance.set(StallionConstants.STAGE_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT, tempReleaseHash);
99
- stallionStorageInstance.set(StallionConstants.STAGE_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT, "");
100
- stallionStorageInstance.set(StallionConstants.CURRENT_STAGE_SLOT_KEY, StallionConstants.NEW_FOLDER_SLOT);
101
- return baseFolderPath + StallionConstants.STAGE_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT + StallionConstants.UNZIP_FOLDER_NAME + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
102
- case StallionConstants.NEW_FOLDER_SLOT:
103
- return baseFolderPath + StallionConstants.STAGE_DIRECTORY + StallionConstants.NEW_FOLDER_SLOT + StallionConstants.UNZIP_FOLDER_NAME + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
104
- default:
105
- return getDefaultBundle(defaultBundlePath);
147
+ }
148
+
149
+ private static String resolveBundlePath(String folderPath, String defaultBundlePath, String releaseHash, Boolean isProd) {
150
+ String bundlePath = folderPath + StallionConfigConstants.UNZIP_FOLDER_NAME + StallionConfigConstants.ANDROID_BUNDLE_FILE_NAME;
151
+ if (new File(bundlePath).exists()) {
152
+ return bundlePath;
153
+ } else {
154
+ if(isProd) {
155
+ StallionSlotManager.rollbackProd(true, "Corruped file not found" + folderPath);
156
+ sendCorruptionEvent(releaseHash, folderPath);
157
+ } else {
158
+ StallionSlotManager.rollbackStage();
106
159
  }
160
+ return getDefaultBundle(defaultBundlePath);
107
161
  }
108
- return getDefaultBundle(defaultBundlePath);
162
+ }
163
+
164
+ private static String getDefaultBundle(String defaultBundlePath) {
165
+ return defaultBundlePath != null && !defaultBundlePath.isEmpty()
166
+ ? defaultBundlePath
167
+ : StallionConfigConstants.DEFAULT_JS_BUNDLE_LOCATION_BASE + StallionConfigConstants.ANDROID_BUNDLE_FILE_NAME;
109
168
  }
110
169
  }
170
+
@@ -1,40 +1,46 @@
1
1
  package com.stallion;
2
2
 
3
- import android.content.res.Resources;
4
-
5
3
  import androidx.annotation.NonNull;
6
4
 
7
- import com.facebook.react.bridge.Arguments;
8
- import com.facebook.react.bridge.Callback;
9
5
  import com.facebook.react.bridge.LifecycleEventListener;
10
6
  import com.facebook.react.bridge.Promise;
11
7
  import com.facebook.react.bridge.ReactApplicationContext;
12
8
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
13
9
  import com.facebook.react.bridge.ReactMethod;
14
10
  import com.facebook.react.bridge.ReadableMap;
15
- import com.facebook.react.bridge.WritableMap;
16
11
  import com.facebook.react.module.annotations.ReactModule;
17
12
  import com.facebook.react.modules.core.DeviceEventManagerModule;
13
+ import com.stallion.events.StallionEventManager;
14
+ import com.stallion.networkmanager.StallionStageManager;
15
+ import com.stallion.networkmanager.StallionSyncHandler;
16
+ import com.stallion.storage.StallionConfigConstants;
17
+
18
+ import com.stallion.storage.StallionMetaConstants;
19
+ import com.stallion.storage.StallionStateManager;
20
+
21
+ import org.json.JSONArray;
22
+ import org.json.JSONException;
23
+
24
+ import java.util.ArrayList;
25
+ import java.util.List;
26
+
18
27
 
19
- @ReactModule(name = StallionConstants.MODULE_NAME)
28
+ @ReactModule(name = StallionConfigConstants.MODULE_NAME)
20
29
  public class StallionModule extends ReactContextBaseJavaModule implements LifecycleEventListener {
21
30
  private final ReactApplicationContext currentReactContext;
22
- private final StallionStorage stallionStorage;
23
- private DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter;
31
+ private final StallionStateManager stallionStateManager;
24
32
 
25
33
  public StallionModule(ReactApplicationContext reactContext) {
26
34
  super(reactContext);
35
+ StallionStateManager.init(reactContext);
36
+ this.stallionStateManager = StallionStateManager.getInstance();
27
37
  this.currentReactContext = reactContext;
28
- StallionStorage.getInstance().Initialize(reactContext);
29
- this.stallionStorage = StallionStorage.getInstance();
30
- StallionErrorBoundary.initErrorBoundary(reactContext);
31
- StallionErrorBoundary.toggleExceptionHandler(true);
32
38
  reactContext.addLifecycleEventListener(this);
33
39
  }
34
40
 
35
41
  @Override
36
42
  public void onHostResume() {
37
- StallionSynManager.sync();
43
+ StallionSyncHandler.sync();
38
44
  }
39
45
 
40
46
  @Override
@@ -52,106 +58,113 @@ public class StallionModule extends ReactContextBaseJavaModule implements Lifecy
52
58
  @Override
53
59
  @NonNull
54
60
  public String getName() {
55
- return StallionConstants.MODULE_NAME;
61
+ return StallionConfigConstants.MODULE_NAME;
56
62
  }
57
63
 
58
64
  @ReactMethod
59
- public void setStorage(String key, String value) {
60
- this.stallionStorage.set(key, value);
65
+ public void onLaunch(String launchData) {
66
+ stallionStateManager.setIsMounted(true);
67
+
68
+ DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = this.currentReactContext.getJSModule(
69
+ DeviceEventManagerModule.RCTDeviceEventEmitter.class
70
+ );
71
+ StallionEventManager.getInstance().setEmitter(eventEmitter);
72
+
73
+ checkPendingDownloads();
61
74
  }
62
75
 
76
+ private void checkPendingDownloads() {
77
+ String pendingReleaseUrl = stallionStateManager.getPendingReleaseUrl();
78
+ String pendingReleaseHash = stallionStateManager.getPendingReleaseHash();
79
+ if(!pendingReleaseUrl.isEmpty() && !pendingReleaseHash.isEmpty()) {
80
+ StallionSyncHandler.downloadNewRelease(pendingReleaseHash, pendingReleaseUrl);
81
+ stallionStateManager.setPendingRelease("", "");
82
+ }
83
+ }
63
84
 
64
85
  @ReactMethod
65
- public void getStorage(String key, Callback callback) {
66
- callback.invoke(this.stallionStorage.get(key));
86
+ public void getStallionConfig(Promise promise) {
87
+ try {
88
+ String stallionConfigJsonString = stallionStateManager.getStallionConfig().toJSON().toString();
89
+ promise.resolve(stallionConfigJsonString);
90
+ } catch (Exception e) {
91
+ promise.reject("getStallionConfig error:", e.toString());
92
+ }
67
93
  }
68
94
 
69
95
  @ReactMethod
70
- public void onLaunch(String launchData) {
71
- StallionStorage.getInstance().setIsMounted();
72
- StallionEventEmitter.triggerPendingEvents();
96
+ public void getStallionMeta(Promise promise) {
97
+ try {
98
+ String stallionMetaJsonString = stallionStateManager.stallionMeta.toJSON().toString();
99
+ promise.resolve(stallionMetaJsonString);
100
+ } catch (Exception e) {
101
+ promise.reject("getStallionMeta error:", e.toString());
102
+ }
73
103
  }
74
104
 
75
105
  @ReactMethod
76
- public void getUniqueId(Callback callback) {
77
- callback.invoke(StallionCommonUtil.getUniqueId());
106
+ public void toggleStallionSwitch(String switchState, Promise promise) {
107
+ try {
108
+ stallionStateManager.stallionMeta.setSwitchState(StallionMetaConstants.SwitchState.fromString(switchState));
109
+ stallionStateManager.syncStallionMeta();
110
+ promise.resolve("Success");
111
+ } catch (Exception e) {
112
+ promise.reject("toggleStallionSwitch error:", e.toString());
113
+ }
78
114
  }
79
115
 
80
116
  @ReactMethod
81
- public void getProjectId(Callback callback) {
82
- Resources res = currentReactContext.getResources();
83
- String parentPackageName= currentReactContext.getPackageName();
84
- int stallionProjectIdRes = res.getIdentifier(StallionConstants.STALLION_PROJECT_ID_IDENTIFIER, "string", parentPackageName);
85
- String projectId = currentReactContext.getString(stallionProjectIdRes);
86
- callback.invoke(projectId);
117
+ public void updateSdkToken(String newSdkToken, Promise promise) {
118
+ try {
119
+ stallionStateManager.getStallionConfig().updateSdkToken(newSdkToken);
120
+ promise.resolve("updateSdkToken success");
121
+ } catch (Exception e) {
122
+ promise.reject("updateSdkToken error:", e.toString());
123
+ }
87
124
  }
88
125
 
89
126
  @ReactMethod
90
- public void getAppToken(Callback callback) {
91
- Resources res = currentReactContext.getResources();
92
- String parentPackageName= currentReactContext.getPackageName();
93
- int stallionAppTokenRes = res.getIdentifier(StallionConstants.STALLION_APP_TOKEN_IDENTIFIER, "string", parentPackageName);
94
- String appToken = currentReactContext.getString(stallionAppTokenRes);
95
- callback.invoke(appToken);
127
+ public void sync() {
128
+ StallionSyncHandler.sync();
96
129
  }
97
130
 
98
131
  @ReactMethod
99
- public void sync() {
100
- StallionSynManager.sync();
132
+ public void downloadStageBundle(ReadableMap bundleInfo, Promise promise) {
133
+ StallionStageManager.downloadStageBundle(bundleInfo, promise);
101
134
  }
102
135
 
103
136
  @ReactMethod
104
- public void downloadPackage(ReadableMap bundleInfo, Promise promise) {
105
- String receivedDownloadUrl = bundleInfo.getString("url");
106
- String receivedHash = bundleInfo.getString("hash");
107
- String sdkToken = stallionStorage.get(StallionConstants.STALLION_SDK_TOKEN_KEY);
108
- StallionDownloadManager.downloadBundle(
109
- receivedDownloadUrl,
110
- this.currentReactContext.getFilesDir().getAbsolutePath() + StallionConstants.STAGE_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT,
111
- sdkToken,
112
- "",
113
- new StallionDownloadCallback() {
114
- @Override
115
- public void onReject(String prefix, String error) {
116
- WritableMap errorEventPayload = Arguments.createMap();
117
- errorEventPayload.putString("releaseHash", receivedHash);
118
- StallionEventEmitter.sendEvent(
119
- StallionEventEmitter.getEventPayload(
120
- StallionConstants.NativeEventTypesStage.DOWNLOAD_ERROR_STAGE.toString(),
121
- errorEventPayload
122
- )
123
- );
124
- promise.reject(prefix, error);
125
- }
126
-
127
- @Override
128
- public void onSuccess(String successPayload) {
129
- stallionStorage.set(StallionConstants.CURRENT_STAGE_SLOT_KEY, StallionConstants.TEMP_FOLDER_SLOT);
130
- stallionStorage.set(StallionConstants.STAGE_DIRECTORY + StallionConstants.TEMP_FOLDER_SLOT, receivedHash);
131
- WritableMap successEventPayload = Arguments.createMap();
132
- successEventPayload.putString("releaseHash", receivedHash);
133
- StallionEventEmitter.sendEvent(
134
- StallionEventEmitter.getEventPayload(
135
- StallionConstants.NativeEventTypesStage.DOWNLOAD_COMPLETE_STAGE.toString(),
136
- successEventPayload
137
- )
138
- );
139
- promise.resolve(StallionConstants.DOWNLOAD_SUCCESS_MESSAGE);
140
- }
141
-
142
- @Override
143
- public void onProgress(double downloadFraction) {
144
- WritableMap progressEventPayload = Arguments.createMap();
145
- progressEventPayload.putString("releaseHash", receivedHash);
146
- progressEventPayload.putDouble("progress", downloadFraction);
147
- StallionEventEmitter.sendEvent(
148
- StallionEventEmitter.getEventPayload(
149
- StallionConstants.NativeEventTypesStage.DOWNLOAD_PROGRESS_STAGE.toString(),
150
- progressEventPayload
151
- )
152
- );
153
- }
137
+ public void popEvents(Promise promise) {
138
+ try {
139
+ promise.resolve(StallionEventManager.getInstance().popEvents());
140
+ } catch (Exception e) {
141
+ promise.reject("popEvents error: ", e.toString());
142
+ }
143
+ }
144
+
145
+ @ReactMethod
146
+ public void acknowledgeEvents(String eventIdsJson, Promise promise) {
147
+ try {
148
+ // Parse the stringified JSON array into a Java List
149
+ JSONArray jsonArray = new JSONArray(eventIdsJson);
150
+ List<String> eventIds = new ArrayList<>();
151
+
152
+ for (int i = 0; i < jsonArray.length(); i++) {
153
+ eventIds.add(jsonArray.getString(i));
154
154
  }
155
- );
155
+
156
+ // Use StallionEventManager to acknowledge the events
157
+ StallionEventManager eventManager = StallionEventManager.getInstance();
158
+ eventManager.acknowledgeEvents(eventIds);
159
+
160
+ // Resolve the promise indicating success
161
+ promise.resolve("Events acknowledged successfully.");
162
+ } catch (JSONException e) {
163
+ // Reject the promise if JSON parsing fails
164
+ promise.reject("ACKNOWLEDGE_EVENTS_JSON_ERROR", "Invalid JSON format for event IDs: " + e.getMessage(), e);
165
+ } catch (Exception e) {
166
+ // Reject the promise for other errors
167
+ promise.reject("ACKNOWLEDGE_EVENTS_ERROR", "Failed to acknowledge events: " + e.getMessage(), e);
168
+ }
156
169
  }
157
170
  }
@@ -0,0 +1,22 @@
1
+ package com.stallion.events;
2
+
3
+ public class StallionEventConstants {
4
+ public enum NativeProdEventTypes {
5
+ DOWNLOAD_STARTED_PROD,
6
+ DOWNLOAD_ERROR_PROD,
7
+ DOWNLOAD_COMPLETE_PROD,
8
+ SYNC_ERROR_PROD,
9
+ ROLLED_BACK_PROD,
10
+ INSTALLED_PROD,
11
+ STABILIZED_PROD,
12
+ EXCEPTION_PROD,
13
+ AUTO_ROLLED_BACK_PROD,
14
+ CORRUPTED_FILE_ERROR
15
+ }
16
+
17
+ public enum NativeStageEventTypes {
18
+ DOWNLOAD_PROGRESS_STAGE,
19
+ DOWNLOAD_COMPLETE_STAGE,
20
+ EXCEPTION_STAGE
21
+ }
22
+ }