react-native-stallion 1.1.2 → 2.0.0-alpha.2

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 (296) hide show
  1. package/android/src/main/java/com/stallion/Stallion.java +153 -9
  2. package/android/src/main/java/com/stallion/StallionModule.java +128 -167
  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/networkmanager/StallionDownloadCallback.java +7 -0
  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 +110 -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 +102 -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 +6 -1
  21. package/ios/main/Stallion.m +28 -9
  22. package/ios/main/Stallion.swift +132 -50
  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 +53 -10
  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 +137 -20
  40. package/ios/main/StallionObjConstants.h +47 -0
  41. package/ios/main/StallionObjConstants.m +128 -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 +6 -2
  49. package/src/index.js +5 -15
  50. package/src/index.js.map +1 -1
  51. package/src/main/components/common/ButtonFullWidth/styles.js +2 -2
  52. package/src/main/components/common/ButtonFullWidth/styles.js.map +1 -1
  53. package/src/main/components/common/Footer/index.js +24 -31
  54. package/src/main/components/common/Footer/index.js.map +1 -1
  55. package/src/main/components/common/Footer/styles.js +34 -33
  56. package/src/main/components/common/Footer/styles.js.map +1 -1
  57. package/src/main/components/common/Header/index.js +14 -17
  58. package/src/main/components/common/Header/index.js.map +1 -1
  59. package/src/main/components/common/Header/styles.js +10 -5
  60. package/src/main/components/common/Header/styles.js.map +1 -1
  61. package/src/main/components/common/Spinner/index.js +3 -1
  62. package/src/main/components/common/Spinner/index.js.map +1 -1
  63. package/src/main/components/modules/listing/components/BucketCard.js +3 -3
  64. package/src/main/components/modules/listing/components/BucketCard.js.map +1 -1
  65. package/src/main/components/modules/listing/components/BundleCard.js +9 -5
  66. package/src/main/components/modules/listing/components/BundleCard.js.map +1 -1
  67. package/src/main/components/modules/listing/components/BundleCardInfoSection.js +21 -12
  68. package/src/main/components/modules/listing/components/BundleCardInfoSection.js.map +1 -1
  69. package/src/main/components/modules/listing/components/CardDescriptionContent.js +3 -2
  70. package/src/main/components/modules/listing/components/CardDescriptionContent.js.map +1 -1
  71. package/src/main/components/modules/listing/components/ConfigView.js +19 -0
  72. package/src/main/components/modules/listing/components/ConfigView.js.map +1 -0
  73. package/src/main/components/modules/listing/components/MetaCard.js +38 -0
  74. package/src/main/components/modules/listing/components/MetaCard.js.map +1 -0
  75. package/src/main/components/modules/listing/components/SlotView.js +84 -0
  76. package/src/main/components/modules/listing/components/SlotView.js.map +1 -0
  77. package/src/main/components/modules/listing/components/styles/index.js +31 -10
  78. package/src/main/components/modules/listing/components/styles/index.js.map +1 -1
  79. package/src/main/components/modules/listing/hooks/useListing.js +5 -4
  80. package/src/main/components/modules/listing/hooks/useListing.js.map +1 -1
  81. package/src/main/components/modules/listing/index.js +12 -4
  82. package/src/main/components/modules/listing/index.js.map +1 -1
  83. package/src/main/components/modules/login/index.js +42 -38
  84. package/src/main/components/modules/login/index.js.map +1 -1
  85. package/src/main/components/modules/login/styles/index.js +21 -7
  86. package/src/main/components/modules/login/styles/index.js.map +1 -1
  87. package/src/main/components/modules/modal/StallionModal.js +28 -31
  88. package/src/main/components/modules/modal/StallionModal.js.map +1 -1
  89. package/src/main/components/modules/modal/hooks/useStallionModal.js +16 -52
  90. package/src/main/components/modules/modal/hooks/useStallionModal.js.map +1 -1
  91. package/src/main/components/modules/prod/index.js +3 -0
  92. package/src/main/components/modules/prod/index.js.map +1 -0
  93. package/src/main/components/modules/prod/prod.js +35 -0
  94. package/src/main/components/modules/prod/prod.js.map +1 -0
  95. package/src/main/components/modules/prod/styles/index.js +23 -0
  96. package/src/main/components/modules/prod/styles/index.js.map +1 -0
  97. package/src/main/constants/apiConstants.js +4 -2
  98. package/src/main/constants/apiConstants.js.map +1 -1
  99. package/src/main/constants/appConstants.js +43 -7
  100. package/src/main/constants/appConstants.js.map +1 -1
  101. package/src/main/constants/colors.js +8 -6
  102. package/src/main/constants/colors.js.map +1 -1
  103. package/src/main/state/actionCreators/useBucketActions.js +10 -13
  104. package/src/main/state/actionCreators/useBucketActions.js.map +1 -1
  105. package/src/main/state/actionCreators/useBundleActions.js +14 -17
  106. package/src/main/state/actionCreators/useBundleActions.js.map +1 -1
  107. package/src/main/state/actionCreators/useConfigActions.js +20 -0
  108. package/src/main/state/actionCreators/useConfigActions.js.map +1 -0
  109. package/src/main/state/actionCreators/useDownloadActions.js +20 -42
  110. package/src/main/state/actionCreators/useDownloadActions.js.map +1 -1
  111. package/src/main/state/actionCreators/useMetaActions.js +6 -5
  112. package/src/main/state/actionCreators/useMetaActions.js.map +1 -1
  113. package/src/main/state/actionCreators/useUpdateMetaActions.js +77 -0
  114. package/src/main/state/actionCreators/useUpdateMetaActions.js.map +1 -0
  115. package/src/main/state/actionCreators/useUserActions.js +25 -85
  116. package/src/main/state/actionCreators/useUserActions.js.map +1 -1
  117. package/src/main/state/actions/configActions.js +8 -0
  118. package/src/main/state/actions/configActions.js.map +1 -0
  119. package/src/main/state/actions/userActions.js +3 -15
  120. package/src/main/state/actions/userActions.js.map +1 -1
  121. package/src/main/state/index.js +30 -13
  122. package/src/main/state/index.js.map +1 -1
  123. package/src/main/state/reducers/configReducer.js +19 -0
  124. package/src/main/state/reducers/configReducer.js.map +1 -0
  125. package/src/main/state/reducers/updateMetaReducer.js +36 -0
  126. package/src/main/state/reducers/updateMetaReducer.js.map +1 -0
  127. package/src/main/state/reducers/userReducer.js +3 -37
  128. package/src/main/state/reducers/userReducer.js.map +1 -1
  129. package/src/main/state/useStallionEvents.js +102 -0
  130. package/src/main/state/useStallionEvents.js.map +1 -0
  131. package/src/main/utils/ErrorBoundary.js +19 -16
  132. package/src/main/utils/ErrorBoundary.js.map +1 -1
  133. package/src/main/utils/StallionEventEmitter.js +20 -0
  134. package/src/main/utils/StallionEventEmitter.js.map +1 -0
  135. package/src/main/utils/StallionNativeUtils.js +35 -0
  136. package/src/main/utils/StallionNativeUtils.js.map +1 -0
  137. package/src/main/utils/debounce.js +16 -0
  138. package/src/main/utils/debounce.js.map +1 -0
  139. package/src/main/utils/useApiClient.js +28 -0
  140. package/src/main/utils/useApiClient.js.map +1 -0
  141. package/src/main/utils/useStallionModal.js +4 -3
  142. package/src/main/utils/useStallionModal.js.map +1 -1
  143. package/src/main/utils/useStallionUpdate.js +14 -0
  144. package/src/main/utils/useStallionUpdate.js.map +1 -0
  145. package/src/main/utils/withStallion.js +1 -4
  146. package/src/main/utils/withStallion.js.map +1 -1
  147. package/src/types/config.types.js +5 -0
  148. package/src/types/config.types.js.map +1 -0
  149. package/src/types/meta.types.js +11 -0
  150. package/src/types/meta.types.js.map +1 -1
  151. package/src/types/updateMeta.types.js +7 -0
  152. package/src/types/updateMeta.types.js.map +1 -0
  153. package/src/types/user.types.js +1 -2
  154. package/src/types/user.types.js.map +1 -1
  155. package/types/index.d.ts +3 -0
  156. package/types/index.d.ts.map +1 -1
  157. package/types/main/components/common/Footer/index.d.ts +1 -4
  158. package/types/main/components/common/Footer/index.d.ts.map +1 -1
  159. package/types/main/components/common/Footer/styles.d.ts +30 -29
  160. package/types/main/components/common/Footer/styles.d.ts.map +1 -1
  161. package/types/main/components/common/Header/index.d.ts +0 -2
  162. package/types/main/components/common/Header/index.d.ts.map +1 -1
  163. package/types/main/components/common/Header/styles.d.ts +6 -1
  164. package/types/main/components/common/Header/styles.d.ts.map +1 -1
  165. package/types/main/components/common/Spinner/index.d.ts.map +1 -1
  166. package/types/main/components/modules/listing/components/BucketCard.d.ts.map +1 -1
  167. package/types/main/components/modules/listing/components/BundleCard.d.ts.map +1 -1
  168. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts +2 -0
  169. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts.map +1 -1
  170. package/types/main/components/modules/listing/components/CardDescriptionContent.d.ts.map +1 -1
  171. package/types/main/components/modules/listing/components/ConfigView.d.ts +8 -0
  172. package/types/main/components/modules/listing/components/ConfigView.d.ts.map +1 -0
  173. package/types/main/components/modules/listing/components/MetaCard.d.ts +8 -0
  174. package/types/main/components/modules/listing/components/MetaCard.d.ts.map +1 -0
  175. package/types/main/components/modules/listing/components/SlotView.d.ts +5 -0
  176. package/types/main/components/modules/listing/components/SlotView.d.ts.map +1 -0
  177. package/types/main/components/modules/listing/components/styles/index.d.ts +26 -5
  178. package/types/main/components/modules/listing/components/styles/index.d.ts.map +1 -1
  179. package/types/main/components/modules/listing/hooks/useListing.d.ts +2 -0
  180. package/types/main/components/modules/listing/hooks/useListing.d.ts.map +1 -1
  181. package/types/main/components/modules/listing/index.d.ts.map +1 -1
  182. package/types/main/components/modules/login/index.d.ts.map +1 -1
  183. package/types/main/components/modules/login/styles/index.d.ts +17 -3
  184. package/types/main/components/modules/login/styles/index.d.ts.map +1 -1
  185. package/types/main/components/modules/modal/StallionModal.d.ts.map +1 -1
  186. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts +2 -11
  187. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts.map +1 -1
  188. package/types/main/components/modules/prod/index.d.ts +3 -0
  189. package/types/main/components/modules/prod/index.d.ts.map +1 -0
  190. package/types/main/components/modules/prod/prod.d.ts +4 -0
  191. package/types/main/components/modules/prod/prod.d.ts.map +1 -0
  192. package/types/main/components/modules/prod/styles/index.d.ts +19 -0
  193. package/types/main/components/modules/prod/styles/index.d.ts.map +1 -0
  194. package/types/main/constants/apiConstants.d.ts +5 -3
  195. package/types/main/constants/apiConstants.d.ts.map +1 -1
  196. package/types/main/constants/appConstants.d.ts +40 -7
  197. package/types/main/constants/appConstants.d.ts.map +1 -1
  198. package/types/main/constants/colors.d.ts +2 -0
  199. package/types/main/constants/colors.d.ts.map +1 -1
  200. package/types/main/index.d.ts +1 -1
  201. package/types/main/state/actionCreators/useBucketActions.d.ts +2 -1
  202. package/types/main/state/actionCreators/useBucketActions.d.ts.map +1 -1
  203. package/types/main/state/actionCreators/useBundleActions.d.ts +2 -1
  204. package/types/main/state/actionCreators/useBundleActions.d.ts.map +1 -1
  205. package/types/main/state/actionCreators/useConfigActions.d.ts +7 -0
  206. package/types/main/state/actionCreators/useConfigActions.d.ts.map +1 -0
  207. package/types/main/state/actionCreators/useDownloadActions.d.ts +5 -2
  208. package/types/main/state/actionCreators/useDownloadActions.d.ts.map +1 -1
  209. package/types/main/state/actionCreators/useMetaActions.d.ts +1 -1
  210. package/types/main/state/actionCreators/useMetaActions.d.ts.map +1 -1
  211. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts +8 -0
  212. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts.map +1 -0
  213. package/types/main/state/actionCreators/useUserActions.d.ts +5 -7
  214. package/types/main/state/actionCreators/useUserActions.d.ts.map +1 -1
  215. package/types/main/state/actions/configActions.d.ts +3 -0
  216. package/types/main/state/actions/configActions.d.ts.map +1 -0
  217. package/types/main/state/actions/userActions.d.ts +2 -4
  218. package/types/main/state/actions/userActions.d.ts.map +1 -1
  219. package/types/main/state/index.d.ts.map +1 -1
  220. package/types/main/state/reducers/configReducer.d.ts +4 -0
  221. package/types/main/state/reducers/configReducer.d.ts.map +1 -0
  222. package/types/main/state/reducers/updateMetaReducer.d.ts +10 -0
  223. package/types/main/state/reducers/updateMetaReducer.d.ts.map +1 -0
  224. package/types/main/state/reducers/userReducer.d.ts.map +1 -1
  225. package/types/main/state/useStallionEvents.d.ts +12 -0
  226. package/types/main/state/useStallionEvents.d.ts.map +1 -0
  227. package/types/main/utils/ErrorBoundary.d.ts +1 -1
  228. package/types/main/utils/ErrorBoundary.d.ts.map +1 -1
  229. package/types/main/utils/StallionEventEmitter.d.ts +11 -0
  230. package/types/main/utils/StallionEventEmitter.d.ts.map +1 -0
  231. package/types/main/utils/StallionNativeUtils.d.ts +11 -0
  232. package/types/main/utils/StallionNativeUtils.d.ts.map +1 -0
  233. package/types/main/utils/debounce.d.ts +3 -0
  234. package/types/main/utils/debounce.d.ts.map +1 -0
  235. package/types/main/utils/useApiClient.d.ts +8 -0
  236. package/types/main/utils/useApiClient.d.ts.map +1 -0
  237. package/types/main/utils/useStallionUpdate.d.ts +3 -0
  238. package/types/main/utils/useStallionUpdate.d.ts.map +1 -0
  239. package/types/main/utils/withStallion.d.ts +1 -2
  240. package/types/main/utils/withStallion.d.ts.map +1 -1
  241. package/types/types/config.types.d.ts +16 -0
  242. package/types/types/config.types.d.ts.map +1 -0
  243. package/types/types/globalProvider.types.d.ts +10 -10
  244. package/types/types/globalProvider.types.d.ts.map +1 -1
  245. package/types/types/meta.types.d.ts +18 -3
  246. package/types/types/meta.types.d.ts.map +1 -1
  247. package/types/types/updateMeta.types.d.ts +37 -0
  248. package/types/types/updateMeta.types.d.ts.map +1 -0
  249. package/types/types/user.types.d.ts +5 -20
  250. package/types/types/user.types.d.ts.map +1 -1
  251. package/types/types/utils.types.d.ts +15 -11
  252. package/types/types/utils.types.d.ts.map +1 -1
  253. package/android/src/main/java/com/stallion/StallionConstants.java +0 -37
  254. package/android/src/main/java/com/stallion/StallionErrorBoundary.java +0 -49
  255. package/android/src/main/java/com/stallion/StallionStorage.java +0 -54
  256. package/android/src/main/java/com/stallion/StallionZip.java +0 -127
  257. package/ios/main/StallionDownloader.swift +0 -124
  258. package/ios/main/StallionErrorBoundary.h +0 -17
  259. package/ios/main/StallionErrorBoundary.m +0 -62
  260. package/ios/main/StallionUtil.swift +0 -29
  261. package/src/main/components/common/ProfileOverlay/index.js +0 -39
  262. package/src/main/components/common/ProfileOverlay/index.js.map +0 -1
  263. package/src/main/components/common/ProfileOverlay/styles.js +0 -39
  264. package/src/main/components/common/ProfileOverlay/styles.js.map +0 -1
  265. package/src/main/components/modules/login/components/Email.js +0 -41
  266. package/src/main/components/modules/login/components/Email.js.map +0 -1
  267. package/src/main/components/modules/login/components/Otp.js +0 -45
  268. package/src/main/components/modules/login/components/Otp.js.map +0 -1
  269. package/src/main/components/modules/login/components/styles/index.js +0 -28
  270. package/src/main/components/modules/login/components/styles/index.js.map +0 -1
  271. package/src/main/components/modules/login/hooks/useLoginFlow.js +0 -60
  272. package/src/main/components/modules/login/hooks/useLoginFlow.js.map +0 -1
  273. package/src/main/utils/SharedDataManager.js +0 -34
  274. package/src/main/utils/SharedDataManager.js.map +0 -1
  275. package/src/main/utils/StallionNaitveUtils.js +0 -7
  276. package/src/main/utils/StallionNaitveUtils.js.map +0 -1
  277. package/src/main/utils/apiUtils.js +0 -16
  278. package/src/main/utils/apiUtils.js.map +0 -1
  279. package/types/main/components/common/ProfileOverlay/index.d.ts +0 -10
  280. package/types/main/components/common/ProfileOverlay/index.d.ts.map +0 -1
  281. package/types/main/components/common/ProfileOverlay/styles.d.ts +0 -36
  282. package/types/main/components/common/ProfileOverlay/styles.d.ts.map +0 -1
  283. package/types/main/components/modules/login/components/Email.d.ts +0 -13
  284. package/types/main/components/modules/login/components/Email.d.ts.map +0 -1
  285. package/types/main/components/modules/login/components/Otp.d.ts +0 -12
  286. package/types/main/components/modules/login/components/Otp.d.ts.map +0 -1
  287. package/types/main/components/modules/login/components/styles/index.d.ts +0 -25
  288. package/types/main/components/modules/login/components/styles/index.d.ts.map +0 -1
  289. package/types/main/components/modules/login/hooks/useLoginFlow.d.ts +0 -18
  290. package/types/main/components/modules/login/hooks/useLoginFlow.d.ts.map +0 -1
  291. package/types/main/utils/SharedDataManager.d.ts +0 -18
  292. package/types/main/utils/SharedDataManager.d.ts.map +0 -1
  293. package/types/main/utils/StallionNaitveUtils.d.ts +0 -7
  294. package/types/main/utils/StallionNaitveUtils.d.ts.map +0 -1
  295. package/types/main/utils/apiUtils.d.ts +0 -7
  296. package/types/main/utils/apiUtils.d.ts.map +0 -1
@@ -2,25 +2,169 @@ package com.stallion;
2
2
 
3
3
  import android.content.Context;
4
4
 
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;
15
+
16
+ import java.io.File;
17
+
5
18
  public class Stallion {
6
19
 
20
+ private static StallionStateManager stateManager;
21
+
7
22
  public static String getJSBundleFile(Context applicationContext) {
8
23
  return getJSBundleFile(applicationContext, null);
9
24
  }
10
25
 
11
26
  public static String getJSBundleFile(Context applicationContext, String defaultBundlePath) {
12
- StallionStorage.getInstance().Initialize(applicationContext);
13
- StallionStorage stallionStorageInstance = StallionStorage.getInstance();
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, "");;
14
49
  if (
15
- stallionStorageInstance.get(StallionConstants.ACTIVE_BUCKET_IDENTIFIER) != null &&
16
- stallionStorageInstance.get(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER) != null &&
17
- stallionStorageInstance.get(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER).equals(StallionConstants.STALLION_SWITCH_ON)
50
+ currentAppVersion != null
51
+ && !currentAppVersion.isEmpty()
52
+ && !cachedAppVersion.equals(currentAppVersion)
18
53
  ) {
19
- int currentActiveSlot = stallionStorageInstance.getInt(StallionConstants.ACTIVE_SLOT_IDENTIFIER);
20
- return applicationContext.getFilesDir().getAbsolutePath() + StallionConstants.STALLION_PACKAGE_PATH + StallionConstants.BUNDLE_DEST_FOLDER_DIR + StallionConstants.SLOT_FOLDER_DIR + currentActiveSlot + "/" + StallionConstants.UNZIP_FOLDER_NAME + "/" + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
54
+ stallionStateManager.setString(StallionConfigConstants.STALLION_APP_VERSION_IDENTIFIER, currentAppVersion);
55
+ StallionSlotManager.fallbackProd();
56
+ }
57
+ }
58
+
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
+ }
74
+ }
75
+
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
+ }
90
+ }
91
+
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) {
121
+ try {
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();
131
+ }
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();
146
+ }
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;
21
153
  } else {
22
- if (defaultBundlePath != null) return defaultBundlePath;
23
- return StallionConstants.DEFAULT_JS_BUNDLE_LOCATION_BASE + StallionConstants.ANDROID_BUNDLE_FILE_NAME;
154
+ if(isProd) {
155
+ StallionSlotManager.rollbackProd(true, "Corruped file not found" + folderPath);
156
+ sendCorruptionEvent(releaseHash, folderPath);
157
+ } else {
158
+ StallionSlotManager.rollbackStage();
159
+ }
160
+ return getDefaultBundle(defaultBundlePath);
24
161
  }
25
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;
168
+ }
26
169
  }
170
+
@@ -2,210 +2,171 @@ package com.stallion;
2
2
 
3
3
  import androidx.annotation.NonNull;
4
4
 
5
- import com.facebook.react.bridge.Arguments;
6
- import com.facebook.react.bridge.Callback;
5
+ import com.facebook.react.bridge.LifecycleEventListener;
7
6
  import com.facebook.react.bridge.Promise;
8
7
  import com.facebook.react.bridge.ReactApplicationContext;
9
8
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
10
9
  import com.facebook.react.bridge.ReactMethod;
11
10
  import com.facebook.react.bridge.ReadableMap;
12
- import com.facebook.react.bridge.WritableMap;
13
11
  import com.facebook.react.module.annotations.ReactModule;
14
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;
15
17
 
16
- import android.util.Log;
17
-
18
- import java.io.BufferedInputStream;
19
- import java.io.BufferedOutputStream;
20
- import java.io.File;
21
- import java.io.FileOutputStream;
22
- import java.io.IOException;
23
- import java.net.HttpURLConnection;
24
- import java.net.URL;
25
- import java.nio.ByteBuffer;
26
- import java.util.concurrent.ExecutorService;
27
- import java.util.concurrent.Executors;
28
-
29
- @ReactModule(name = StallionConstants.MODULE_NAME)
30
- public class StallionModule extends ReactContextBaseJavaModule {
31
- private ReactApplicationContext currentReactContext;
32
- private String baseDir;
33
- private StallionStorage stallionStorage;
34
- private DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter;
18
+ import com.stallion.storage.StallionMetaConstants;
19
+ import com.stallion.storage.StallionStateManager;
20
+ import com.stallion.utils.StallionExceptionHandler;
21
+
22
+ import org.json.JSONArray;
23
+ import org.json.JSONException;
24
+
25
+ import java.util.ArrayList;
26
+ import java.util.List;
27
+
28
+
29
+ @ReactModule(name = StallionConfigConstants.MODULE_NAME)
30
+ public class StallionModule extends ReactContextBaseJavaModule implements LifecycleEventListener {
31
+ private final ReactApplicationContext currentReactContext;
32
+ private final StallionStateManager stallionStateManager;
35
33
 
36
34
  public StallionModule(ReactApplicationContext reactContext) {
37
35
  super(reactContext);
36
+ StallionStateManager.init(reactContext);
37
+ this.stallionStateManager = StallionStateManager.getInstance();
38
38
  this.currentReactContext = reactContext;
39
- this.baseDir = reactContext.getFilesDir().getAbsolutePath() + StallionConstants.STALLION_PACKAGE_PATH;
40
- StallionStorage.getInstance().Initialize(reactContext);
41
- this.stallionStorage = StallionStorage.getInstance();
42
- StallionErrorBoundary.initErrorBoundary(reactContext);
43
- String switchState = this.stallionStorage.get(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER);
44
- Boolean isStallionEnabled = switchState == null ? false : switchState.equals(StallionConstants.STALLION_SWITCH_ON);
45
- StallionErrorBoundary.toggleExceptionHandler(isStallionEnabled);
39
+ StallionExceptionHandler.initErrorBoundary(reactContext);
40
+ reactContext.addLifecycleEventListener(this);
41
+ }
42
+
43
+ @Override
44
+ public void onHostResume() {
45
+ StallionSyncHandler.sync();
46
+ }
47
+
48
+ @Override
49
+ public void onHostPause() {}
50
+
51
+ @Override
52
+ public void onHostDestroy() {}
53
+
54
+ @Override
55
+ public void onCatalystInstanceDestroy() {
56
+ super.onCatalystInstanceDestroy();
57
+ this.currentReactContext.removeLifecycleEventListener(this);
46
58
  }
47
59
 
48
60
  @Override
49
61
  @NonNull
50
62
  public String getName() {
51
- return StallionConstants.MODULE_NAME;
63
+ return StallionConfigConstants.MODULE_NAME;
52
64
  }
53
65
 
54
66
  @ReactMethod
55
- public void setApiKey(String apiKey) {
56
- this.stallionStorage.set(StallionConstants.API_KEY_IDENTIFIER, apiKey);
67
+ public void onLaunch(String launchData) {
68
+ stallionStateManager.setIsMounted(true);
69
+
70
+ DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = this.currentReactContext.getJSModule(
71
+ DeviceEventManagerModule.RCTDeviceEventEmitter.class
72
+ );
73
+ StallionEventManager.getInstance().setEmitter(eventEmitter);
74
+
75
+ checkPendingDownloads();
76
+ }
77
+
78
+ private void checkPendingDownloads() {
79
+ String pendingReleaseUrl = stallionStateManager.getPendingReleaseUrl();
80
+ String pendingReleaseHash = stallionStateManager.getPendingReleaseHash();
81
+ if(!pendingReleaseUrl.isEmpty() && !pendingReleaseHash.isEmpty()) {
82
+ StallionSyncHandler.downloadNewRelease(pendingReleaseHash, pendingReleaseUrl);
83
+ stallionStateManager.setPendingRelease("", "");
84
+ }
57
85
  }
58
86
 
59
87
  @ReactMethod
60
- public void getApiKey(Callback callback) {
61
- callback.invoke(
62
- this.stallionStorage.get(StallionConstants.API_KEY_IDENTIFIER)
63
- );
88
+ public void getStallionConfig(Promise promise) {
89
+ try {
90
+ String stallionConfigJsonString = stallionStateManager.getStallionConfig().toJSON().toString();
91
+ promise.resolve(stallionConfigJsonString);
92
+ } catch (Exception e) {
93
+ promise.reject("getStallionConfig error:", e.toString());
94
+ }
64
95
  }
65
96
 
66
97
  @ReactMethod
67
- public void getStallionMeta(Callback callback) {
68
- WritableMap bundleMeta = Arguments.createMap();
69
- String activeBucket = this.stallionStorage.get(StallionConstants.ACTIVE_BUCKET_IDENTIFIER);
70
- String switchState = this.stallionStorage.get(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER);
71
- int activeVersion = this.stallionStorage.getInt(StallionConstants.ACTIVE_VERSION_IDENTIFIER);
72
-
73
- bundleMeta.putString(StallionConstants.ACTIVE_BUCKET_IDENTIFIER, activeBucket);
74
- bundleMeta.putBoolean(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER,
75
- switchState == null ? false : switchState.equals(StallionConstants.STALLION_SWITCH_ON)
76
- );
77
- bundleMeta.putString(StallionConstants.ACTIVE_VERSION_IDENTIFIER, String.valueOf(activeVersion));
78
- callback.invoke(bundleMeta);
98
+ public void getStallionMeta(Promise promise) {
99
+ try {
100
+ String stallionMetaJsonString = stallionStateManager.stallionMeta.toJSON().toString();
101
+ promise.resolve(stallionMetaJsonString);
102
+ } catch (Exception e) {
103
+ promise.reject("getStallionMeta error:", e.toString());
104
+ }
79
105
  }
80
106
 
81
107
  @ReactMethod
82
- public void toggleStallionSwitch(Boolean stallionBundleIsOn) {
83
- this.stallionStorage.set(StallionConstants.STALLION_SWITCH_STATE_IDENTIFIER, stallionBundleIsOn ? StallionConstants.STALLION_SWITCH_ON : StallionConstants.STALLION_SWITCH_OFF);
108
+ public void toggleStallionSwitch(String switchState, Promise promise) {
109
+ try {
110
+ stallionStateManager.stallionMeta.setSwitchState(StallionMetaConstants.SwitchState.fromString(switchState));
111
+ stallionStateManager.syncStallionMeta();
112
+ promise.resolve("Success");
113
+ } catch (Exception e) {
114
+ promise.reject("toggleStallionSwitch error:", e.toString());
115
+ }
84
116
  }
85
117
 
86
- private DeviceEventManagerModule.RCTDeviceEventEmitter getEventEmitter() {
87
- if(this.eventEmitter == null) {
88
- this.eventEmitter = this.currentReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class);
118
+ @ReactMethod
119
+ public void updateSdkToken(String newSdkToken, Promise promise) {
120
+ try {
121
+ stallionStateManager.getStallionConfig().updateSdkToken(newSdkToken);
122
+ promise.resolve("updateSdkToken success");
123
+ } catch (Exception e) {
124
+ promise.reject("updateSdkToken error:", e.toString());
89
125
  }
90
- return this.eventEmitter;
91
126
  }
92
127
 
93
128
  @ReactMethod
94
- public void downloadPackage(ReadableMap bundleInfo, Promise promise) {
95
- String receivedBucketId = bundleInfo.getString("bucketId");
96
- String receivedDownloadUrl = bundleInfo.getString("url");
97
- Integer receivedVersion = bundleInfo.getInt("version");
98
-
99
- ExecutorService executor = Executors.newSingleThreadExecutor();
100
-
101
- executor.execute(() -> {
102
- DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = getEventEmitter();
103
-
104
- FileOutputStream fout = null;
105
- BufferedOutputStream bout = null;
106
- BufferedInputStream inputStream = null;
107
- HttpURLConnection connection = null;
108
- File downloadedZip = null;
109
- boolean isZip = false;
110
-
111
- try {
112
- int DOWNLOAD_BUFFER_SIZE = StallionConstants.DOWNLOAD_BUFFER_SIZE;
113
- URL url = new URL(receivedDownloadUrl);
114
- connection = (HttpURLConnection) url.openConnection();
115
- connection.setRequestMethod( "GET" );
116
- connection.setRequestProperty("x-sdk-access-token", stallionStorage.get(StallionConstants.API_KEY_IDENTIFIER));
117
- connection.setRequestProperty("Content-Type", "application/json");
118
-
119
- connection.setDoInput(true);
120
-
121
- connection.connect();
122
- inputStream = new BufferedInputStream(connection.getInputStream());
123
- File downloadFolder = new File(baseDir + StallionConstants.DOWNLOAD_FOLDER_DIR);
124
- downloadFolder.getParentFile().mkdirs();
125
-
126
- downloadedZip = new File(downloadFolder, StallionConstants.ZIP_FILE_NAME);
127
- downloadedZip.getParentFile().mkdirs();
128
-
129
- fout = new FileOutputStream(downloadedZip, false);
130
- bout = new BufferedOutputStream(fout, DOWNLOAD_BUFFER_SIZE);
131
- byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
132
- byte[] header = new byte[4];
133
-
134
- long totalBytes = connection.getContentLength();
135
- long receivedBytes = 0;
136
- int numBytesRead;
137
- double prevDownloadFraction = 0;
138
- double progressEventThreshold = 0.1;
139
- while ((numBytesRead = inputStream.read(data, 0, DOWNLOAD_BUFFER_SIZE)) >= 0) {
140
- if (receivedBytes < 4) {
141
- for (int i = 0; i < numBytesRead; i++) {
142
- int headerOffset = (int) (receivedBytes) + i;
143
- if (headerOffset >= 4) {
144
- break;
145
- }
146
- header[headerOffset] = data[i];
147
- }
148
- }
149
-
150
- receivedBytes += numBytesRead;
151
- bout.write(data, 0, numBytesRead);
152
- double currentDownloadFraction = (double) receivedBytes / (double) totalBytes;
153
- if(currentDownloadFraction - prevDownloadFraction > progressEventThreshold) {
154
- prevDownloadFraction = currentDownloadFraction;
155
- getReactApplicationContext().runOnUiQueueThread(() -> getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(StallionConstants.DOWNLOAD_PROGRESS_EVENT, currentDownloadFraction));
156
- }
157
- }
158
-
159
- isZip = ByteBuffer.wrap(header).getInt() == 0x504b0304;
160
- Log.d("", String.valueOf(isZip));
161
-
162
- } catch (Exception e) {
163
- promise.reject(StallionConstants.DOWNLOAD_ERROR_PREFIX, StallionConstants.DOWNLOAD_API_ERROR_MESSAGE);
164
- } finally {
165
- try {
166
- if (bout != null) bout.close();
167
- if (fout != null) fout.close();
168
- if (inputStream != null) inputStream.close();
169
- if (connection != null) connection.disconnect();
170
- } catch (IOException e) {
171
- promise.reject(StallionConstants.DOWNLOAD_ERROR_PREFIX, StallionConstants.DOWNLOAD_API_ERROR_MESSAGE);
172
- }
173
- }
129
+ public void sync() {
130
+ StallionSyncHandler.sync();
131
+ }
174
132
 
175
- if (!isZip) {
176
- promise.reject(StallionConstants.DOWNLOAD_ERROR_PREFIX, "Not a zip file");
177
- return;
178
- }
133
+ @ReactMethod
134
+ public void downloadStageBundle(ReadableMap bundleInfo, Promise promise) {
135
+ StallionStageManager.downloadStageBundle(bundleInfo, promise);
136
+ }
179
137
 
180
- try {
181
- int currentActiveSlot = stallionStorage.getInt(StallionConstants.ACTIVE_SLOT_IDENTIFIER);
182
- int targetSlot;
183
- if(currentActiveSlot == 1) {
184
- targetSlot = 2;
185
- } else if(currentActiveSlot == 2) {
186
- targetSlot = 1;
187
- } else {
188
- targetSlot = 1;
189
- }
190
- StallionZip.unzipFile(downloadedZip.getAbsolutePath(), baseDir + StallionConstants.BUNDLE_DEST_FOLDER_DIR + StallionConstants.SLOT_FOLDER_DIR + targetSlot);
191
- // setting active bucket ID, slot and version after downloading and all other jobs done
192
- stallionStorage.setInt(StallionConstants.ACTIVE_SLOT_IDENTIFIER, targetSlot);
193
- stallionStorage.set(StallionConstants.ACTIVE_BUCKET_IDENTIFIER, receivedBucketId);
194
- if (receivedVersion != null) {
195
- stallionStorage.setInt(StallionConstants.ACTIVE_VERSION_IDENTIFIER, receivedVersion);
196
- }
197
- promise.resolve(StallionConstants.DOWNLOAD_SUCCESS_MESSAGE);
198
- getReactApplicationContext().runOnUiQueueThread(() -> getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(StallionConstants.DOWNLOAD_PROGRESS_EVENT, 1));
199
- } catch (Exception e) {
200
- promise.reject(StallionConstants.DOWNLOAD_ERROR_PREFIX, StallionConstants.DOWNLOAD_FILESYSTEM_ERROR_MESSAGE);
201
- } finally {
202
- try {
203
- StallionZip.deleteFileOrFolderSilently(downloadedZip);
204
- } catch (Exception e) {
205
- promise.reject(StallionConstants.DOWNLOAD_ERROR_PREFIX, StallionConstants.DOWNLOAD_DELETE_ERROR);
206
- }
207
- return;
138
+ @ReactMethod
139
+ public void popEvents(Promise promise) {
140
+ try {
141
+ promise.resolve(StallionEventManager.getInstance().popEvents());
142
+ } catch (Exception e) {
143
+ promise.reject("popEvents error: ", e.toString());
144
+ }
145
+ }
146
+
147
+ @ReactMethod
148
+ public void acknowledgeEvents(String eventIdsJson, Promise promise) {
149
+ try {
150
+ // Parse the stringified JSON array into a Java List
151
+ JSONArray jsonArray = new JSONArray(eventIdsJson);
152
+ List<String> eventIds = new ArrayList<>();
153
+
154
+ for (int i = 0; i < jsonArray.length(); i++) {
155
+ eventIds.add(jsonArray.getString(i));
208
156
  }
209
- });
157
+
158
+ // Use StallionEventManager to acknowledge the events
159
+ StallionEventManager eventManager = StallionEventManager.getInstance();
160
+ eventManager.acknowledgeEvents(eventIds);
161
+
162
+ // Resolve the promise indicating success
163
+ promise.resolve("Events acknowledged successfully.");
164
+ } catch (JSONException e) {
165
+ // Reject the promise if JSON parsing fails
166
+ promise.reject("ACKNOWLEDGE_EVENTS_JSON_ERROR", "Invalid JSON format for event IDs: " + e.getMessage(), e);
167
+ } catch (Exception e) {
168
+ // Reject the promise for other errors
169
+ promise.reject("ACKNOWLEDGE_EVENTS_ERROR", "Failed to acknowledge events: " + e.getMessage(), e);
170
+ }
210
171
  }
211
172
  }
@@ -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
+ }