react-native-update 10.59.2 → 10.61.0

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 (877) hide show
  1. package/README-CN.md +13 -7
  2. package/README.md +15 -6
  3. package/android/build.gradle +25 -33
  4. package/android/jni/Android.mk +18 -24
  5. package/android/jni/Application.mk +3 -1
  6. package/android/lib/arm64-v8a/librnpushy.so +0 -0
  7. package/android/lib/armeabi-v7a/librnpushy.so +0 -0
  8. package/android/lib/x86/librnpushy.so +0 -0
  9. package/android/lib/x86_64/librnpushy.so +0 -0
  10. package/android/proguard.pro +9 -7
  11. package/android/src/main/java/cn/reactnative/modules/update/ApkInstaller.java +3 -8
  12. package/android/src/main/java/cn/reactnative/modules/update/ArchiveLimits.java +24 -6
  13. package/android/src/main/java/cn/reactnative/modules/update/BundlePreparationResult.java +2 -0
  14. package/android/src/main/java/cn/reactnative/modules/update/BundledResourceCopier.java +50 -51
  15. package/android/src/main/java/cn/reactnative/modules/update/CleanupKeepNames.java +12 -13
  16. package/android/src/main/java/cn/reactnative/modules/update/CopyGroupResult.java +3 -0
  17. package/android/src/main/java/cn/reactnative/modules/update/CrashHold.java +22 -30
  18. package/android/src/main/java/cn/reactnative/modules/update/DownloadTask.java +284 -452
  19. package/android/src/main/java/cn/reactnative/modules/update/DownloadTaskParams.java +8 -4
  20. package/android/src/main/java/cn/reactnative/modules/update/ErrorCodes.java +32 -3
  21. package/android/src/main/java/cn/reactnative/modules/update/FileOperationException.java +1 -1
  22. package/android/src/main/java/cn/reactnative/modules/update/FlowBridge.java +39 -8
  23. package/android/src/main/java/cn/reactnative/modules/update/HttpClients.java +63 -0
  24. package/android/src/main/java/cn/reactnative/modules/update/HttpUtils.java +0 -45
  25. package/android/src/main/java/cn/reactnative/modules/update/InstallRecord.java +68 -116
  26. package/android/src/main/java/cn/reactnative/modules/update/NativeCore.java +10 -2
  27. package/android/src/main/java/cn/reactnative/modules/update/PatchFailedException.java +1 -1
  28. package/android/src/main/java/cn/reactnative/modules/update/PushyRuntime.java +53 -62
  29. package/android/src/main/java/cn/reactnative/modules/update/ReactReloadManager.java +9 -24
  30. package/android/src/main/java/cn/reactnative/modules/update/ResumePlan.java +31 -0
  31. package/android/src/main/java/cn/reactnative/modules/update/SafeZipFile.java +42 -80
  32. package/android/src/main/java/cn/reactnative/modules/update/StateSerialRunner.java +22 -39
  33. package/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java +474 -500
  34. package/android/src/main/java/cn/reactnative/modules/update/Texts.java +15 -1
  35. package/android/src/main/java/cn/reactnative/modules/update/Threads.java +44 -0
  36. package/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java +265 -188
  37. package/android/src/main/java/cn/reactnative/modules/update/UpdateEventEmitter.java +1 -1
  38. package/android/src/main/java/cn/reactnative/modules/update/UpdateFileUtils.java +75 -17
  39. package/android/src/main/java/cn/reactnative/modules/update/{UpdateModuleImpl.java → UpdateModule.java} +114 -96
  40. package/android/src/main/java/cn/reactnative/modules/update/UpdatePackage.java +16 -19
  41. package/android/src/main/java/cn/reactnative/modules/update/VersionScopedKeys.java +64 -0
  42. package/android/src/oldarch/cn/reactnative/modules/update/NativePushySpec.java +71 -0
  43. package/cpp/android_jni/archive_limits_jni.cpp +83 -0
  44. package/cpp/android_jni/install_record_jni.cpp +89 -0
  45. package/cpp/android_jni/jni_log.h +30 -0
  46. package/cpp/android_jni/jni_natives.h +46 -0
  47. package/cpp/android_jni/jni_registration.cpp +146 -0
  48. package/cpp/android_jni/jni_util.h +160 -0
  49. package/cpp/android_jni/resume_plan_jni.cpp +58 -0
  50. package/cpp/android_jni/update_core_android.cpp +448 -0
  51. package/cpp/android_jni/update_flow_jni.cpp +150 -0
  52. package/{android/jni → cpp/hpatch}/hpatch.c +5 -5
  53. package/{android/jni → cpp/hpatch}/hpatch.h +4 -1
  54. package/cpp/patch_core/archive_limits.cpp +194 -0
  55. package/cpp/patch_core/archive_limits.h +101 -10
  56. package/cpp/patch_core/archive_patch_core.cpp +98 -15
  57. package/cpp/patch_core/archive_patch_core.h +51 -0
  58. package/cpp/patch_core/digest.h +5 -4
  59. package/cpp/patch_core/error_codes.h +15 -11
  60. package/cpp/patch_core/install_record.cpp +430 -0
  61. package/cpp/patch_core/install_record.h +165 -9
  62. package/cpp/patch_core/native_texts.h +102 -0
  63. package/cpp/patch_core/patch_core.cpp +62 -16
  64. package/cpp/patch_core/patch_core.h +27 -7
  65. package/cpp/patch_core/patch_manifest.cpp +201 -0
  66. package/cpp/patch_core/patch_manifest.h +74 -0
  67. package/cpp/patch_core/resume_plan.cpp +226 -0
  68. package/cpp/patch_core/resume_plan.h +88 -0
  69. package/cpp/patch_core/state_ops.h +5 -3
  70. package/cpp/update_flow_core/flow_json.cpp +82 -8
  71. package/cpp/update_flow_core/flow_json.h +21 -0
  72. package/cpp/update_flow_core/native_config.cpp +436 -0
  73. package/cpp/update_flow_core/native_config.h +84 -0
  74. package/cpp/update_flow_core/native_round.cpp +321 -0
  75. package/cpp/update_flow_core/native_round.h +94 -0
  76. package/cpp/update_flow_core/round_engine.cpp +456 -0
  77. package/cpp/update_flow_core/round_engine.h +106 -0
  78. package/cpp/update_flow_core/update_flow_core.cpp +5 -14
  79. package/cpp/update_flow_core/update_flow_core.h +2 -2
  80. package/harmony/hvigor-plugin.ts +11 -19
  81. package/harmony/pushy/src/main/cpp/CMakeLists.txt +19 -26
  82. package/harmony/pushy/src/main/cpp/PushyPackage.h +2 -2
  83. package/harmony/pushy/src/main/cpp/PushyTurboModule.cpp +57 -94
  84. package/harmony/pushy/src/main/cpp/pushy.cpp +817 -518
  85. package/harmony/pushy/src/main/ets/ArchiveLimits.ts +55 -75
  86. package/harmony/pushy/src/main/ets/DownloadTask.ts +279 -539
  87. package/harmony/pushy/src/main/ets/DownloadTaskParams.ts +6 -6
  88. package/harmony/pushy/src/main/ets/ErrorCodes.ts +3 -15
  89. package/harmony/pushy/src/main/ets/EventHub.ts +1 -1
  90. package/harmony/pushy/src/main/ets/InstallRecord.ts +54 -151
  91. package/harmony/pushy/src/main/ets/Logger.ts +20 -34
  92. package/harmony/pushy/src/main/ets/NativePatchCore.ts +150 -41
  93. package/harmony/pushy/src/main/ets/PushyConfiguration.ts +8 -85
  94. package/harmony/pushy/src/main/ets/PushyFileJSBundleProvider.ets +8 -3
  95. package/harmony/pushy/src/main/ets/PushyTurboModule.ts +11 -25
  96. package/harmony/pushy/src/main/ets/SaveFile.ts +99 -18
  97. package/harmony/pushy/src/main/ets/SyncCoordinator.ts +291 -543
  98. package/harmony/pushy/src/main/ets/Texts.ts +8 -7
  99. package/harmony/pushy/src/main/ets/UpdateContext.ts +245 -152
  100. package/harmony/pushy.har +0 -0
  101. package/ios/RCTPushy/RCTPushy+Launch.mm +190 -0
  102. package/ios/RCTPushy/RCTPushy.h +12 -0
  103. package/ios/RCTPushy/RCTPushy.mm +135 -2666
  104. package/ios/RCTPushy/RCTPushyCommon.h +28 -0
  105. package/ios/RCTPushy/RCTPushyConfiguration.h +0 -8
  106. package/ios/RCTPushy/RCTPushyConfiguration.mm +40 -123
  107. package/ios/RCTPushy/RCTPushyDownloader.mm +152 -198
  108. package/ios/RCTPushy/RCTPushyInstallRecord.mm +101 -0
  109. package/ios/RCTPushy/RCTPushyInstaller.mm +732 -0
  110. package/ios/RCTPushy/RCTPushyInternal.h +185 -0
  111. package/ios/RCTPushy/RCTPushyOrchestrator.mm +969 -0
  112. package/ios/RCTPushy/RCTPushyState.mm +382 -0
  113. package/package.json +46 -25
  114. package/react-native-update.podspec +73 -82
  115. package/src/client.ts +126 -1633
  116. package/src/clientActivation.ts +324 -0
  117. package/src/clientCheck.ts +405 -0
  118. package/src/clientDownload.ts +448 -0
  119. package/src/clientNativeConfig.ts +171 -0
  120. package/src/clientReporter.ts +398 -0
  121. package/src/clientState.ts +51 -0
  122. package/src/context.ts +1 -1
  123. package/src/core.ts +39 -10
  124. package/src/endpoint.ts +22 -8
  125. package/src/error.ts +18 -35
  126. package/src/i18n.ts +18 -83
  127. package/src/locales/en.ts +1 -5
  128. package/src/locales/zh.ts +1 -5
  129. package/src/provider.tsx +86 -67
  130. package/src/telemetry.ts +0 -13
  131. package/src/type.ts +0 -15
  132. package/src/updateFlowCore.ts +116 -10
  133. package/src/utils.ts +49 -42
  134. package/android/jni/HDiffPatch/.travis.yml +0 -33
  135. package/android/jni/HDiffPatch/CHANGELOG.md +0 -153
  136. package/android/jni/HDiffPatch/Makefile +0 -157
  137. package/android/jni/HDiffPatch/_atosize.h +0 -83
  138. package/android/jni/HDiffPatch/_clock_for_demo.h +0 -47
  139. package/android/jni/HDiffPatch/_dir_ignore.h +0 -191
  140. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/Android.mk +0 -37
  141. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/Application.mk +0 -7
  142. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/build_libs.bat +0 -1
  143. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/build_libs.sh +0 -1
  144. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/hpatch.c +0 -18
  145. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/hpatch.h +0 -20
  146. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/hpatch_jni.c +0 -28
  147. package/android/jni/HDiffPatch/builds/android_ndk_jni_mk/java/com/github/sisong/HPatch.java +0 -8
  148. package/android/jni/HDiffPatch/builds/codeblocks/HDiffPatch.workspace +0 -8
  149. package/android/jni/HDiffPatch/builds/codeblocks/HDiffZ.cbp +0 -219
  150. package/android/jni/HDiffPatch/builds/codeblocks/HPatchZ.cbp +0 -156
  151. package/android/jni/HDiffPatch/builds/codeblocks/unitTest.cbp +0 -65
  152. package/android/jni/HDiffPatch/builds/vc/HDiffPatch.sln +0 -105
  153. package/android/jni/HDiffPatch/builds/vc/HDiffZ.vcxproj +0 -237
  154. package/android/jni/HDiffPatch/builds/vc/HDiffZ.vcxproj.user +0 -3
  155. package/android/jni/HDiffPatch/builds/vc/HPatchZ.vcxproj +0 -318
  156. package/android/jni/HDiffPatch/builds/vc/HPatchZ.vcxproj.user +0 -3
  157. package/android/jni/HDiffPatch/builds/vc/unitTest.vcxproj +0 -182
  158. package/android/jni/HDiffPatch/builds/vc/unitTest.vcxproj.user +0 -3
  159. package/android/jni/HDiffPatch/builds/xcode/HDiffPatch.xcworkspace/contents.xcworkspacedata +0 -30
  160. package/android/jni/HDiffPatch/builds/xcode/HDiffPatch.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  161. package/android/jni/HDiffPatch/builds/xcode/bestParams.xcodeproj/project.pbxproj +0 -408
  162. package/android/jni/HDiffPatch/builds/xcode/bestParams.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  163. package/android/jni/HDiffPatch/builds/xcode/hdiffz.xcodeproj/project.pbxproj +0 -573
  164. package/android/jni/HDiffPatch/builds/xcode/hdiffz.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  165. package/android/jni/HDiffPatch/builds/xcode/hdiffz.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  166. package/android/jni/HDiffPatch/builds/xcode/hpatchz.xcodeproj/project.pbxproj +0 -396
  167. package/android/jni/HDiffPatch/builds/xcode/hpatchz.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  168. package/android/jni/HDiffPatch/builds/xcode/lz4.xcodeproj/project.pbxproj +0 -268
  169. package/android/jni/HDiffPatch/builds/xcode/lz4.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  170. package/android/jni/HDiffPatch/builds/xcode/lzma.xcodeproj/project.pbxproj +0 -361
  171. package/android/jni/HDiffPatch/builds/xcode/lzma.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  172. package/android/jni/HDiffPatch/builds/xcode/testHashClash.xcodeproj/project.pbxproj +0 -301
  173. package/android/jni/HDiffPatch/builds/xcode/testHashClash.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  174. package/android/jni/HDiffPatch/builds/xcode/testHashClash.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  175. package/android/jni/HDiffPatch/builds/xcode/unitTest.xcodeproj/project.pbxproj +0 -411
  176. package/android/jni/HDiffPatch/builds/xcode/unitTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  177. package/android/jni/HDiffPatch/builds/xcode/zstd.xcodeproj/project.pbxproj +0 -504
  178. package/android/jni/HDiffPatch/builds/xcode/zstd.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  179. package/android/jni/HDiffPatch/checksum_plugin_demo.h +0 -344
  180. package/android/jni/HDiffPatch/compress_parallel.cpp +0 -166
  181. package/android/jni/HDiffPatch/compress_parallel.h +0 -59
  182. package/android/jni/HDiffPatch/compress_plugin_demo.h +0 -1152
  183. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/dir_diff.cpp +0 -797
  184. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/dir_diff.h +0 -65
  185. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/dir_diff_tools.cpp +0 -200
  186. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/dir_diff_tools.h +0 -178
  187. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/dir_manifest.cpp +0 -357
  188. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/dir_manifest.h +0 -87
  189. package/android/jni/HDiffPatch/dirDiffPatch/dir_diff/file_for_dirDiff.h +0 -151
  190. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/dir_patch.c +0 -770
  191. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/dir_patch.h +0 -236
  192. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/dir_patch_private.h +0 -47
  193. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/dir_patch_tools.c +0 -112
  194. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/dir_patch_tools.h +0 -53
  195. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/new_dir_output.c +0 -331
  196. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/new_dir_output.h +0 -144
  197. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/new_stream.c +0 -176
  198. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/new_stream.h +0 -84
  199. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/ref_stream.c +0 -146
  200. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/ref_stream.h +0 -61
  201. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/res_handle_limit.c +0 -152
  202. package/android/jni/HDiffPatch/dirDiffPatch/dir_patch/res_handle_limit.h +0 -76
  203. package/android/jni/HDiffPatch/hdiffz.cpp +0 -1570
  204. package/android/jni/HDiffPatch/hpatch_dir_listener.h +0 -290
  205. package/android/jni/HDiffPatch/hpatchz.c +0 -1221
  206. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/diff.cpp +0 -1025
  207. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/diff.h +0 -116
  208. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/diff_types.h +0 -72
  209. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/bytes_rle.cpp +0 -213
  210. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/bytes_rle.h +0 -63
  211. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/compress_detect.cpp +0 -170
  212. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/compress_detect.h +0 -86
  213. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/config.h +0 -89
  214. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort.c +0 -13
  215. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort.c.inc.h +0 -398
  216. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort.h +0 -194
  217. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort64.c +0 -13
  218. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort64.h +0 -204
  219. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort_private.h +0 -207
  220. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/sssort.c.inc.h +0 -815
  221. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/trsort.c.inc.h +0 -586
  222. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/utils.c.inc.h +0 -381
  223. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/adler_roll.c +0 -352
  224. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/adler_roll.h +0 -137
  225. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/bloom_filter.h +0 -137
  226. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/covers.h +0 -70
  227. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/digest_matcher.cpp +0 -628
  228. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/digest_matcher.h +0 -87
  229. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/stream_serialize.cpp +0 -363
  230. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/limit_mem_diff/stream_serialize.h +0 -139
  231. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/mem_buf.h +0 -68
  232. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/pack_uint.h +0 -115
  233. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/suffix_string.cpp +0 -342
  234. package/android/jni/HDiffPatch/libHDiffPatch/HDiff/private_diff/suffix_string.h +0 -94
  235. package/android/jni/HDiffPatch/libHDiffPatch/HPatch/checksum_plugin.h +0 -52
  236. package/android/jni/HDiffPatch/libParallel/parallel_channel.cpp +0 -174
  237. package/android/jni/HDiffPatch/libParallel/parallel_channel.h +0 -73
  238. package/android/jni/HDiffPatch/libParallel/parallel_import.cpp +0 -367
  239. package/android/jni/HDiffPatch/libParallel/parallel_import.h +0 -92
  240. package/android/jni/lzma/Asm/arm/7zCrcOpt.asm +0 -100
  241. package/android/jni/lzma/Asm/x86/7zAsm.asm +0 -147
  242. package/android/jni/lzma/Asm/x86/7zCrcOpt.asm +0 -147
  243. package/android/jni/lzma/Asm/x86/AesOpt.asm +0 -237
  244. package/android/jni/lzma/Asm/x86/LzmaDecOpt.asm +0 -1258
  245. package/android/jni/lzma/Asm/x86/XzCrc64Opt.asm +0 -205
  246. package/android/jni/lzma/C/7z.h +0 -202
  247. package/android/jni/lzma/C/7zAlloc.c +0 -80
  248. package/android/jni/lzma/C/7zAlloc.h +0 -19
  249. package/android/jni/lzma/C/7zArcIn.c +0 -1771
  250. package/android/jni/lzma/C/7zBuf.c +0 -36
  251. package/android/jni/lzma/C/7zBuf.h +0 -35
  252. package/android/jni/lzma/C/7zBuf2.c +0 -52
  253. package/android/jni/lzma/C/7zCrc.c +0 -128
  254. package/android/jni/lzma/C/7zCrc.h +0 -25
  255. package/android/jni/lzma/C/7zCrcOpt.c +0 -115
  256. package/android/jni/lzma/C/7zDec.c +0 -591
  257. package/android/jni/lzma/C/7zFile.c +0 -286
  258. package/android/jni/lzma/C/7zFile.h +0 -83
  259. package/android/jni/lzma/C/7zStream.c +0 -176
  260. package/android/jni/lzma/C/7zVersion.h +0 -27
  261. package/android/jni/lzma/C/7zVersion.rc +0 -55
  262. package/android/jni/lzma/C/Aes.c +0 -306
  263. package/android/jni/lzma/C/Aes.h +0 -38
  264. package/android/jni/lzma/C/AesOpt.c +0 -184
  265. package/android/jni/lzma/C/Alloc.c +0 -455
  266. package/android/jni/lzma/C/Alloc.h +0 -51
  267. package/android/jni/lzma/C/Bcj2.c +0 -257
  268. package/android/jni/lzma/C/Bcj2.h +0 -146
  269. package/android/jni/lzma/C/Bcj2Enc.c +0 -311
  270. package/android/jni/lzma/C/Bra.c +0 -230
  271. package/android/jni/lzma/C/Bra.h +0 -64
  272. package/android/jni/lzma/C/Bra86.c +0 -82
  273. package/android/jni/lzma/C/BraIA64.c +0 -53
  274. package/android/jni/lzma/C/CpuArch.c +0 -218
  275. package/android/jni/lzma/C/CpuArch.h +0 -336
  276. package/android/jni/lzma/C/Delta.c +0 -64
  277. package/android/jni/lzma/C/Delta.h +0 -19
  278. package/android/jni/lzma/C/DllSecur.c +0 -108
  279. package/android/jni/lzma/C/DllSecur.h +0 -20
  280. package/android/jni/lzma/C/LzFind.c +0 -1127
  281. package/android/jni/lzma/C/LzFind.h +0 -121
  282. package/android/jni/lzma/C/LzFindMt.c +0 -853
  283. package/android/jni/lzma/C/LzFindMt.h +0 -101
  284. package/android/jni/lzma/C/LzHash.h +0 -57
  285. package/android/jni/lzma/C/Lzma2DecMt.c +0 -1082
  286. package/android/jni/lzma/C/Lzma2DecMt.h +0 -79
  287. package/android/jni/lzma/C/Lzma2Enc.c +0 -803
  288. package/android/jni/lzma/C/Lzma2Enc.h +0 -55
  289. package/android/jni/lzma/C/Lzma86.h +0 -111
  290. package/android/jni/lzma/C/Lzma86Dec.c +0 -54
  291. package/android/jni/lzma/C/Lzma86Enc.c +0 -106
  292. package/android/jni/lzma/C/LzmaEnc.c +0 -2976
  293. package/android/jni/lzma/C/LzmaEnc.h +0 -76
  294. package/android/jni/lzma/C/LzmaLib.c +0 -40
  295. package/android/jni/lzma/C/LzmaLib.h +0 -131
  296. package/android/jni/lzma/C/MtCoder.c +0 -601
  297. package/android/jni/lzma/C/MtCoder.h +0 -141
  298. package/android/jni/lzma/C/MtDec.c +0 -1138
  299. package/android/jni/lzma/C/MtDec.h +0 -201
  300. package/android/jni/lzma/C/Ppmd.h +0 -85
  301. package/android/jni/lzma/C/Ppmd7.c +0 -712
  302. package/android/jni/lzma/C/Ppmd7.h +0 -142
  303. package/android/jni/lzma/C/Ppmd7Dec.c +0 -191
  304. package/android/jni/lzma/C/Ppmd7Enc.c +0 -187
  305. package/android/jni/lzma/C/RotateDefs.h +0 -30
  306. package/android/jni/lzma/C/Sha256.c +0 -248
  307. package/android/jni/lzma/C/Sha256.h +0 -26
  308. package/android/jni/lzma/C/Sort.c +0 -141
  309. package/android/jni/lzma/C/Sort.h +0 -18
  310. package/android/jni/lzma/C/Threads.c +0 -95
  311. package/android/jni/lzma/C/Threads.h +0 -70
  312. package/android/jni/lzma/C/ThreadsP.c +0 -396
  313. package/android/jni/lzma/C/ThreadsP.h +0 -31
  314. package/android/jni/lzma/C/Util/7z/7z.dsp +0 -241
  315. package/android/jni/lzma/C/Util/7z/7z.dsw +0 -29
  316. package/android/jni/lzma/C/Util/7z/7zMain.c +0 -686
  317. package/android/jni/lzma/C/Util/7z/Precomp.c +0 -4
  318. package/android/jni/lzma/C/Util/7z/Precomp.h +0 -10
  319. package/android/jni/lzma/C/Util/7z/makefile +0 -40
  320. package/android/jni/lzma/C/Util/7z/makefile.gcc +0 -75
  321. package/android/jni/lzma/C/Util/Lzma/LzmaUtil.c +0 -258
  322. package/android/jni/lzma/C/Util/Lzma/LzmaUtil.dsp +0 -168
  323. package/android/jni/lzma/C/Util/Lzma/LzmaUtil.dsw +0 -29
  324. package/android/jni/lzma/C/Util/Lzma/makefile +0 -28
  325. package/android/jni/lzma/C/Util/Lzma/makefile.gcc +0 -44
  326. package/android/jni/lzma/C/Util/LzmaLib/LzmaLib.def +0 -4
  327. package/android/jni/lzma/C/Util/LzmaLib/LzmaLib.dsp +0 -178
  328. package/android/jni/lzma/C/Util/LzmaLib/LzmaLib.dsw +0 -29
  329. package/android/jni/lzma/C/Util/LzmaLib/LzmaLibExports.c +0 -14
  330. package/android/jni/lzma/C/Util/LzmaLib/makefile +0 -34
  331. package/android/jni/lzma/C/Util/LzmaLib/resource.rc +0 -3
  332. package/android/jni/lzma/C/Util/SfxSetup/Precomp.c +0 -4
  333. package/android/jni/lzma/C/Util/SfxSetup/Precomp.h +0 -10
  334. package/android/jni/lzma/C/Util/SfxSetup/SfxSetup.c +0 -640
  335. package/android/jni/lzma/C/Util/SfxSetup/SfxSetup.dsp +0 -231
  336. package/android/jni/lzma/C/Util/SfxSetup/SfxSetup.dsw +0 -29
  337. package/android/jni/lzma/C/Util/SfxSetup/makefile +0 -37
  338. package/android/jni/lzma/C/Util/SfxSetup/makefile_con +0 -38
  339. package/android/jni/lzma/C/Util/SfxSetup/resource.rc +0 -5
  340. package/android/jni/lzma/C/Util/SfxSetup/setup.ico +0 -0
  341. package/android/jni/lzma/C/Xz.c +0 -90
  342. package/android/jni/lzma/C/Xz.h +0 -460
  343. package/android/jni/lzma/C/XzCrc64.c +0 -86
  344. package/android/jni/lzma/C/XzCrc64.h +0 -26
  345. package/android/jni/lzma/C/XzCrc64Opt.c +0 -69
  346. package/android/jni/lzma/C/XzDec.c +0 -2766
  347. package/android/jni/lzma/C/XzEnc.c +0 -1329
  348. package/android/jni/lzma/C/XzEnc.h +0 -60
  349. package/android/jni/lzma/C/XzIn.c +0 -319
  350. package/android/jni/lzma/CPP/7zip/7zip.mak +0 -240
  351. package/android/jni/lzma/CPP/7zip/Aes.mak +0 -7
  352. package/android/jni/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp +0 -3
  353. package/android/jni/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h +0 -76
  354. package/android/jni/lzma/CPP/7zip/Archive/7z/7zDecode.cpp +0 -569
  355. package/android/jni/lzma/CPP/7zip/Archive/7z/7zDecode.h +0 -70
  356. package/android/jni/lzma/CPP/7zip/Archive/7z/7zEncode.cpp +0 -678
  357. package/android/jni/lzma/CPP/7zip/Archive/7z/7zEncode.h +0 -92
  358. package/android/jni/lzma/CPP/7zip/Archive/7z/7zExtract.cpp +0 -423
  359. package/android/jni/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp +0 -139
  360. package/android/jni/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h +0 -61
  361. package/android/jni/lzma/CPP/7zip/Archive/7z/7zHandler.cpp +0 -763
  362. package/android/jni/lzma/CPP/7zip/Archive/7z/7zHandler.h +0 -181
  363. package/android/jni/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp +0 -942
  364. package/android/jni/lzma/CPP/7zip/Archive/7z/7zHeader.cpp +0 -19
  365. package/android/jni/lzma/CPP/7zip/Archive/7z/7zHeader.h +0 -148
  366. package/android/jni/lzma/CPP/7zip/Archive/7z/7zIn.cpp +0 -1666
  367. package/android/jni/lzma/CPP/7zip/Archive/7z/7zIn.h +0 -445
  368. package/android/jni/lzma/CPP/7zip/Archive/7z/7zItem.h +0 -202
  369. package/android/jni/lzma/CPP/7zip/Archive/7z/7zOut.cpp +0 -901
  370. package/android/jni/lzma/CPP/7zip/Archive/7z/7zOut.h +0 -335
  371. package/android/jni/lzma/CPP/7zip/Archive/7z/7zProperties.cpp +0 -174
  372. package/android/jni/lzma/CPP/7zip/Archive/7z/7zProperties.h +0 -22
  373. package/android/jni/lzma/CPP/7zip/Archive/7z/7zRegister.cpp +0 -21
  374. package/android/jni/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp +0 -22
  375. package/android/jni/lzma/CPP/7zip/Archive/7z/7zSpecStream.h +0 -35
  376. package/android/jni/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp +0 -2500
  377. package/android/jni/lzma/CPP/7zip/Archive/7z/7zUpdate.h +0 -139
  378. package/android/jni/lzma/CPP/7zip/Archive/7z/StdAfx.cpp +0 -3
  379. package/android/jni/lzma/CPP/7zip/Archive/7z/StdAfx.h +0 -8
  380. package/android/jni/lzma/CPP/7zip/Archive/Archive.def +0 -12
  381. package/android/jni/lzma/CPP/7zip/Archive/Archive2.def +0 -19
  382. package/android/jni/lzma/CPP/7zip/Archive/ArchiveExports.cpp +0 -151
  383. package/android/jni/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp +0 -1125
  384. package/android/jni/lzma/CPP/7zip/Archive/Common/CoderMixer2.h +0 -447
  385. package/android/jni/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp +0 -17
  386. package/android/jni/lzma/CPP/7zip/Archive/Common/DummyOutStream.h +0 -25
  387. package/android/jni/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp +0 -232
  388. package/android/jni/lzma/CPP/7zip/Archive/Common/HandlerOut.h +0 -110
  389. package/android/jni/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +0 -46
  390. package/android/jni/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h +0 -67
  391. package/android/jni/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp +0 -88
  392. package/android/jni/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h +0 -28
  393. package/android/jni/lzma/CPP/7zip/Archive/Common/MultiStream.cpp +0 -191
  394. package/android/jni/lzma/CPP/7zip/Archive/Common/MultiStream.h +0 -89
  395. package/android/jni/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp +0 -18
  396. package/android/jni/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h +0 -37
  397. package/android/jni/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp +0 -3
  398. package/android/jni/lzma/CPP/7zip/Archive/Common/ParseProperties.h +0 -6
  399. package/android/jni/lzma/CPP/7zip/Archive/Common/StdAfx.h +0 -8
  400. package/android/jni/lzma/CPP/7zip/Archive/DllExports2.cpp +0 -122
  401. package/android/jni/lzma/CPP/7zip/Archive/IArchive.h +0 -608
  402. package/android/jni/lzma/CPP/7zip/Archive/Icons/7z.ico +0 -0
  403. package/android/jni/lzma/CPP/7zip/Archive/LzmaHandler.cpp +0 -629
  404. package/android/jni/lzma/CPP/7zip/Archive/SplitHandler.cpp +0 -359
  405. package/android/jni/lzma/CPP/7zip/Archive/StdAfx.h +0 -8
  406. package/android/jni/lzma/CPP/7zip/Archive/XzHandler.cpp +0 -1308
  407. package/android/jni/lzma/CPP/7zip/Archive/XzHandler.h +0 -11
  408. package/android/jni/lzma/CPP/7zip/Asm.mak +0 -9
  409. package/android/jni/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsp +0 -1910
  410. package/android/jni/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsw +0 -29
  411. package/android/jni/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.cpp +0 -3
  412. package/android/jni/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.h +0 -8
  413. package/android/jni/lzma/CPP/7zip/Bundles/Alone7z/makefile +0 -154
  414. package/android/jni/lzma/CPP/7zip/Bundles/Alone7z/resource.rc +0 -7
  415. package/android/jni/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.cpp +0 -3
  416. package/android/jni/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.h +0 -8
  417. package/android/jni/lzma/CPP/7zip/Bundles/Format7zExtractR/makefile +0 -96
  418. package/android/jni/lzma/CPP/7zip/Bundles/Format7zExtractR/resource.rc +0 -5
  419. package/android/jni/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.cpp +0 -3
  420. package/android/jni/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.h +0 -8
  421. package/android/jni/lzma/CPP/7zip/Bundles/Format7zR/makefile +0 -116
  422. package/android/jni/lzma/CPP/7zip/Bundles/Format7zR/resource.rc +0 -5
  423. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/LzmaAlone.cpp +0 -799
  424. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/LzmaCon.dsp +0 -477
  425. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/LzmaCon.dsw +0 -29
  426. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/StdAfx.cpp +0 -3
  427. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/StdAfx.h +0 -8
  428. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/makefile +0 -59
  429. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/makefile.gcc +0 -195
  430. package/android/jni/lzma/CPP/7zip/Bundles/LzmaCon/resource.rc +0 -3
  431. package/android/jni/lzma/CPP/7zip/Bundles/LzmaSpec/LzmaSpec.cpp +0 -715
  432. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/7z.ico +0 -0
  433. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/SFXCon.dsp +0 -912
  434. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/SFXCon.dsw +0 -29
  435. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/SfxCon.cpp +0 -482
  436. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/StdAfx.cpp +0 -3
  437. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/StdAfx.h +0 -8
  438. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/makefile +0 -134
  439. package/android/jni/lzma/CPP/7zip/Bundles/SFXCon/resource.rc +0 -5
  440. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/ExtractCallbackSfx.cpp +0 -246
  441. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/ExtractCallbackSfx.h +0 -86
  442. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp +0 -137
  443. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/ExtractEngine.h +0 -11
  444. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp +0 -803
  445. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsw +0 -29
  446. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/SfxSetup.cpp +0 -364
  447. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/StdAfx.cpp +0 -3
  448. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/StdAfx.h +0 -13
  449. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/makefile +0 -117
  450. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/resource.h +0 -6
  451. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/resource.rc +0 -16
  452. package/android/jni/lzma/CPP/7zip/Bundles/SFXSetup/setup.ico +0 -0
  453. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/7z.ico +0 -0
  454. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/SFXWin.dsp +0 -988
  455. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/SFXWin.dsw +0 -29
  456. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/SfxWin.cpp +0 -241
  457. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/StdAfx.cpp +0 -3
  458. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/StdAfx.h +0 -14
  459. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/makefile +0 -153
  460. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/resource.h +0 -1
  461. package/android/jni/lzma/CPP/7zip/Bundles/SFXWin/resource.rc +0 -50
  462. package/android/jni/lzma/CPP/7zip/Common/CWrappers.cpp +0 -250
  463. package/android/jni/lzma/CPP/7zip/Common/CWrappers.h +0 -120
  464. package/android/jni/lzma/CPP/7zip/Common/CreateCoder.cpp +0 -536
  465. package/android/jni/lzma/CPP/7zip/Common/CreateCoder.h +0 -192
  466. package/android/jni/lzma/CPP/7zip/Common/FilePathAutoRename.cpp +0 -46
  467. package/android/jni/lzma/CPP/7zip/Common/FilePathAutoRename.h +0 -10
  468. package/android/jni/lzma/CPP/7zip/Common/FileStreams.cpp +0 -475
  469. package/android/jni/lzma/CPP/7zip/Common/FileStreams.h +0 -166
  470. package/android/jni/lzma/CPP/7zip/Common/FilterCoder.cpp +0 -435
  471. package/android/jni/lzma/CPP/7zip/Common/FilterCoder.h +0 -205
  472. package/android/jni/lzma/CPP/7zip/Common/InBuffer.cpp +0 -163
  473. package/android/jni/lzma/CPP/7zip/Common/InBuffer.h +0 -92
  474. package/android/jni/lzma/CPP/7zip/Common/InOutTempBuffer.cpp +0 -127
  475. package/android/jni/lzma/CPP/7zip/Common/InOutTempBuffer.h +0 -48
  476. package/android/jni/lzma/CPP/7zip/Common/LimitedStreams.cpp +0 -367
  477. package/android/jni/lzma/CPP/7zip/Common/LimitedStreams.h +0 -252
  478. package/android/jni/lzma/CPP/7zip/Common/LockedStream.cpp +0 -3
  479. package/android/jni/lzma/CPP/7zip/Common/LockedStream.h +0 -6
  480. package/android/jni/lzma/CPP/7zip/Common/MethodId.cpp +0 -3
  481. package/android/jni/lzma/CPP/7zip/Common/MethodId.h +0 -10
  482. package/android/jni/lzma/CPP/7zip/Common/MethodProps.cpp +0 -509
  483. package/android/jni/lzma/CPP/7zip/Common/MethodProps.h +0 -264
  484. package/android/jni/lzma/CPP/7zip/Common/OffsetStream.cpp +0 -39
  485. package/android/jni/lzma/CPP/7zip/Common/OffsetStream.h +0 -26
  486. package/android/jni/lzma/CPP/7zip/Common/OutBuffer.cpp +0 -111
  487. package/android/jni/lzma/CPP/7zip/Common/OutBuffer.h +0 -66
  488. package/android/jni/lzma/CPP/7zip/Common/ProgressUtils.cpp +0 -51
  489. package/android/jni/lzma/CPP/7zip/Common/ProgressUtils.h +0 -35
  490. package/android/jni/lzma/CPP/7zip/Common/PropId.cpp +0 -108
  491. package/android/jni/lzma/CPP/7zip/Common/RegisterArc.h +0 -78
  492. package/android/jni/lzma/CPP/7zip/Common/RegisterCodec.h +0 -106
  493. package/android/jni/lzma/CPP/7zip/Common/StdAfx.h +0 -8
  494. package/android/jni/lzma/CPP/7zip/Common/StreamBinder.cpp +0 -156
  495. package/android/jni/lzma/CPP/7zip/Common/StreamBinder.h +0 -60
  496. package/android/jni/lzma/CPP/7zip/Common/StreamObjects.cpp +0 -285
  497. package/android/jni/lzma/CPP/7zip/Common/StreamObjects.h +0 -157
  498. package/android/jni/lzma/CPP/7zip/Common/StreamUtils.cpp +0 -56
  499. package/android/jni/lzma/CPP/7zip/Common/StreamUtils.h +0 -13
  500. package/android/jni/lzma/CPP/7zip/Common/UniqBlocks.cpp +0 -57
  501. package/android/jni/lzma/CPP/7zip/Common/UniqBlocks.h +0 -26
  502. package/android/jni/lzma/CPP/7zip/Common/VirtThread.cpp +0 -48
  503. package/android/jni/lzma/CPP/7zip/Common/VirtThread.h +0 -24
  504. package/android/jni/lzma/CPP/7zip/Compress/Bcj2Coder.cpp +0 -666
  505. package/android/jni/lzma/CPP/7zip/Compress/Bcj2Coder.h +0 -120
  506. package/android/jni/lzma/CPP/7zip/Compress/Bcj2Register.cpp +0 -24
  507. package/android/jni/lzma/CPP/7zip/Compress/BcjCoder.cpp +0 -24
  508. package/android/jni/lzma/CPP/7zip/Compress/BcjCoder.h +0 -31
  509. package/android/jni/lzma/CPP/7zip/Compress/BcjRegister.cpp +0 -17
  510. package/android/jni/lzma/CPP/7zip/Compress/BranchMisc.cpp +0 -23
  511. package/android/jni/lzma/CPP/7zip/Compress/BranchMisc.h +0 -35
  512. package/android/jni/lzma/CPP/7zip/Compress/BranchRegister.cpp +0 -41
  513. package/android/jni/lzma/CPP/7zip/Compress/ByteSwap.cpp +0 -92
  514. package/android/jni/lzma/CPP/7zip/Compress/CodecExports.cpp +0 -344
  515. package/android/jni/lzma/CPP/7zip/Compress/CopyCoder.cpp +0 -120
  516. package/android/jni/lzma/CPP/7zip/Compress/CopyCoder.h +0 -49
  517. package/android/jni/lzma/CPP/7zip/Compress/CopyRegister.cpp +0 -15
  518. package/android/jni/lzma/CPP/7zip/Compress/DeltaFilter.cpp +0 -128
  519. package/android/jni/lzma/CPP/7zip/Compress/Lzma2Decoder.cpp +0 -265
  520. package/android/jni/lzma/CPP/7zip/Compress/Lzma2Decoder.h +0 -96
  521. package/android/jni/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp +0 -122
  522. package/android/jni/lzma/CPP/7zip/Compress/Lzma2Encoder.h +0 -42
  523. package/android/jni/lzma/CPP/7zip/Compress/Lzma2Register.cpp +0 -22
  524. package/android/jni/lzma/CPP/7zip/Compress/LzmaDecoder.cpp +0 -343
  525. package/android/jni/lzma/CPP/7zip/Compress/LzmaDecoder.h +0 -113
  526. package/android/jni/lzma/CPP/7zip/Compress/LzmaEncoder.cpp +0 -182
  527. package/android/jni/lzma/CPP/7zip/Compress/LzmaEncoder.h +0 -46
  528. package/android/jni/lzma/CPP/7zip/Compress/LzmaRegister.cpp +0 -22
  529. package/android/jni/lzma/CPP/7zip/Compress/PpmdDecoder.cpp +0 -170
  530. package/android/jni/lzma/CPP/7zip/Compress/PpmdDecoder.h +0 -86
  531. package/android/jni/lzma/CPP/7zip/Compress/PpmdEncoder.cpp +0 -152
  532. package/android/jni/lzma/CPP/7zip/Compress/PpmdEncoder.h +0 -58
  533. package/android/jni/lzma/CPP/7zip/Compress/PpmdRegister.cpp +0 -22
  534. package/android/jni/lzma/CPP/7zip/Compress/StdAfx.h +0 -8
  535. package/android/jni/lzma/CPP/7zip/Compress/XzDecoder.cpp +0 -150
  536. package/android/jni/lzma/CPP/7zip/Compress/XzDecoder.h +0 -92
  537. package/android/jni/lzma/CPP/7zip/Compress/XzEncoder.cpp +0 -245
  538. package/android/jni/lzma/CPP/7zip/Compress/XzEncoder.h +0 -46
  539. package/android/jni/lzma/CPP/7zip/Crc.mak +0 -8
  540. package/android/jni/lzma/CPP/7zip/Crc64.mak +0 -8
  541. package/android/jni/lzma/CPP/7zip/Crypto/7zAes.cpp +0 -280
  542. package/android/jni/lzma/CPP/7zip/Crypto/7zAes.h +0 -118
  543. package/android/jni/lzma/CPP/7zip/Crypto/7zAesRegister.cpp +0 -17
  544. package/android/jni/lzma/CPP/7zip/Crypto/MyAes.cpp +0 -112
  545. package/android/jni/lzma/CPP/7zip/Crypto/MyAes.h +0 -57
  546. package/android/jni/lzma/CPP/7zip/Crypto/MyAesReg.cpp +0 -16
  547. package/android/jni/lzma/CPP/7zip/Crypto/RandGen.cpp +0 -233
  548. package/android/jni/lzma/CPP/7zip/Crypto/RandGen.h +0 -40
  549. package/android/jni/lzma/CPP/7zip/Crypto/StdAfx.h +0 -8
  550. package/android/jni/lzma/CPP/7zip/GuiCommon.rc +0 -84
  551. package/android/jni/lzma/CPP/7zip/Guid.txt +0 -220
  552. package/android/jni/lzma/CPP/7zip/ICoder.h +0 -399
  553. package/android/jni/lzma/CPP/7zip/IDecl.h +0 -28
  554. package/android/jni/lzma/CPP/7zip/IPassword.h +0 -23
  555. package/android/jni/lzma/CPP/7zip/IProgress.h +0 -19
  556. package/android/jni/lzma/CPP/7zip/IStream.h +0 -127
  557. package/android/jni/lzma/CPP/7zip/LzmaDec.mak +0 -5
  558. package/android/jni/lzma/CPP/7zip/MyVersion.h +0 -2
  559. package/android/jni/lzma/CPP/7zip/MyVersionInfo.rc +0 -2
  560. package/android/jni/lzma/CPP/7zip/PropID.h +0 -127
  561. package/android/jni/lzma/CPP/7zip/SubBuild.mak +0 -3
  562. package/android/jni/lzma/CPP/7zip/UI/Client7z/Client7z.cpp +0 -993
  563. package/android/jni/lzma/CPP/7zip/UI/Client7z/Client7z.dsp +0 -235
  564. package/android/jni/lzma/CPP/7zip/UI/Client7z/Client7z.dsw +0 -29
  565. package/android/jni/lzma/CPP/7zip/UI/Client7z/StdAfx.cpp +0 -3
  566. package/android/jni/lzma/CPP/7zip/UI/Client7z/StdAfx.h +0 -8
  567. package/android/jni/lzma/CPP/7zip/UI/Client7z/makefile +0 -28
  568. package/android/jni/lzma/CPP/7zip/UI/Client7z/resource.rc +0 -3
  569. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.cpp +0 -1295
  570. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.h +0 -136
  571. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp +0 -1715
  572. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.h +0 -403
  573. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveName.cpp +0 -155
  574. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveName.h +0 -10
  575. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp +0 -161
  576. package/android/jni/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.h +0 -112
  577. package/android/jni/lzma/CPP/7zip/UI/Common/Bench.cpp +0 -3618
  578. package/android/jni/lzma/CPP/7zip/UI/Common/Bench.h +0 -77
  579. package/android/jni/lzma/CPP/7zip/UI/Common/DefaultName.cpp +0 -37
  580. package/android/jni/lzma/CPP/7zip/UI/Common/DefaultName.h +0 -11
  581. package/android/jni/lzma/CPP/7zip/UI/Common/DirItem.h +0 -190
  582. package/android/jni/lzma/CPP/7zip/UI/Common/EnumDirItems.cpp +0 -1096
  583. package/android/jni/lzma/CPP/7zip/UI/Common/EnumDirItems.h +0 -42
  584. package/android/jni/lzma/CPP/7zip/UI/Common/ExitCode.h +0 -27
  585. package/android/jni/lzma/CPP/7zip/UI/Common/Extract.cpp +0 -482
  586. package/android/jni/lzma/CPP/7zip/UI/Common/Extract.h +0 -94
  587. package/android/jni/lzma/CPP/7zip/UI/Common/ExtractMode.h +0 -34
  588. package/android/jni/lzma/CPP/7zip/UI/Common/ExtractingFilePath.cpp +0 -280
  589. package/android/jni/lzma/CPP/7zip/UI/Common/ExtractingFilePath.h +0 -31
  590. package/android/jni/lzma/CPP/7zip/UI/Common/HashCalc.cpp +0 -347
  591. package/android/jni/lzma/CPP/7zip/UI/Common/HashCalc.h +0 -110
  592. package/android/jni/lzma/CPP/7zip/UI/Common/IFileExtractCallback.h +0 -114
  593. package/android/jni/lzma/CPP/7zip/UI/Common/LoadCodecs.cpp +0 -1074
  594. package/android/jni/lzma/CPP/7zip/UI/Common/LoadCodecs.h +0 -424
  595. package/android/jni/lzma/CPP/7zip/UI/Common/OpenArchive.cpp +0 -3553
  596. package/android/jni/lzma/CPP/7zip/UI/Common/OpenArchive.h +0 -436
  597. package/android/jni/lzma/CPP/7zip/UI/Common/PropIDUtils.cpp +0 -668
  598. package/android/jni/lzma/CPP/7zip/UI/Common/PropIDUtils.h +0 -18
  599. package/android/jni/lzma/CPP/7zip/UI/Common/Property.h +0 -14
  600. package/android/jni/lzma/CPP/7zip/UI/Common/SetProperties.cpp +0 -80
  601. package/android/jni/lzma/CPP/7zip/UI/Common/SetProperties.h +0 -10
  602. package/android/jni/lzma/CPP/7zip/UI/Common/SortUtils.cpp +0 -25
  603. package/android/jni/lzma/CPP/7zip/UI/Common/SortUtils.h +0 -10
  604. package/android/jni/lzma/CPP/7zip/UI/Common/StdAfx.h +0 -8
  605. package/android/jni/lzma/CPP/7zip/UI/Common/TempFiles.cpp +0 -19
  606. package/android/jni/lzma/CPP/7zip/UI/Common/TempFiles.h +0 -16
  607. package/android/jni/lzma/CPP/7zip/UI/Common/Update.cpp +0 -1704
  608. package/android/jni/lzma/CPP/7zip/UI/Common/Update.h +0 -200
  609. package/android/jni/lzma/CPP/7zip/UI/Common/UpdateAction.cpp +0 -64
  610. package/android/jni/lzma/CPP/7zip/UI/Common/UpdateAction.h +0 -66
  611. package/android/jni/lzma/CPP/7zip/UI/Common/UpdateCallback.cpp +0 -771
  612. package/android/jni/lzma/CPP/7zip/UI/Common/UpdateCallback.h +0 -162
  613. package/android/jni/lzma/CPP/7zip/UI/Common/UpdatePair.cpp +0 -233
  614. package/android/jni/lzma/CPP/7zip/UI/Common/UpdatePair.h +0 -27
  615. package/android/jni/lzma/CPP/7zip/UI/Common/UpdateProduce.cpp +0 -70
  616. package/android/jni/lzma/CPP/7zip/UI/Common/UpdateProduce.h +0 -55
  617. package/android/jni/lzma/CPP/7zip/UI/Common/WorkDir.cpp +0 -94
  618. package/android/jni/lzma/CPP/7zip/UI/Common/WorkDir.h +0 -26
  619. package/android/jni/lzma/CPP/7zip/UI/Common/ZipRegistry.h +0 -130
  620. package/android/jni/lzma/CPP/7zip/UI/Console/BenchCon.cpp +0 -41
  621. package/android/jni/lzma/CPP/7zip/UI/Console/BenchCon.h +0 -14
  622. package/android/jni/lzma/CPP/7zip/UI/Console/Console.mak +0 -43
  623. package/android/jni/lzma/CPP/7zip/UI/Console/Console.manifest +0 -13
  624. package/android/jni/lzma/CPP/7zip/UI/Console/ConsoleClose.cpp +0 -69
  625. package/android/jni/lzma/CPP/7zip/UI/Console/ConsoleClose.h +0 -33
  626. package/android/jni/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp +0 -825
  627. package/android/jni/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.h +0 -164
  628. package/android/jni/lzma/CPP/7zip/UI/Console/HashCon.cpp +0 -367
  629. package/android/jni/lzma/CPP/7zip/UI/Console/HashCon.h +0 -48
  630. package/android/jni/lzma/CPP/7zip/UI/Console/List.cpp +0 -1359
  631. package/android/jni/lzma/CPP/7zip/UI/Console/List.h +0 -27
  632. package/android/jni/lzma/CPP/7zip/UI/Console/Main.cpp +0 -1154
  633. package/android/jni/lzma/CPP/7zip/UI/Console/MainAr.cpp +0 -175
  634. package/android/jni/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.cpp +0 -115
  635. package/android/jni/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.h +0 -66
  636. package/android/jni/lzma/CPP/7zip/UI/Console/PercentPrinter.cpp +0 -183
  637. package/android/jni/lzma/CPP/7zip/UI/Console/PercentPrinter.h +0 -62
  638. package/android/jni/lzma/CPP/7zip/UI/Console/StdAfx.cpp +0 -3
  639. package/android/jni/lzma/CPP/7zip/UI/Console/StdAfx.h +0 -8
  640. package/android/jni/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp +0 -702
  641. package/android/jni/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.h +0 -124
  642. package/android/jni/lzma/CPP/7zip/UI/Console/UserInputUtils.cpp +0 -110
  643. package/android/jni/lzma/CPP/7zip/UI/Console/UserInputUtils.h +0 -27
  644. package/android/jni/lzma/CPP/7zip/UI/Console/makefile +0 -64
  645. package/android/jni/lzma/CPP/7zip/UI/Console/resource.rc +0 -7
  646. package/android/jni/lzma/CPP/7zip/UI/Explorer/MyMessages.cpp +0 -37
  647. package/android/jni/lzma/CPP/7zip/UI/Explorer/MyMessages.h +0 -16
  648. package/android/jni/lzma/CPP/7zip/UI/FileManager/BrowseDialog.cpp +0 -1025
  649. package/android/jni/lzma/CPP/7zip/UI/FileManager/BrowseDialog.h +0 -21
  650. package/android/jni/lzma/CPP/7zip/UI/FileManager/BrowseDialogRes.h +0 -9
  651. package/android/jni/lzma/CPP/7zip/UI/FileManager/ComboDialog.cpp +0 -64
  652. package/android/jni/lzma/CPP/7zip/UI/FileManager/ComboDialog.h +0 -28
  653. package/android/jni/lzma/CPP/7zip/UI/FileManager/ComboDialogRes.h +0 -4
  654. package/android/jni/lzma/CPP/7zip/UI/FileManager/DialogSize.h +0 -16
  655. package/android/jni/lzma/CPP/7zip/UI/FileManager/ExtractCallback.cpp +0 -1037
  656. package/android/jni/lzma/CPP/7zip/UI/FileManager/ExtractCallback.h +0 -328
  657. package/android/jni/lzma/CPP/7zip/UI/FileManager/FormatUtils.cpp +0 -28
  658. package/android/jni/lzma/CPP/7zip/UI/FileManager/FormatUtils.h +0 -14
  659. package/android/jni/lzma/CPP/7zip/UI/FileManager/LangUtils.h +0 -40
  660. package/android/jni/lzma/CPP/7zip/UI/FileManager/MyWindowsNew.h +0 -76
  661. package/android/jni/lzma/CPP/7zip/UI/FileManager/OverwriteDialog.cpp +0 -122
  662. package/android/jni/lzma/CPP/7zip/UI/FileManager/OverwriteDialog.h +0 -69
  663. package/android/jni/lzma/CPP/7zip/UI/FileManager/OverwriteDialog.rc +0 -91
  664. package/android/jni/lzma/CPP/7zip/UI/FileManager/OverwriteDialogRes.h +0 -17
  665. package/android/jni/lzma/CPP/7zip/UI/FileManager/PasswordDialog.cpp +0 -58
  666. package/android/jni/lzma/CPP/7zip/UI/FileManager/PasswordDialog.h +0 -28
  667. package/android/jni/lzma/CPP/7zip/UI/FileManager/PasswordDialog.rc +0 -14
  668. package/android/jni/lzma/CPP/7zip/UI/FileManager/PasswordDialogRes.h +0 -5
  669. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog.cpp +0 -196
  670. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog.h +0 -170
  671. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog.rc +0 -12
  672. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.cpp +0 -1337
  673. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.h +0 -351
  674. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.rc +0 -40
  675. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog2Res.h +0 -48
  676. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialog2a.rc +0 -80
  677. package/android/jni/lzma/CPP/7zip/UI/FileManager/ProgressDialogRes.h +0 -3
  678. package/android/jni/lzma/CPP/7zip/UI/FileManager/PropertyName.cpp +0 -23
  679. package/android/jni/lzma/CPP/7zip/UI/FileManager/PropertyName.h +0 -10
  680. package/android/jni/lzma/CPP/7zip/UI/FileManager/PropertyNameRes.h +0 -95
  681. package/android/jni/lzma/CPP/7zip/UI/FileManager/SysIconUtils.cpp +0 -255
  682. package/android/jni/lzma/CPP/7zip/UI/FileManager/SysIconUtils.h +0 -62
  683. package/android/jni/lzma/CPP/7zip/UI/FileManager/resource.h +0 -177
  684. package/android/jni/lzma/CPP/7zip/UI/FileManager/resourceGui.h +0 -15
  685. package/android/jni/lzma/CPP/7zip/UI/GUI/Extract.rc +0 -59
  686. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractDialog.cpp +0 -418
  687. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractDialog.h +0 -113
  688. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractDialog.rc +0 -98
  689. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractDialogRes.h +0 -24
  690. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractGUI.cpp +0 -280
  691. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractGUI.h +0 -38
  692. package/android/jni/lzma/CPP/7zip/UI/GUI/ExtractRes.h +0 -51
  693. package/android/jni/lzma/CPP/7zip/UI/GUI/HashGUI.h +0 -27
  694. package/android/jni/lzma/CPP/7zip/UI/GUI/resource2.h +0 -2
  695. package/android/jni/lzma/CPP/Build.mak +0 -156
  696. package/android/jni/lzma/CPP/Common/AutoPtr.h +0 -35
  697. package/android/jni/lzma/CPP/Common/CRC.cpp +0 -7
  698. package/android/jni/lzma/CPP/Common/C_FileIO.cpp +0 -92
  699. package/android/jni/lzma/CPP/Common/C_FileIO.h +0 -53
  700. package/android/jni/lzma/CPP/Common/ComTry.h +0 -21
  701. package/android/jni/lzma/CPP/Common/CommandLineParser.cpp +0 -197
  702. package/android/jni/lzma/CPP/Common/CommandLineParser.h +0 -63
  703. package/android/jni/lzma/CPP/Common/Common.h +0 -43
  704. package/android/jni/lzma/CPP/Common/CrcReg.cpp +0 -98
  705. package/android/jni/lzma/CPP/Common/Defs.h +0 -15
  706. package/android/jni/lzma/CPP/Common/DynamicBuffer.h +0 -64
  707. package/android/jni/lzma/CPP/Common/IntToString.cpp +0 -193
  708. package/android/jni/lzma/CPP/Common/IntToString.h +0 -28
  709. package/android/jni/lzma/CPP/Common/Lang.h +0 -23
  710. package/android/jni/lzma/CPP/Common/ListFileUtils.cpp +0 -132
  711. package/android/jni/lzma/CPP/Common/ListFileUtils.h +0 -18
  712. package/android/jni/lzma/CPP/Common/MyBuffer.h +0 -259
  713. package/android/jni/lzma/CPP/Common/MyBuffer2.h +0 -100
  714. package/android/jni/lzma/CPP/Common/MyCom.h +0 -277
  715. package/android/jni/lzma/CPP/Common/MyException.h +0 -14
  716. package/android/jni/lzma/CPP/Common/MyGuidDef.h +0 -54
  717. package/android/jni/lzma/CPP/Common/MyInitGuid.h +0 -45
  718. package/android/jni/lzma/CPP/Common/MyLinux.h +0 -42
  719. package/android/jni/lzma/CPP/Common/MyString.cpp +0 -1659
  720. package/android/jni/lzma/CPP/Common/MyString.h +0 -868
  721. package/android/jni/lzma/CPP/Common/MyTypes.h +0 -35
  722. package/android/jni/lzma/CPP/Common/MyUnknown.h +0 -17
  723. package/android/jni/lzma/CPP/Common/MyVector.cpp +0 -3
  724. package/android/jni/lzma/CPP/Common/MyVector.h +0 -634
  725. package/android/jni/lzma/CPP/Common/MyWindows.cpp +0 -145
  726. package/android/jni/lzma/CPP/Common/MyWindows.h +0 -231
  727. package/android/jni/lzma/CPP/Common/NewHandler.cpp +0 -163
  728. package/android/jni/lzma/CPP/Common/NewHandler.h +0 -88
  729. package/android/jni/lzma/CPP/Common/Sha256Reg.cpp +0 -40
  730. package/android/jni/lzma/CPP/Common/StdAfx.h +0 -8
  731. package/android/jni/lzma/CPP/Common/StdInStream.cpp +0 -89
  732. package/android/jni/lzma/CPP/Common/StdInStream.h +0 -38
  733. package/android/jni/lzma/CPP/Common/StdOutStream.cpp +0 -163
  734. package/android/jni/lzma/CPP/Common/StdOutStream.h +0 -71
  735. package/android/jni/lzma/CPP/Common/StringConvert.cpp +0 -319
  736. package/android/jni/lzma/CPP/Common/StringConvert.h +0 -88
  737. package/android/jni/lzma/CPP/Common/StringToInt.cpp +0 -144
  738. package/android/jni/lzma/CPP/Common/StringToInt.h +0 -21
  739. package/android/jni/lzma/CPP/Common/TextConfig.cpp +0 -124
  740. package/android/jni/lzma/CPP/Common/TextConfig.h +0 -19
  741. package/android/jni/lzma/CPP/Common/UTFConvert.cpp +0 -288
  742. package/android/jni/lzma/CPP/Common/UTFConvert.h +0 -12
  743. package/android/jni/lzma/CPP/Common/Wildcard.cpp +0 -676
  744. package/android/jni/lzma/CPP/Common/Wildcard.h +0 -149
  745. package/android/jni/lzma/CPP/Common/XzCrc64Init.cpp +0 -7
  746. package/android/jni/lzma/CPP/Common/XzCrc64Reg.cpp +0 -42
  747. package/android/jni/lzma/CPP/Windows/COM.h +0 -70
  748. package/android/jni/lzma/CPP/Windows/CommonDialog.cpp +0 -185
  749. package/android/jni/lzma/CPP/Windows/CommonDialog.h +0 -23
  750. package/android/jni/lzma/CPP/Windows/Control/ComboBox.cpp +0 -66
  751. package/android/jni/lzma/CPP/Windows/Control/ComboBox.h +0 -65
  752. package/android/jni/lzma/CPP/Windows/Control/CommandBar.h +0 -52
  753. package/android/jni/lzma/CPP/Windows/Control/Dialog.cpp +0 -251
  754. package/android/jni/lzma/CPP/Windows/Control/Dialog.h +0 -170
  755. package/android/jni/lzma/CPP/Windows/Control/Edit.h +0 -19
  756. package/android/jni/lzma/CPP/Windows/Control/ImageList.cpp +0 -10
  757. package/android/jni/lzma/CPP/Windows/Control/ImageList.h +0 -87
  758. package/android/jni/lzma/CPP/Windows/Control/ListView.cpp +0 -155
  759. package/android/jni/lzma/CPP/Windows/Control/ListView.h +0 -146
  760. package/android/jni/lzma/CPP/Windows/Control/ProgressBar.h +0 -35
  761. package/android/jni/lzma/CPP/Windows/Control/PropertyPage.cpp +0 -143
  762. package/android/jni/lzma/CPP/Windows/Control/PropertyPage.h +0 -50
  763. package/android/jni/lzma/CPP/Windows/Control/ReBar.h +0 -34
  764. package/android/jni/lzma/CPP/Windows/Control/Static.h +0 -28
  765. package/android/jni/lzma/CPP/Windows/Control/StatusBar.h +0 -42
  766. package/android/jni/lzma/CPP/Windows/Control/StdAfx.h +0 -8
  767. package/android/jni/lzma/CPP/Windows/Control/ToolBar.h +0 -43
  768. package/android/jni/lzma/CPP/Windows/Control/Trackbar.h +0 -27
  769. package/android/jni/lzma/CPP/Windows/Control/Window2.cpp +0 -200
  770. package/android/jni/lzma/CPP/Windows/Control/Window2.h +0 -51
  771. package/android/jni/lzma/CPP/Windows/DLL.cpp +0 -109
  772. package/android/jni/lzma/CPP/Windows/DLL.h +0 -58
  773. package/android/jni/lzma/CPP/Windows/Defs.h +0 -17
  774. package/android/jni/lzma/CPP/Windows/ErrorMsg.cpp +0 -66
  775. package/android/jni/lzma/CPP/Windows/ErrorMsg.h +0 -15
  776. package/android/jni/lzma/CPP/Windows/FileDir.cpp +0 -714
  777. package/android/jni/lzma/CPP/Windows/FileDir.h +0 -117
  778. package/android/jni/lzma/CPP/Windows/FileFind.cpp +0 -749
  779. package/android/jni/lzma/CPP/Windows/FileFind.h +0 -161
  780. package/android/jni/lzma/CPP/Windows/FileIO.cpp +0 -432
  781. package/android/jni/lzma/CPP/Windows/FileIO.h +0 -212
  782. package/android/jni/lzma/CPP/Windows/FileLink.cpp +0 -440
  783. package/android/jni/lzma/CPP/Windows/FileMapping.cpp +0 -12
  784. package/android/jni/lzma/CPP/Windows/FileMapping.h +0 -66
  785. package/android/jni/lzma/CPP/Windows/FileName.cpp +0 -839
  786. package/android/jni/lzma/CPP/Windows/FileName.h +0 -115
  787. package/android/jni/lzma/CPP/Windows/FileSystem.cpp +0 -131
  788. package/android/jni/lzma/CPP/Windows/FileSystem.h +0 -27
  789. package/android/jni/lzma/CPP/Windows/Handle.h +0 -37
  790. package/android/jni/lzma/CPP/Windows/MemoryLock.cpp +0 -112
  791. package/android/jni/lzma/CPP/Windows/MemoryLock.h +0 -40
  792. package/android/jni/lzma/CPP/Windows/NtCheck.h +0 -46
  793. package/android/jni/lzma/CPP/Windows/PropVariant.cpp +0 -347
  794. package/android/jni/lzma/CPP/Windows/PropVariant.h +0 -114
  795. package/android/jni/lzma/CPP/Windows/PropVariantConv.cpp +0 -138
  796. package/android/jni/lzma/CPP/Windows/PropVariantConv.h +0 -37
  797. package/android/jni/lzma/CPP/Windows/Registry.cpp +0 -390
  798. package/android/jni/lzma/CPP/Windows/Registry.h +0 -84
  799. package/android/jni/lzma/CPP/Windows/ResourceString.cpp +0 -103
  800. package/android/jni/lzma/CPP/Windows/ResourceString.h +0 -16
  801. package/android/jni/lzma/CPP/Windows/SecurityUtils.cpp +0 -181
  802. package/android/jni/lzma/CPP/Windows/SecurityUtils.h +0 -167
  803. package/android/jni/lzma/CPP/Windows/Shell.cpp +0 -358
  804. package/android/jni/lzma/CPP/Windows/Shell.h +0 -94
  805. package/android/jni/lzma/CPP/Windows/StdAfx.h +0 -8
  806. package/android/jni/lzma/CPP/Windows/Synchronization.cpp +0 -10
  807. package/android/jni/lzma/CPP/Windows/Synchronization.h +0 -164
  808. package/android/jni/lzma/CPP/Windows/System.cpp +0 -142
  809. package/android/jni/lzma/CPP/Windows/System.h +0 -40
  810. package/android/jni/lzma/CPP/Windows/Thread.h +0 -38
  811. package/android/jni/lzma/CPP/Windows/TimeUtils.cpp +0 -213
  812. package/android/jni/lzma/CPP/Windows/TimeUtils.h +0 -32
  813. package/android/jni/lzma/CPP/Windows/Window.cpp +0 -179
  814. package/android/jni/lzma/CPP/Windows/Window.h +0 -284
  815. package/android/jni/lzma/CS/7zip/Common/CRC.cs +0 -55
  816. package/android/jni/lzma/CS/7zip/Common/CommandLineParser.cs +0 -274
  817. package/android/jni/lzma/CS/7zip/Common/InBuffer.cs +0 -72
  818. package/android/jni/lzma/CS/7zip/Common/OutBuffer.cs +0 -47
  819. package/android/jni/lzma/CS/7zip/Compress/LZ/IMatchFinder.cs +0 -24
  820. package/android/jni/lzma/CS/7zip/Compress/LZ/LzBinTree.cs +0 -367
  821. package/android/jni/lzma/CS/7zip/Compress/LZ/LzInWindow.cs +0 -132
  822. package/android/jni/lzma/CS/7zip/Compress/LZ/LzOutWindow.cs +0 -110
  823. package/android/jni/lzma/CS/7zip/Compress/LZMA/LzmaBase.cs +0 -76
  824. package/android/jni/lzma/CS/7zip/Compress/LZMA/LzmaDecoder.cs +0 -398
  825. package/android/jni/lzma/CS/7zip/Compress/LZMA/LzmaEncoder.cs +0 -1480
  826. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.cs +0 -364
  827. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.csproj +0 -90
  828. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.sln +0 -20
  829. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/LzmaBench.cs +0 -340
  830. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/Properties/AssemblyInfo.cs +0 -29
  831. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/Properties/Resources.cs +0 -70
  832. package/android/jni/lzma/CS/7zip/Compress/LzmaAlone/Properties/Settings.cs +0 -42
  833. package/android/jni/lzma/CS/7zip/Compress/RangeCoder/RangeCoder.cs +0 -234
  834. package/android/jni/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBit.cs +0 -117
  835. package/android/jni/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBitTree.cs +0 -157
  836. package/android/jni/lzma/CS/7zip/ICoder.cs +0 -157
  837. package/android/jni/lzma/DOC/7zC.txt +0 -187
  838. package/android/jni/lzma/DOC/7zFormat.txt +0 -469
  839. package/android/jni/lzma/DOC/Methods.txt +0 -173
  840. package/android/jni/lzma/DOC/installer.txt +0 -166
  841. package/android/jni/lzma/DOC/lzma-history.txt +0 -446
  842. package/android/jni/lzma/DOC/lzma-specification.txt +0 -1176
  843. package/android/jni/lzma/DOC/lzma.txt +0 -328
  844. package/android/jni/lzma/Java/SevenZip/CRC.java +0 -52
  845. package/android/jni/lzma/Java/SevenZip/Compression/LZ/BinTree.java +0 -382
  846. package/android/jni/lzma/Java/SevenZip/Compression/LZ/InWindow.java +0 -131
  847. package/android/jni/lzma/Java/SevenZip/Compression/LZ/OutWindow.java +0 -85
  848. package/android/jni/lzma/Java/SevenZip/Compression/LZMA/Base.java +0 -88
  849. package/android/jni/lzma/Java/SevenZip/Compression/LZMA/Decoder.java +0 -329
  850. package/android/jni/lzma/Java/SevenZip/Compression/LZMA/Encoder.java +0 -1416
  851. package/android/jni/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeDecoder.java +0 -55
  852. package/android/jni/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeEncoder.java +0 -99
  853. package/android/jni/lzma/Java/SevenZip/Compression/RangeCoder/Decoder.java +0 -88
  854. package/android/jni/lzma/Java/SevenZip/Compression/RangeCoder/Encoder.java +0 -151
  855. package/android/jni/lzma/Java/SevenZip/ICodeProgress.java +0 -6
  856. package/android/jni/lzma/Java/SevenZip/LzmaAlone.java +0 -253
  857. package/android/jni/lzma/Java/SevenZip/LzmaBench.java +0 -392
  858. package/android/jni/lzma/bin/7zS2.sfx +0 -0
  859. package/android/jni/lzma/bin/7zS2con.sfx +0 -0
  860. package/android/jni/lzma/bin/7zSD.sfx +0 -0
  861. package/android/jni/lzma/bin/7zdec.exe +0 -0
  862. package/android/jni/lzma/bin/7zr.exe +0 -0
  863. package/android/jni/lzma/bin/installer/config.txt +0 -5
  864. package/android/jni/lzma/bin/installer/cr.bat +0 -5
  865. package/android/jni/lzma/bin/lzma.exe +0 -0
  866. package/android/jni/lzma/bin/x64/7zr.exe +0 -0
  867. package/android/src/main/java/cn/reactnative/modules/update/ArchivePatchPlanResult.java +0 -6
  868. package/android/src/main/java/cn/reactnative/modules/update/PushyConfiguration.java +0 -104
  869. package/android/src/main/java/cn/reactnative/modules/update/UiThreadRunner.java +0 -37
  870. package/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java +0 -121
  871. package/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java +0 -125
  872. package/cpp/patch_core/jni_natives.h +0 -27
  873. package/cpp/patch_core/jni_registration.cpp +0 -103
  874. package/cpp/patch_core/jni_util.h +0 -60
  875. package/cpp/patch_core/patch_core_android.cpp +0 -97
  876. package/cpp/patch_core/update_core_android.cpp +0 -485
  877. package/cpp/update_flow_core/update_flow_jni.cpp +0 -150
@@ -6,10 +6,10 @@ import androidx.annotation.Nullable;
6
6
  import java.io.IOException;
7
7
  import java.nio.charset.Charset;
8
8
  import java.nio.charset.StandardCharsets;
9
- import java.util.HashSet;
10
9
  import java.util.concurrent.CountDownLatch;
11
10
  import java.util.concurrent.TimeUnit;
12
11
  import java.util.concurrent.atomic.AtomicBoolean;
12
+ import java.util.concurrent.atomic.AtomicReference;
13
13
  import okhttp3.MediaType;
14
14
  import okhttp3.OkHttpClient;
15
15
  import okhttp3.Request;
@@ -31,20 +31,22 @@ import org.json.JSONObject;
31
31
  * version blacklisting.
32
32
  */
33
33
  final class SyncCoordinator {
34
- // Version-info flags read by JS (metadata.ts), stored encoded.
35
- private static final String INFO_CRASH_HOLD = Texts.reveal("3905f5c2a6b96d56212a19");
36
- private static final String INFO_FORCE_BOOT = Texts.reveal("3c18e6d2aba9674a360d19ead5a695");
34
+ // Version-info flag read by JS (metadata.ts), stored encoded.
35
+ private static final String INFO_CRASH_HOLD = Texts.INFO_CRASH_HOLD;
37
36
 
37
+ // Shared with Harmony. The response cache lives in its own
38
+ // SharedPreferences file (UpdateContext.getNativeCheckCache).
39
+ // <generated:storage-keys> (scripts/contract.ts; bun scripts/generate-contract.ts)
40
+ // The persisted native check config (JS syncNativeConfig or the host).
38
41
  static final String KEY_CONFIG = "nativeConfig";
39
- // Raw response cache for the JS side to reuse (§10.3), scoped to the
40
- // exact logical request and native config that produced it.
42
+ // Raw response cache for the JS side to reuse (§10.3), scoped to the exact
43
+ // logical request and native config that produced it.
41
44
  static final String KEY_RESP_CACHE = "nativeCheckResp";
42
45
  // Set when a round starts, cleared when it ends (§11.4). Residue on the
43
- // next launch means the previous process died mid-round (a crash rescue
44
- // was truncated): that launch resumes immediately instead of waiting 5s.
46
+ // next launch means the previous process died mid-round: that launch
47
+ // resumes immediately instead of waiting 5s.
45
48
  static final String KEY_ROUND_INCOMPLETE = "nativeCheckIncomplete";
46
- private static final int MAX_QUERY_HTTP_ATTEMPTS = 8;
47
- private static final long DOWNLOAD_PHASE_TIMEOUT_SECONDS = 600;
49
+ // </generated:storage-keys>
48
50
  // The check response (and a remote queryUrls list) is a small JSON
49
51
  // document; anything bigger is a broken or hijacked endpoint.
50
52
  private static final long MAX_QUERY_RESPONSE_BYTES = 1024 * 1024;
@@ -67,7 +69,7 @@ final class SyncCoordinator {
67
69
  // bumps it, and the late activation must lose to that reset exactly like
68
70
  // the round itself would. Written generation-first, read hash-first, so
69
71
  // a torn read can only see a stricter (newer) generation.
70
- private static volatile String unactivatedHash;
72
+ static volatile String unactivatedHash;
71
73
  private static volatile long unactivatedGeneration;
72
74
  private static volatile UpdateContext sContext;
73
75
  private static volatile String sLaunchRolledBackVersion;
@@ -77,42 +79,50 @@ final class SyncCoordinator {
77
79
  private static volatile String sJsCompletedConfig;
78
80
  // Published after the launch rollback snapshot, before host calls are accepted.
79
81
  private static volatile boolean nativeReady;
80
- private static volatile BundlePreparationResult roundResult =
82
+ static volatile BundlePreparationResult roundResult =
81
83
  BundlePreparationResult.of(BundlePreparationResult.FAILED, "check_failed");
82
84
  private static volatile long roundGeneration = -1;
83
85
  private static volatile long roundConfigGeneration = -1;
84
86
  private static volatile String roundConfigJson;
85
87
 
86
- /** Blocking only on the host API's worker; never call on the UI thread. */
87
- static BundlePreparationResult prepareBundle(UpdateContext context) throws InterruptedException {
88
- if (UpdateContext.DEBUG) {
88
+ // prepareBundle without an explicit timeout waits this long at most: past
89
+ // the longest round (8 query requests, then two 600s download phases).
90
+ // Same default as iOS (kPushyHostPrepareDefaultTimeout).
91
+ static final long DEFAULT_PREPARE_TIMEOUT_MS = 30 * 60 * 1000L;
92
+
93
+ /**
94
+ * Blocking only on the host API's worker; never call on the UI thread.
95
+ * Waits at most timeoutMs for this process's round: on expiry the result
96
+ * is failed/timeout, and the round keeps running in the background (its
97
+ * result still applies to the next launch), as on iOS.
98
+ */
99
+ static BundlePreparationResult prepareBundle(UpdateContext context, long timeoutMs)
100
+ throws InterruptedException {
101
+ if (BuildConfig.DEBUG) {
89
102
  return BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "debug");
90
103
  }
91
104
  if (!nativeReady || sContext != context || !context.getIsUsingBundleUrl()) {
92
105
  return BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "not_initialized");
93
106
  }
94
107
  String configJson = context.getKv(KEY_CONFIG);
95
- if (configJson == null || configJson.isEmpty()) {
96
- return BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "not_configured");
108
+ BundlePreparationResult rejection = configRejection(configJson);
109
+ if (rejection != null) {
110
+ return rejection;
97
111
  }
98
- try {
99
- JSONObject config = new JSONObject(configJson);
100
- if (config.optBoolean("disabled", false)) {
101
- return BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "disabled");
102
- }
103
- if (config.optString("appKey", "").isEmpty()) {
104
- return BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_config");
105
- }
106
- } catch (JSONException e) {
107
- return BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_config");
112
+ // Run the round on its own thread rather than this caller's, so the
113
+ // wait below can be bounded.
114
+ if (claimRound()) {
115
+ Threads.startDaemon("pushy-native-sync", () -> runClaimedRound(0));
108
116
  }
109
- startRound(0);
110
117
  if (!roundStarted.get()) {
111
118
  return BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "config_changed");
112
119
  }
113
- roundDone.await();
120
+ if (!roundDone.await(Math.max(0, timeoutMs), TimeUnit.MILLISECONDS)) {
121
+ return BundlePreparationResult.of(BundlePreparationResult.FAILED, "timeout");
122
+ }
114
123
  if (roundConfigGeneration != UpdateContext.getNativeConfigGeneration()
115
- || !configJson.equals(roundConfigJson) || !configJson.equals(context.getKv(KEY_CONFIG))) {
124
+ || !FlowBridge.configsEquivalent(configJson, roundConfigJson)
125
+ || !FlowBridge.configsEquivalent(configJson, context.getKv(KEY_CONFIG))) {
116
126
  return BundlePreparationResult.of(BundlePreparationResult.CANCELLED, "config_changed");
117
127
  }
118
128
  if (roundGeneration != UpdateContext.getResetGeneration()) {
@@ -127,21 +137,49 @@ final class SyncCoordinator {
127
137
  }
128
138
 
129
139
  /**
130
- * True when JS already obtained a valid response in this process for the
131
- * exact config the native round would use: the delayed round is then a
132
- * duplicate request. Only the scheduled round consults this — the
133
- * crash-rescue path still runs, JS is dead by then.
140
+ * True when JS already obtained a valid response in this process for a
141
+ * config equivalent (FlowBridge.configsEquivalent, contract C1) to
142
+ * the one the native round would use: the delayed round is then a
143
+ * duplicate request. JS and a host may serialize the same config
144
+ * differently, so exact string equality would almost never match. Only
145
+ * the scheduled round consults this — the crash-rescue path still runs,
146
+ * JS is dead by then.
134
147
  */
135
148
  private static boolean hasJsRound(UpdateContext context) {
136
149
  String jsConfig = sJsCompletedConfig;
137
- return jsConfig != null && jsConfig.equals(context.getKv(KEY_CONFIG));
150
+ return jsConfig != null
151
+ && FlowBridge.configsEquivalent(jsConfig, context.getKv(KEY_CONFIG));
152
+ }
153
+
154
+ /**
155
+ * The shared gate (FlowBridge.runnableConfig, update_flow_core) every
156
+ * entry point (prepareBundle, the automatic round's gate, the round
157
+ * itself) applies to the persisted config, so they cannot disagree on
158
+ * what is runnable: null when a round may run, otherwise the result —
159
+ * absent is skipped/not_configured, a non-object failed/invalid_config, a
160
+ * truthy disabled skipped/disabled, a blank appKey failed/invalid_config.
161
+ */
162
+ @Nullable
163
+ static BundlePreparationResult configRejection(@Nullable String json) {
164
+ try {
165
+ String result = FlowBridge.runnableConfig(json);
166
+ if (result == null) {
167
+ return BundlePreparationResult.of(BundlePreparationResult.FAILED, "internal_error");
168
+ }
169
+ JSONObject verdict = new JSONObject(result);
170
+ return verdict.has("status")
171
+ ? BundlePreparationResult.of(verdict.getString("status"), verdict.getString("reason"))
172
+ : null;
173
+ } catch (JSONException e) {
174
+ return BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_config");
175
+ }
138
176
  }
139
177
 
140
178
  private SyncCoordinator() {
141
179
  }
142
180
 
143
181
  static void schedule(final UpdateContext context, final String launchRolledBackVersion) {
144
- if (UpdateContext.DEBUG) {
182
+ if (BuildConfig.DEBUG) {
145
183
  return;
146
184
  }
147
185
  if (!scheduled.compareAndSet(false, true)) {
@@ -155,60 +193,35 @@ final class SyncCoordinator {
155
193
  if (context.getKv(KEY_CONFIG) != null) {
156
194
  CrashHold.install();
157
195
  }
158
- Thread thread = new Thread(new Runnable() {
159
- @Override
160
- public void run() {
161
- try {
162
- // Keep the check away from the cold-start critical path
163
- // (§7 R5) — unless the previous process died mid-round,
164
- // in which case every launch second counts (§11.4).
165
- if (context.getKv(KEY_ROUND_INCOMPLETE) == null) {
166
- Thread.sleep(5000);
167
- }
168
- if (hasJsRound(context)) {
169
- // Not consuming the round: a later crash rescue may
170
- // still need it.
171
- Log.i(Texts.LOG_TAG,
172
- "native sync skipped: JS already queried in this process");
173
- return;
174
- }
175
- startRound(0);
176
- } catch (Throwable e) {
177
- // The rescue path must never take the app down with it.
178
- Log.w(Texts.LOG_TAG, "native sync failed: " + e);
196
+ Threads.startDaemon("pushy-native-sync", Thread.MIN_PRIORITY + 1, () -> {
197
+ try {
198
+ // Keep the check away from the cold-start critical path
199
+ // (§7 R5) — unless the previous process died mid-round,
200
+ // in which case every launch second counts (§11.4).
201
+ if (context.getKv(KEY_ROUND_INCOMPLETE) == null) {
202
+ Thread.sleep(5000);
203
+ }
204
+ if (hasJsRound(context)) {
205
+ // Not consuming the round: a later crash rescue may
206
+ // still need it.
207
+ Log.i(Texts.LOG_TAG,
208
+ "native sync skipped: JS already queried in this process");
209
+ return;
179
210
  }
211
+ startRound(0);
212
+ } catch (Throwable e) {
213
+ // The rescue path must never take the app down with it.
214
+ Log.w(Texts.LOG_TAG, "native sync failed: " + e);
180
215
  }
181
- }, "pushy-native-sync");
182
- thread.setPriority(Thread.MIN_PRIORITY + 1);
183
- thread.setDaemon(true);
184
- thread.start();
216
+ });
185
217
  }
186
218
 
187
219
  static boolean isRoundInFlight() {
188
220
  return roundStarted.get() && !roundCompleted;
189
221
  }
190
222
 
191
- /**
192
- * Runs the process's single round on the calling thread if nobody has
193
- * started it yet. deadlineNanos > 0 (crash rescue) caps every HTTP call
194
- * and download phase to the remaining budget.
195
- */
196
223
  private static boolean hasRunnableConfig(UpdateContext context) {
197
- if (context == null) {
198
- return false;
199
- }
200
- try {
201
- String json = context.getKv(KEY_CONFIG);
202
- if (json == null) {
203
- return false;
204
- }
205
- JSONObject config = new JSONObject(json);
206
- return !config.optBoolean("disabled", false)
207
- && config.opt("appKey") instanceof String
208
- && !config.getString("appKey").trim().isEmpty();
209
- } catch (JSONException e) {
210
- return false;
211
- }
224
+ return context != null && configRejection(context.getKv(KEY_CONFIG)) == null;
212
225
  }
213
226
 
214
227
  static void onConfigured(UpdateContext context) {
@@ -217,17 +230,27 @@ final class SyncCoordinator {
217
230
  }
218
231
  }
219
232
 
233
+ /**
234
+ * Runs the process's single round on the calling thread if nobody has
235
+ * started it yet. deadlineNanos > 0 (crash rescue) caps every HTTP call
236
+ * and download phase to the remaining budget.
237
+ */
220
238
  private static void startRound(long deadlineNanos) {
221
- // An automatic check before first-run provisioning must not consume
222
- // the process's only round. Hosts may configure later in this launch.
223
- if (!hasRunnableConfig(sContext)) {
224
- return;
225
- }
226
- if (!roundStarted.compareAndSet(false, true)) {
227
- return;
239
+ if (claimRound()) {
240
+ runClaimedRound(deadlineNanos);
228
241
  }
242
+ }
243
+
244
+ // Claims the process's only round. An automatic check before first-run
245
+ // provisioning must not consume it: hosts may configure later in this
246
+ // launch.
247
+ private static boolean claimRound() {
248
+ return hasRunnableConfig(sContext) && roundStarted.compareAndSet(false, true);
249
+ }
250
+
251
+ private static void runClaimedRound(long deadlineNanos) {
229
252
  try {
230
- runOnce(sContext, sLaunchRolledBackVersion, deadlineNanos);
253
+ runOnce(new DeviceRound(sContext, sLaunchRolledBackVersion), deadlineNanos);
231
254
  } catch (Throwable e) {
232
255
  Log.w(Texts.LOG_TAG, "native sync failed: " + e);
233
256
  roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "internal_error");
@@ -299,253 +322,349 @@ final class SyncCoordinator {
299
322
  }
300
323
  }
301
324
 
302
- private static void runOnce(
303
- UpdateContext context,
304
- String launchRolledBackVersion,
305
- long deadlineNanos
306
- ) throws JSONException {
307
- final long resetGeneration = UpdateContext.getResetGeneration();
308
- roundGeneration = resetGeneration;
309
- roundConfigGeneration = UpdateContext.getNativeConfigGeneration();
310
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "check_failed");
311
- String configJson = context.getKv(KEY_CONFIG);
312
- roundConfigJson = configJson;
313
- if (configJson == null || configJson.isEmpty()) {
314
- roundResult = BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "not_configured");
315
- return;
325
+ // The engine's clock: milliseconds on System.nanoTime, offset from this
326
+ // class's load so every value is positive (0 means "no deadline"). The
327
+ // nanoTime origin is arbitrary, so a hold deadline in nanos may be
328
+ // negative: only 0 means none on this side too.
329
+ private static final long CLOCK_ORIGIN_NANOS = System.nanoTime() - TimeUnit.SECONDS.toNanos(1);
330
+
331
+ static double engineMillis(long nanos) {
332
+ return (nanos - CLOCK_ORIGIN_NANOS) / 1e6;
333
+ }
334
+
335
+ static long engineNanos(double millis) {
336
+ return CLOCK_ORIGIN_NANOS + (long) (millis * 1e6);
337
+ }
338
+
339
+ /** A monotonic clock in nanoseconds (System.nanoTime on the device). */
340
+ interface Clock {
341
+ long nanoTime();
342
+ }
343
+
344
+ /**
345
+ * Everything a round does besides deciding: the engine step, the clock,
346
+ * the persisted state and the IO the engine's commands ask for.
347
+ * DeviceRound is the device's; the JVM tests replay the engine vectors
348
+ * through a scripted one (SyncRoundReplayTest).
349
+ */
350
+ interface RoundHost extends DownloadStarter, Clock {
351
+ /** FlowBridge.stepRound; null when the engine is unavailable. */
352
+ @Nullable
353
+ String stepRound(@Nullable String state, String event);
354
+
355
+ /** Whether a crash is being held right now (crashHoldActive). */
356
+ boolean crashHold();
357
+
358
+ long resetGeneration();
359
+
360
+ long configGeneration();
361
+
362
+ @Nullable
363
+ String getKv(String key);
364
+
365
+ void setKv(String key, String value);
366
+
367
+ void removeKv(String key);
368
+
369
+ /** This launch as the shared core sees it (native_round.h). */
370
+ JSONObject launchEnv() throws JSONException;
371
+
372
+ /** The response body; null when the request failed. */
373
+ @Nullable
374
+ String httpRequest(String url, @Nullable String postBody, long timeoutMs, long callTimeoutMs);
375
+
376
+ /** Wall-clock seconds, stamped on each response. */
377
+ double wallSeconds();
378
+
379
+ boolean hasCompletedVersion(String hash);
380
+
381
+ /** UpdateContext.commitSyncResult: whether the commit landed. */
382
+ boolean commitSyncResult(
383
+ long expectedGeneration, @Nullable String hash, @Nullable String hashInfoJson,
384
+ boolean activate, String responseCacheJson) throws Exception;
385
+ }
386
+
387
+ /** The round on the device: the JNI engine, UpdateContext, OkHttp. */
388
+ private static final class DeviceRound implements RoundHost {
389
+ private final UpdateContext context;
390
+ private final String launchRolledBackVersion;
391
+
392
+ DeviceRound(UpdateContext context, String launchRolledBackVersion) {
393
+ this.context = context;
394
+ this.launchRolledBackVersion = launchRolledBackVersion;
316
395
  }
317
- JSONObject config;
318
- try {
319
- config = new JSONObject(configJson);
320
- } catch (JSONException e) {
321
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_config");
322
- return;
396
+
397
+ @Override
398
+ public long nanoTime() {
399
+ return System.nanoTime();
323
400
  }
324
- if (config.optBoolean("disabled", false)) {
325
- roundResult = BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "disabled");
326
- return;
401
+
402
+ @Override
403
+ public String stepRound(String state, String event) {
404
+ return FlowBridge.stepRound(state, event);
327
405
  }
328
- String appKey = config.optString("appKey", "");
329
- if (appKey.isEmpty()) {
330
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_config");
331
- return;
406
+
407
+ @Override
408
+ public boolean crashHold() {
409
+ return crashHoldActive;
332
410
  }
333
- // Keep the existing interrupted-round breadcrumb and reset generation.
334
- try {
335
- context.setKv(KEY_ROUND_INCOMPLETE, "1");
336
- } catch (IllegalStateException ignored) {
411
+
412
+ @Override
413
+ public long resetGeneration() {
414
+ return UpdateContext.getResetGeneration();
337
415
  }
338
- try {
339
- runConfiguredRound(
340
- context, launchRolledBackVersion, deadlineNanos,
341
- resetGeneration, configJson, config, appKey);
342
- } finally {
343
- try {
344
- context.removeKv(KEY_ROUND_INCOMPLETE);
345
- } catch (IllegalStateException ignored) {
346
- }
416
+
417
+ @Override
418
+ public long configGeneration() {
419
+ return UpdateContext.getNativeConfigGeneration();
347
420
  }
348
- }
349
421
 
350
- private static void runConfiguredRound(
351
- UpdateContext context,
352
- String launchRolledBackVersion,
353
- long deadlineNanos,
354
- long resetGeneration,
355
- String configJson,
356
- JSONObject config,
357
- String appKey
358
- ) throws JSONException {
359
- String packageVersion = config.optString(
360
- "packageVersion", context.getPackageVersion());
361
- if (packageVersion.isEmpty()) {
362
- packageVersion = context.getPackageVersion();
422
+ @Override
423
+ public String getKv(String key) {
424
+ return context.getKv(key);
363
425
  }
364
426
 
365
- String currentVersion = context.getCurrentVersion();
366
- // Snapshot captured on the launch path before getConstants consumes
367
- // the one-shot rollback marker. Reading SharedPreferences here, five
368
- // seconds later, would lose the guard and could forceBoot the version
369
- // that this very launch just rolled back.
370
- String rolledBackVersion = launchRolledBackVersion;
371
- String uuid = context.getKv("uuid");
372
- if (uuid == null) {
373
- uuid = "";
374
- }
375
-
376
- JSONObject identity = new JSONObject();
377
- identity.put("packageVersion", packageVersion);
378
- identity.put(
379
- "currentVersion",
380
- currentVersion == null ? JSONObject.NULL : currentVersion
381
- );
382
- identity.put("uuid", uuid);
383
- if (rolledBackVersion != null) {
384
- identity.put("rolledBackVersion", rolledBackVersion);
385
- }
386
-
387
- JSONObject cInfo = new JSONObject();
388
- cInfo.put("rnu", config.optString("rnu", ""));
389
- cInfo.put("rn", config.optString("rn", ""));
390
- // React Native's Platform.Version is the Android SDK integer; use the
391
- // same value so this request can be fingerprinted against the JS one.
392
- cInfo.put("os", "android " + Build.VERSION.SDK_INT);
393
- cInfo.put("uuid", uuid);
394
-
395
- JSONObject input = new JSONObject();
396
- input.put("packageVersion", packageVersion);
397
- input.put(
398
- "currentVersion",
399
- currentVersion == null ? JSONObject.NULL : currentVersion
400
- );
401
- input.put("buildTime", context.getBuildTime());
402
- input.put("cInfo", cInfo);
403
- input.put("supportedDiffVersion", NativeCore.supportedDiffVersion());
404
- input.put("bundleHash", context.computeBundleHash());
405
-
406
- String body = FlowBridge.buildRequestBody(input.toString());
407
- if (body == null) {
408
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_request");
409
- return;
427
+ @Override
428
+ public void setKv(String key, String value) {
429
+ context.setKv(key, value);
410
430
  }
411
431
 
412
- String responseText = runQueryRequest(config, appKey, body, deadlineNanos);
413
- if (responseText == null) {
414
- Log.i(Texts.LOG_TAG,
415
- "native sync: no endpoint reachable, giving up until next launch");
416
- return;
432
+ @Override
433
+ public void removeKv(String key) {
434
+ context.removeKv(key);
417
435
  }
418
- // Cache freshness is anchored to when the server response arrived,
419
- // not to when a potentially long download/patch/activation finished.
420
- final long responseAtSeconds = System.currentTimeMillis() / 1000;
421
436
 
422
- String decisionJson = FlowBridge.handleResponse(
423
- responseText, identity.toString(), config.optString("afterDownload", ""));
424
- if (decisionJson == null) {
425
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_response");
426
- return;
437
+ @Override
438
+ public JSONObject launchEnv() throws JSONException {
439
+ return SyncCoordinator.launchEnv(context, launchRolledBackVersion);
427
440
  }
428
- JSONObject decision = new JSONObject(decisionJson);
429
- if (!"download".equals(decision.optString("action"))) {
430
- boolean committed = context.commitSyncResult(
431
- resetGeneration, null, null, false,
432
- buildResponseCacheJson(configJson, body, responseText, responseAtSeconds));
433
- roundResult = committed
434
- ? BundlePreparationResult.of(BundlePreparationResult.NO_UPDATE, decision.optString("reason"))
435
- : BundlePreparationResult.of(BundlePreparationResult.CANCELLED, "reset");
436
- Log.i(Texts.LOG_TAG,
437
- "native sync: nothing to do (" + decision.optString("reason") + ")");
438
- return;
441
+
442
+ @Override
443
+ public String httpRequest(String url, String postBody, long timeoutMs, long callTimeoutMs) {
444
+ return SyncCoordinator.httpRequest(url, postBody, timeoutMs, callTimeoutMs);
439
445
  }
440
- String hash = decision.optString("hash", "");
441
- if (!UpdateFileUtils.isSafePathComponent(hash)) {
442
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "invalid_response");
443
- return;
446
+
447
+ @Override
448
+ public double wallSeconds() {
449
+ return System.currentTimeMillis() / 1000.0;
444
450
  }
445
451
 
446
- boolean downloaded = context.hasCompletedVersion(hash);
447
- if (!downloaded) {
448
- downloaded = performAttempts(
449
- context, decision.optJSONArray("attempts"), hash, currentVersion,
450
- deadlineNanos);
451
- }
452
- if (!downloaded) {
453
- // The native attempt has finished, so JS may safely reuse the
454
- // response and retry through its own strategy chain.
455
- boolean committed = context.commitSyncResult(
456
- resetGeneration, null, null, false,
457
- buildResponseCacheJson(configJson, body, responseText, responseAtSeconds));
458
- roundResult = BundlePreparationResult.of(
459
- committed ? BundlePreparationResult.FAILED : BundlePreparationResult.CANCELLED,
460
- committed ? "download_failed" : "reset");
461
- return;
452
+ @Override
453
+ public boolean hasCompletedVersion(String hash) {
454
+ return context.hasCompletedVersion(hash);
462
455
  }
463
456
 
464
- // Version info (mirroring the JS side's setLocalHashInfo), the
465
- // activation and the response cache all land in one atomic commit —
466
- // see UpdateContext.commitSyncResult.
467
- String hashInfoJson = null;
468
- JSONObject info = decision.optJSONObject("info");
469
- if (info != null) {
470
- JSONObject hashInfo = new JSONObject();
471
- for (String key : new String[] {"name", "description", "metaInfo"}) {
472
- Object value = info.opt(key);
473
- if (value instanceof String) {
474
- hashInfo.put(key, value);
457
+ @Override
458
+ public boolean commitSyncResult(
459
+ long expectedGeneration, String hash, String hashInfoJson,
460
+ boolean activate, String responseCacheJson) {
461
+ return context.commitSyncResult(
462
+ expectedGeneration, hash, hashInfoJson, activate, responseCacheJson);
463
+ }
464
+
465
+ @Override
466
+ public DownloadTaskParams start(
467
+ String strategy, String url, String hash, String originHash,
468
+ UpdateContext.DownloadFileListener listener, long deadlineNanos) {
469
+ if ("diff".equals(strategy)) {
470
+ return context.downloadPatchFromPpk(url, hash, originHash, listener, deadlineNanos);
471
+ }
472
+ if ("pdiff".equals(strategy)) {
473
+ return context.downloadPatchFromApk(url, hash, listener, deadlineNanos);
474
+ }
475
+ return context.downloadFullUpdate(url, hash, listener, deadlineNanos);
476
+ }
477
+ }
478
+
479
+ /**
480
+ * The round itself is the shared engine's (cpp/update_flow_core
481
+ * round_engine.h, NATIVE_CHECKUPDATE_DESIGN §12): this drives it on the
482
+ * calling thread and runs what it asks for — the breadcrumb, the launch
483
+ * facts, the requests, the downloads and the commit.
484
+ */
485
+ static void runOnce(RoundHost host, long deadlineNanos) throws JSONException {
486
+ final long resetGeneration = host.resetGeneration();
487
+ final long configGeneration = host.configGeneration();
488
+ roundGeneration = resetGeneration;
489
+ roundConfigGeneration = configGeneration;
490
+ roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "check_failed");
491
+ String configJson = host.getKv(KEY_CONFIG);
492
+ roundConfigJson = configJson;
493
+
494
+ JSONObject event = new JSONObject()
495
+ .put("type", "start")
496
+ .put("config", configJson == null ? "" : configJson)
497
+ .put("resetGeneration", resetGeneration)
498
+ .put("configGeneration", configGeneration)
499
+ .put("sample", Math.random())
500
+ .put("deadline", deadlineNanos != 0 ? engineMillis(deadlineNanos) : 0);
501
+ String state = null;
502
+ boolean marked = false;
503
+ try {
504
+ while (true) {
505
+ event.put("now", engineMillis(host.nanoTime()))
506
+ .put("crashHold", host.crashHold());
507
+ String step = host.stepRound(state, event.toString());
508
+ if (step == null) {
509
+ roundResult = BundlePreparationResult.of(
510
+ BundlePreparationResult.FAILED, "internal_error");
511
+ return;
512
+ }
513
+ JSONObject result = new JSONObject(step);
514
+ state = result.getJSONObject("state").toString();
515
+ JSONArray commands = result.getJSONArray("commands");
516
+ event = new JSONObject();
517
+ for (int i = 0; i < commands.length(); i++) {
518
+ JSONObject command = commands.getJSONObject(i);
519
+ String type = command.getString("type");
520
+ if ("markIncomplete".equals(type)) {
521
+ marked = true;
522
+ try {
523
+ host.setKv(KEY_ROUND_INCOMPLETE, "1");
524
+ } catch (IllegalStateException ignored) {
525
+ }
526
+ } else if ("finish".equals(type)) {
527
+ finishRound(command, resetGeneration);
528
+ return;
529
+ } else {
530
+ event = perform(host, command, configGeneration);
531
+ }
475
532
  }
476
533
  }
477
- // A forceBoot activation is the brick-rescue path: mark it in the
478
- // persisted info so JS can report force_boot_rescue when this
479
- // version survives to markSuccess. Only the server-sent directive
480
- // counts — a silent-strategy activation is ordinary delivery.
481
- JSONObject infoConfig = info.optJSONObject("config");
482
- if (infoConfig != null && infoConfig.optBoolean("forceBoot", false)) {
483
- hashInfo.put(INFO_FORCE_BOOT, true);
534
+ } finally {
535
+ // A committed round already cleared the breadcrumb in its own
536
+ // commit (UpdateContext.commitSyncResult); only rounds that ended
537
+ // without committing need the extra write.
538
+ if (marked) {
539
+ try {
540
+ if (host.getKv(KEY_ROUND_INCOMPLETE) != null) {
541
+ host.removeKv(KEY_ROUND_INCOMPLETE);
542
+ }
543
+ } catch (IllegalStateException ignored) {
544
+ }
484
545
  }
485
- if (crashHoldActive) {
486
- hashInfo.put(INFO_CRASH_HOLD, true);
546
+ }
547
+ }
548
+
549
+ /** Runs one engine command and returns the event that answers it. */
550
+ private static JSONObject perform(RoundHost host, JSONObject command, long configGeneration)
551
+ throws JSONException {
552
+ String type = command.getString("type");
553
+ switch (type) {
554
+ case "collectEnv":
555
+ return new JSONObject()
556
+ .put("type", "env")
557
+ .put("env", host.launchEnv());
558
+ case "http": {
559
+ boolean post = command.optBoolean("post");
560
+ String text = host.httpRequest(
561
+ command.getString("url"),
562
+ post ? command.getString("body") : null,
563
+ (long) command.getDouble("timeoutMs"),
564
+ (long) command.getDouble("callTimeoutMs"));
565
+ JSONObject event = new JSONObject().put("type", "http");
566
+ if (text != null) {
567
+ event.put("text", text).put("at", host.wallSeconds());
568
+ }
569
+ return event;
487
570
  }
488
- hashInfoJson = hashInfo.toString();
489
- }
490
- // Silent strategies or a server-marked forceBoot version (per-version
491
- // remote override — the brick rescue) activate for the next launch;
492
- // otherwise activation stays with the JS side. Unless a crash is
493
- // being held: JS is dead, deferring to it would leave the fix on
494
- // disk forever (§11.3).
495
- boolean activate = decision.optBoolean("activate", false) || crashHoldActive;
496
- boolean committed;
571
+ case "checkInstalled":
572
+ return new JSONObject()
573
+ .put("type", "installed")
574
+ .put("installed", host.hasCompletedVersion(command.getString("hash")));
575
+ case "download":
576
+ return download(command, host, host);
577
+ case "commit":
578
+ return commit(host, command, configGeneration);
579
+ default:
580
+ // Unknown to this adapter: the engine finishes the round.
581
+ return new JSONObject().put("type", type);
582
+ }
583
+ }
584
+
585
+ // This launch as the shared core sees it (native_round.h). Absent values
586
+ // (null) are left out.
587
+ private static JSONObject launchEnv(UpdateContext context, String launchRolledBackVersion)
588
+ throws JSONException {
589
+ String currentVersion = context.getCurrentVersion();
590
+ JSONObject env = new JSONObject();
591
+ env.put("packageVersion", context.getPackageVersion());
592
+ // The JS constant's form, so JS can reuse the response cache.
593
+ env.put("currentVersion", currentVersion == null ? JSONObject.NULL : currentVersion);
594
+ env.put("uuid", context.getKv("uuid"));
595
+ // Snapshot captured on the launch path before getConstants consumes
596
+ // the one-shot rollback marker. Reading SharedPreferences here, five
597
+ // seconds later, would lose the guard and could forceBoot the version
598
+ // that this very launch just rolled back.
599
+ env.put("rolledBackVersion", launchRolledBackVersion);
600
+ env.put("buildTime", context.getBuildTime());
601
+ // React Native's Platform.Version is the Android SDK integer; use the
602
+ // same value so this request can be fingerprinted against the JS one.
603
+ env.put("os", "android " + Build.VERSION.SDK_INT);
604
+ env.put("bundleHash", context.computeBundleHash());
605
+ return env;
606
+ }
607
+
608
+ // Version info, the activation and the response cache land in one atomic
609
+ // commit (UpdateContext.commitSyncResult). A config change bumps the
610
+ // reset generation too, so the commit refuses either; the config
611
+ // generation tells the two apart.
612
+ private static JSONObject commit(RoundHost host, JSONObject command, long configGeneration)
613
+ throws JSONException {
614
+ String hash = command.getString("hash");
615
+ String hashInfo = command.getString("hashInfo");
616
+ JSONObject event = new JSONObject().put("type", "committed");
497
617
  try {
498
- committed = context.commitSyncResult(
499
- resetGeneration,
500
- hash,
501
- hashInfoJson,
502
- activate,
503
- buildResponseCacheJson(configJson, body, responseText, responseAtSeconds));
618
+ boolean committed = host.commitSyncResult(
619
+ (long) command.getDouble("resetGeneration"),
620
+ hash.isEmpty() ? null : hash,
621
+ hashInfo.isEmpty() ? null : hashInfo,
622
+ command.getBoolean("activate"),
623
+ command.getString("cache"));
624
+ event.put("ok", committed);
625
+ if (!committed && host.configGeneration() != configGeneration) {
626
+ event.put("reason", "config_changed");
627
+ }
504
628
  } catch (Exception e) {
505
629
  Log.w(Texts.LOG_TAG, "native sync: commit failed: " + e);
506
- roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "commit_failed");
630
+ event.put("error", true);
631
+ }
632
+ return event;
633
+ }
634
+
635
+ private static void finishRound(JSONObject finish, long resetGeneration) {
636
+ String status = finish.optString("status");
637
+ String reason = finish.optString("reason");
638
+ if (!BundlePreparationResult.DOWNLOADED.equals(status)) {
639
+ Log.i(Texts.LOG_TAG, "native sync: " + status + " (" + reason + ")");
640
+ roundResult = BundlePreparationResult.of(status, reason);
507
641
  return;
508
642
  }
509
- if (!committed) {
510
- Log.i(Texts.LOG_TAG, "native sync: reset during round, dropping result");
511
- } else if (activate) {
643
+ String hash = finish.optString("hash");
644
+ boolean activated = finish.optBoolean("activated");
645
+ if (activated) {
512
646
  unactivatedHash = null;
513
- Log.i(Texts.LOG_TAG,
514
- "native sync: downloaded " + hash + " and set for next launch");
647
+ Log.i(Texts.LOG_TAG, "native sync: downloaded " + hash + " and set for next launch");
515
648
  } else {
516
649
  // Remembered so a crash later in this process can still activate
517
650
  // it (activatePendingVersion) — JS never will.
518
651
  unactivatedGeneration = resetGeneration;
519
652
  unactivatedHash = hash;
520
- Log.i(Texts.LOG_TAG,
521
- "native sync: downloaded " + hash + ", activation left to JS");
653
+ Log.i(Texts.LOG_TAG, "native sync: downloaded " + hash + ", activation left to JS");
522
654
  }
523
- roundResult = committed
524
- ? BundlePreparationResult.downloaded(hash, activate)
525
- : BundlePreparationResult.of(BundlePreparationResult.CANCELLED, "reset");
526
- }
527
-
528
- private static String buildResponseCacheJson(
529
- String configJson,
530
- String requestBody,
531
- String responseText,
532
- long responseAtSeconds
533
- ) throws JSONException {
534
- JSONObject cacheEntry = new JSONObject();
535
- cacheEntry.put("ts", responseAtSeconds);
536
- cacheEntry.put("body", responseText);
537
- cacheEntry.put("request", requestBody);
538
- cacheEntry.put("config", configJson);
539
- return cacheEntry.toString();
655
+ roundResult = BundlePreparationResult.downloaded(hash, activated);
540
656
  }
541
657
 
542
- private static final OkHttpClient httpClient = new OkHttpClient.Builder()
658
+ private static final OkHttpClient httpClient = HttpClients.base().newBuilder()
543
659
  .connectTimeout(10, TimeUnit.SECONDS)
544
660
  .readTimeout(10, TimeUnit.SECONDS)
545
661
  .callTimeout(15, TimeUnit.SECONDS)
546
662
  .build();
547
663
 
548
- private static String httpRequest(String url, String postBody, long deadlineNanos) {
664
+ // The engine's per-request bounds, already capped by the round deadline.
665
+ private static String httpRequest(
666
+ String url, String postBody, long timeoutMs, long callTimeoutMs
667
+ ) {
549
668
  try {
550
669
  Request.Builder builder =
551
670
  new Request.Builder().url(url).header("Accept", "application/json");
@@ -553,25 +672,15 @@ final class SyncCoordinator {
553
672
  builder.post(RequestBody.create(
554
673
  postBody, MediaType.parse("application/json; charset=utf-8")));
555
674
  }
556
- OkHttpClient client = httpClient;
557
- if (deadlineNanos > 0) {
558
- // Crash-rescue budget: never let a single request outlive the
559
- // handler's hold window.
560
- long remainingMillis = TimeUnit.NANOSECONDS.toMillis(
561
- deadlineNanos - System.nanoTime());
562
- if (remainingMillis <= 0) {
563
- return null;
564
- }
565
- if (remainingMillis < 15000) {
566
- client = httpClient.newBuilder()
567
- .callTimeout(remainingMillis, TimeUnit.MILLISECONDS)
568
- .build();
569
- }
570
- }
675
+ OkHttpClient client = httpClient.newBuilder()
676
+ .connectTimeout(Math.max(1, timeoutMs), TimeUnit.MILLISECONDS)
677
+ .readTimeout(Math.max(1, timeoutMs), TimeUnit.MILLISECONDS)
678
+ .callTimeout(Math.max(1, callTimeoutMs), TimeUnit.MILLISECONDS)
679
+ .build();
571
680
  try (Response response = client.newCall(builder.build()).execute()) {
572
681
  // Same rule as the artifact download: an https endpoint that
573
682
  // redirects to plaintext http is a failed endpoint.
574
- DownloadTask.rejectProtocolDowngrade(url, response);
683
+ HttpClients.rejectProtocolDowngrade(url, response);
575
684
  ResponseBody body = response.body();
576
685
  if (!response.isSuccessful() || body == null) {
577
686
  return null;
@@ -609,205 +718,70 @@ final class SyncCoordinator {
609
718
  return source.readString(charset == null ? StandardCharsets.UTF_8 : charset);
610
719
  }
611
720
 
612
- // Shared schema rule (update_flow_core::IsValidResponse): a 200 with
613
- // `{"error": ...}` is a failed endpoint, not a verdict, and must not stop
614
- // the endpoint fallback.
615
- private static boolean isValidResponse(String responseText) {
616
- return responseText != null && FlowBridge.isValidResponse(responseText);
721
+ /** Queues one download attempt; null when it was rejected up front (the listener was told). */
722
+ interface DownloadStarter {
723
+ @Nullable
724
+ DownloadTaskParams start(
725
+ String strategy, String url, String hash, @Nullable String originHash,
726
+ UpdateContext.DownloadFileListener listener, long deadlineNanos);
617
727
  }
618
728
 
619
729
  /**
620
- * Sequential fallback over the ordered candidates (§5.1): one request at
621
- * a time with its own timeout; after the configured round fails,
622
- * queryUrls discovery merges remote candidates (excluding the
623
- * already-tried) for one more round. No hedged race on purpose — this
624
- * path is latency-insensitive.
730
+ * One download attempt the engine asked for, waited on up to its
731
+ * deadline: {"type": "download", ok, code?, timedOut?}.
625
732
  */
626
- private static String runQueryRequest(
627
- JSONObject config, String appKey, String body, long deadlineNanos
628
- ) {
629
- JSONArray endpoints = config.optJSONArray("endpoints");
630
- String orderedJson = FlowBridge.orderEndpointCandidates(
631
- endpoints == null ? "[]" : endpoints.toString(), Math.random());
632
- JSONArray ordered;
633
- try {
634
- ordered = orderedJson == null ? new JSONArray() : new JSONArray(orderedJson);
635
- } catch (JSONException e) {
636
- return null;
637
- }
638
- HashSet<String> tried = new HashSet<>();
639
- int httpAttempts = 0;
640
- for (int i = 0; i < ordered.length(); i++) {
641
- String base = HttpUtils.normalizeEndpointBase(ordered.optString(i, ""));
642
- if (base.isEmpty() || !tried.add(base)) {
643
- continue;
644
- }
645
- if (httpAttempts++ >= MAX_QUERY_HTTP_ATTEMPTS) {
646
- return null;
647
- }
648
- String response = httpRequest(
649
- base + HttpUtils.QUERY_PATH + appKey, body, deadlineNanos);
650
- if (isValidResponse(response)) {
651
- return response;
652
- }
653
- }
654
- JSONArray queryUrls = config.optJSONArray("queryUrls");
655
- if (queryUrls == null) {
656
- return null;
657
- }
658
- for (int i = 0; i < queryUrls.length(); i++) {
659
- String listUrl = queryUrls.optString(i, "");
660
- if (listUrl.isEmpty()) {
661
- continue;
662
- }
663
- if (httpAttempts++ >= MAX_QUERY_HTTP_ATTEMPTS) {
664
- return null;
665
- }
666
- String listText = httpRequest(listUrl, null, deadlineNanos);
667
- if (listText == null) {
668
- continue;
669
- }
670
- JSONArray remote;
671
- try {
672
- remote = new JSONArray(listText);
673
- } catch (JSONException e) {
674
- continue;
675
- }
676
- for (int j = 0; j < remote.length(); j++) {
677
- String base = HttpUtils.normalizeEndpointBase(remote.optString(j, ""));
678
- if (base.isEmpty() || tried.contains(base)) {
679
- continue;
680
- }
681
- if (httpAttempts++ >= MAX_QUERY_HTTP_ATTEMPTS) {
682
- return null;
683
- }
684
- tried.add(base);
685
- String response = httpRequest(
686
- base + HttpUtils.QUERY_PATH + appKey, body, deadlineNanos);
687
- if (isValidResponse(response)) {
688
- return response;
689
- }
690
- }
691
- // One successfully fetched remote list is enough.
692
- break;
693
- }
694
- return null;
695
- }
696
-
697
- private static long capToHoldBudget(long phaseDeadlineNanos, long holdDeadlineNanos) {
698
- if (holdDeadlineNanos <= 0) {
699
- return phaseDeadlineNanos;
700
- }
701
- return Math.min(phaseDeadlineNanos, holdDeadlineNanos);
733
+ static JSONObject download(JSONObject command, DownloadStarter starter) throws JSONException {
734
+ return download(command, starter, System::nanoTime);
702
735
  }
703
736
 
704
- private static boolean performAttempts(
705
- UpdateContext context, JSONArray attempts, String hash, String originHash,
706
- long holdDeadlineNanos
707
- ) {
708
- if (attempts == null) {
709
- return false;
710
- }
711
- final long incrementalDeadlineNanos = capToHoldBudget(
712
- System.nanoTime() + TimeUnit.SECONDS.toNanos(DOWNLOAD_PHASE_TIMEOUT_SECONDS),
713
- holdDeadlineNanos);
714
- long fullDeadlineNanos = 0;
715
- for (int i = 0; i < attempts.length(); i++) {
716
- JSONObject attempt = attempts.optJSONObject(i);
717
- if (attempt == null) {
718
- continue;
719
- }
720
- String type = attempt.optString("type");
721
- if ("diff".equals(type) && (originHash == null || originHash.isEmpty())) {
722
- // diff patches from the running version; none is running.
723
- continue;
724
- }
725
- final boolean isFullAttempt = !"diff".equals(type) && !"pdiff".equals(type);
726
- if (isFullAttempt && fullDeadlineNanos == 0) {
727
- // Incremental failures must not consume the last-resort full
728
- // download's budget. Each phase gets one bounded 10min window.
729
- fullDeadlineNanos = capToHoldBudget(
730
- System.nanoTime()
731
- + TimeUnit.SECONDS.toNanos(DOWNLOAD_PHASE_TIMEOUT_SECONDS),
732
- holdDeadlineNanos);
733
- }
734
- final long deadlineNanos = isFullAttempt
735
- ? fullDeadlineNanos : incrementalDeadlineNanos;
736
- JSONArray urls = attempt.optJSONArray("urls");
737
- if (urls == null) {
738
- continue;
737
+ static JSONObject download(JSONObject command, DownloadStarter starter, Clock clock)
738
+ throws JSONException {
739
+ final String strategy = command.getString("strategy");
740
+ final long deadlineNanos = engineNanos(command.getDouble("deadline"));
741
+ final CountDownLatch latch = new CountDownLatch(1);
742
+ final AtomicBoolean succeeded = new AtomicBoolean(false);
743
+ final AtomicReference<Throwable> failure = new AtomicReference<>();
744
+ UpdateContext.DownloadFileListener listener = new UpdateContext.DownloadFileListener() {
745
+ @Override
746
+ public void onDownloadCompleted(DownloadTaskParams params) {
747
+ succeeded.set(true);
748
+ latch.countDown();
739
749
  }
740
- for (int j = 0; j < urls.length(); j++) {
741
- String url = urls.optString(j, "");
742
- if (url.isEmpty()) {
743
- continue;
744
- }
745
- // Check before enqueueing: once the phase budget is gone we
746
- // must not launch an orphan download that outlives the round.
747
- long remainingNanos = deadlineNanos - System.nanoTime();
748
- if (remainingNanos <= 0) {
749
- if (isFullAttempt) {
750
- return false;
751
- }
752
- break;
753
- }
754
- final CountDownLatch latch = new CountDownLatch(1);
755
- final AtomicBoolean succeeded = new AtomicBoolean(false);
756
- final String attemptType = type;
757
- UpdateContext.DownloadFileListener listener =
758
- new UpdateContext.DownloadFileListener() {
759
- @Override
760
- public void onDownloadCompleted(DownloadTaskParams params) {
761
- succeeded.set(true);
762
- latch.countDown();
763
- }
764
750
 
765
- @Override
766
- public void onDownloadFailed(Throwable error) {
767
- Log.i(Texts.LOG_TAG, "native sync: " + attemptType
768
- + " attempt failed: " + error);
769
- latch.countDown();
770
- }
771
- };
772
- DownloadTaskParams task;
773
- if ("diff".equals(type)) {
774
- task = context.downloadPatchFromPpk(
775
- url, hash, originHash, listener, deadlineNanos);
776
- } else if ("pdiff".equals(type)) {
777
- task = context.downloadPatchFromApk(
778
- url, hash, listener, deadlineNanos);
779
- } else {
780
- task = context.downloadFullUpdate(
781
- url, hash, listener, deadlineNanos);
782
- }
783
- try {
784
- if (!latch.await(remainingNanos, TimeUnit.NANOSECONDS)) {
785
- Log.w(Texts.LOG_TAG,
786
- "native sync: download phase timed out during " + type);
787
- // The task shares one download thread with the next
788
- // attempt: cancel its transfer (or keep it from
789
- // starting) instead of queueing behind it
790
- // (CODE_AUDIT 2.12).
791
- if (task != null) {
792
- task.cancel();
793
- }
794
- if (isFullAttempt) {
795
- return false;
796
- }
797
- break;
798
- }
799
- } catch (InterruptedException e) {
800
- Thread.currentThread().interrupt();
801
- if (task != null) {
802
- task.cancel();
803
- }
804
- return false;
805
- }
806
- if (succeeded.get()) {
807
- return true;
808
- }
751
+ @Override
752
+ public void onDownloadFailed(Throwable error) {
753
+ Log.i(Texts.LOG_TAG, "native sync: " + strategy + " attempt failed: " + error);
754
+ failure.set(error);
755
+ latch.countDown();
809
756
  }
757
+ };
758
+ DownloadTaskParams task = starter.start(
759
+ strategy, command.getString("url"), command.getString("hash"),
760
+ command.has("originHash") ? command.getString("originHash") : null,
761
+ listener, deadlineNanos);
762
+ JSONObject event = new JSONObject().put("type", "download");
763
+ boolean settled;
764
+ try {
765
+ settled = latch.await(deadlineNanos - clock.nanoTime(), TimeUnit.NANOSECONDS);
766
+ } catch (InterruptedException e) {
767
+ Thread.currentThread().interrupt();
768
+ settled = false;
769
+ }
770
+ if (!settled) {
771
+ Log.w(Texts.LOG_TAG, "native sync: download phase timed out during " + strategy);
772
+ // The task shares one download thread with the next attempt:
773
+ // cancel its transfer (or keep it from starting) instead of
774
+ // queueing behind it (CODE_AUDIT 2.12).
775
+ if (task != null) {
776
+ task.cancel();
777
+ }
778
+ return event.put("timedOut", true);
779
+ }
780
+ event.put("ok", succeeded.get());
781
+ Throwable error = failure.get();
782
+ if (error != null) {
783
+ event.put("code", ErrorCodes.forDownloadFailure(error));
810
784
  }
811
- return false;
785
+ return event;
812
786
  }
813
787
  }