@amazon-devices/expo-image 2.0.9000000001 → 3.0.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 (92) hide show
  1. package/CMakeLists.txt +80 -58
  2. package/README.kepler.md +1 -0
  3. package/build/ExpoImageModules.kepler.d.ts.map +1 -1
  4. package/build/ExpoImageModules.kepler.js +1 -1
  5. package/build/ExpoImageModules.kepler.js.map +1 -1
  6. package/build/ImageViewNativeComponent.js +1 -1
  7. package/build/ImageViewNativeComponent.js.map +1 -1
  8. package/kepler/AutoLinkInit.cpp +17 -0
  9. package/kepler/Constants.h +21 -0
  10. package/kepler/ExpoImage/ExpoImageTurboModule.cpp +148 -0
  11. package/kepler/ExpoImage/ExpoImageTurboModule.h +41 -0
  12. package/kepler/ExpoImage/PrefetchListener.cpp +45 -0
  13. package/kepler/ExpoImage/PrefetchListener.h +40 -0
  14. package/kepler/ExpoImageComponent/AccessibilityDelegate.cpp +33 -0
  15. package/kepler/ExpoImageComponent/AccessibilityDelegate.h +30 -0
  16. package/kepler/ExpoImageComponent/ExpoImageComponentViewManager.cpp +132 -0
  17. package/kepler/ExpoImageComponent/ExpoImageComponentViewManager.h +66 -0
  18. package/kepler/ExpoImageComponent/ExpoImageStore.h +102 -0
  19. package/kepler/ExpoImageComponent/ExpoImageView.cpp +556 -0
  20. package/kepler/ExpoImageComponent/ExpoImageView.h +186 -0
  21. package/kepler/ExpoImageComponent/HashImageDecoder.cpp +91 -0
  22. package/kepler/ExpoImageComponent/HashImageDecoder.h +18 -0
  23. package/kepler/ExpoImageComponent/ImageLoadListeners.cpp +73 -0
  24. package/kepler/ExpoImageComponent/ImageLoadListeners.h +52 -0
  25. package/kepler/ExpoImageComponent/TransitionAnimator.cpp +113 -0
  26. package/kepler/ExpoImageComponent/TransitionAnimator.h +32 -0
  27. package/kepler/ImageSourceInfo.h +21 -0
  28. package/kepler/ViewManagerFactory.cpp +36 -0
  29. package/kepler/ViewManagerFactory.h +29 -0
  30. package/kepler/blurhash/common.h +11 -10
  31. package/kepler/blurhash/decode.cpp +26 -16
  32. package/kepler/contentposition/ImageContentPosition.cpp +50 -69
  33. package/kepler/contentposition/ImageContentPosition.h +36 -26
  34. package/kepler/enums/ImageContentFit.h +47 -15
  35. package/kepler/enums/ImagePriority.h +12 -13
  36. package/kepler/test/blurhash/decode.cpp +36 -27
  37. package/kepler/test/contentposition/ImageContentPosition.cpp +70 -76
  38. package/kepler/test/thumbhash/decode.cpp +18 -10
  39. package/kepler/test/utils/Base64.cpp +73 -0
  40. package/kepler/test/utils/ColorUtils.cpp +53 -0
  41. package/kepler/test/utils/SourceSelection.cpp +87 -0
  42. package/kepler/thumbhash/decode.cpp +7 -16
  43. package/kepler/utils/Base64.cpp +85 -0
  44. package/kepler/utils/Base64.h +36 -0
  45. package/kepler/utils/ColorUtils.h +26 -0
  46. package/kepler/utils/SourceSelection.cpp +80 -0
  47. package/kepler/utils/SourceSelection.h +65 -0
  48. package/lib/aarch64-release/com.amazon.kepler.uitoolkit.react.expoimageapp.so +0 -0
  49. package/lib/aarch64-release/libexpo-image-3.so +0 -0
  50. package/lib/armv7-release/com.amazon.kepler.uitoolkit.react.expoimageapp.so +0 -0
  51. package/lib/armv7-release/libexpo-image-3.so +0 -0
  52. package/lib/x86_64-release/com.amazon.kepler.uitoolkit.react.expoimageapp.so +0 -0
  53. package/lib/x86_64-release/libexpo-image-3.so +0 -0
  54. package/package.json +1 -1
  55. package/react-native.config.js +12 -5
  56. package/src/ExpoImageModules.kepler.ts +1 -1
  57. package/src/ImageViewNativeComponent.ts +1 -1
  58. package/kepler/ExpoImage.cpp +0 -63
  59. package/kepler/ExpoImage.h +0 -29
  60. package/kepler/ExpoImageCacheHandler.cpp +0 -15
  61. package/kepler/ExpoImageCacheHandler.h +0 -28
  62. package/kepler/ExpoImageComponent.cpp +0 -579
  63. package/kepler/ExpoImageComponent.h +0 -199
  64. package/kepler/ImageWrapper/BlurhashImageWrapper.cpp +0 -37
  65. package/kepler/ImageWrapper/BlurhashImageWrapper.h +0 -23
  66. package/kepler/ImageWrapper/CacheImageWrapper.cpp +0 -80
  67. package/kepler/ImageWrapper/CacheImageWrapper.h +0 -41
  68. package/kepler/ImageWrapper/HashImageWrapper.cpp +0 -21
  69. package/kepler/ImageWrapper/HashImageWrapper.h +0 -22
  70. package/kepler/ImageWrapper/ImageWrapper.cpp +0 -24
  71. package/kepler/ImageWrapper/ImageWrapper.h +0 -33
  72. package/kepler/ImageWrapper/LocalImageWrapper.cpp +0 -61
  73. package/kepler/ImageWrapper/LocalImageWrapper.h +0 -30
  74. package/kepler/ImageWrapper/ThumbhashImageWrapper.cpp +0 -33
  75. package/kepler/ImageWrapper/ThumbhashImageWrapper.h +0 -20
  76. package/kepler/KeplerImageViewComponent.h +0 -64
  77. package/kepler/KeplerInit.cpp +0 -35
  78. package/kepler/managers/ExpoImageManager.cpp +0 -38
  79. package/kepler/managers/ExpoImageManager.h +0 -23
  80. package/kepler/test/ExpoImage.cpp +0 -73
  81. package/kepler/test/ExpoImageComponent.cpp +0 -304
  82. package/kepler/test/managers/ExpoImageManager.cpp +0 -39
  83. package/kepler/test/utils/LoaderDelegate.cpp +0 -130
  84. package/kepler/utils/PlaceholderImageLoaderDelegate.cpp +0 -26
  85. package/kepler/utils/PlaceholderImageLoaderDelegate.h +0 -26
  86. package/kepler/utils/PrefetchImageLoaderDelegate.cpp +0 -55
  87. package/kepler/utils/PrefetchImageLoaderDelegate.h +0 -35
  88. package/kepler/utils/SourceImageLoaderDelegate.cpp +0 -47
  89. package/kepler/utils/SourceImageLoaderDelegate.h +0 -42
  90. package/kepler/utils/SourceImageLoaderDelegateEmitter.cpp +0 -15
  91. package/kepler/utils/SourceImageLoaderDelegateEmitter.h +0 -28
  92. package/kepler-compatibility.json +0 -7
package/CMakeLists.txt CHANGED
@@ -11,81 +11,103 @@
11
11
  # IMPLIED, OR STATUTORY, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
12
12
  # FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
13
13
  #
14
- set(PACKAGE_NAME "expo-image")
15
- set(AUTO_LINK_PACKAGE_NAME "${PACKAGE_NAME}-${KEPLER_REACT_NATIVE_MAJOR_VERSION}")
16
- set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/kepler)
17
- set(SOURCES_KEPLER
18
- kepler/ExpoImage.cpp
19
- kepler/ExpoImageCacheHandler.cpp
20
- kepler/ExpoImageComponent.cpp
21
-
22
- kepler/utils/PlaceholderImageLoaderDelegate.cpp
23
- kepler/utils/PrefetchImageLoaderDelegate.cpp
24
- kepler/utils/SourceImageLoaderDelegate.cpp
25
- kepler/utils/SourceImageLoaderDelegateEmitter.cpp
26
14
 
27
- kepler/contentposition/ImageContentPosition.cpp
15
+ cmake_minimum_required(VERSION 3.22)
28
16
 
29
- kepler/blurhash/decode.cpp
17
+ set(EXPO_IMAGE_MAJOR_VERSION 3)
18
+ set(EXPO_IMAGE_MINOR_VERSION 0)
19
+ set(EXPO_IMAGE_VERSION "${EXPO_IMAGE_MAJOR_VERSION}.${EXPO_IMAGE_MINOR_VERSION}")
30
20
 
31
- kepler/thumbhash/decode.cpp
21
+ set(PACKAGE_NAME expo-image)
22
+ set(AUTO_LINK_PACKAGE_NAME ${PACKAGE_NAME}-${EXPO_IMAGE_MAJOR_VERSION})
32
23
 
33
- kepler/ImageWrapper/BlurhashImageWrapper.cpp
34
- kepler/ImageWrapper/CacheImageWrapper.cpp
35
- kepler/ImageWrapper/HashImageWrapper.cpp
36
- kepler/ImageWrapper/ImageWrapper.cpp
37
- kepler/ImageWrapper/LocalImageWrapper.cpp
38
- kepler/ImageWrapper/ThumbhashImageWrapper.cpp
24
+ find_package(Apmf REQUIRED)
25
+ find_package(Kepler REQUIRED)
26
+ find_package(turbomoduleAPI CONFIG REQUIRED)
39
27
 
40
- kepler/managers/ExpoImageManager.cpp
28
+ kepler_add_idl_import_library(
29
+ expo_image_idl
30
+ PACKAGES
31
+ com.amazon.kepler.uitoolkit.view
32
+ com.amazon.kepler.uitoolkit.react
33
+ com.amazon.kepler.uitoolkit.graphics
41
34
  )
42
35
 
43
- set(KEPLER_INIT kepler/KeplerInit.cpp)
44
-
45
- find_library (MBED_CRYPTO NAMES mbedcrypto REQUIRED)
46
-
47
- add_library(${PACKAGE_NAME} STATIC ${SOURCES_KEPLER})
48
-
36
+ set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/kepler)
49
37
 
50
- target_include_directories(
51
- ${PACKAGE_NAME}
52
- PUBLIC
53
- ${SRC_DIR}
38
+ set(HEADERS
39
+ ${SRC_DIR}/Constants.h
40
+ ${SRC_DIR}/ImageSourceInfo.h
41
+ ${SRC_DIR}/enums/ImageContentFit.h
42
+ ${SRC_DIR}/enums/ImagePriority.h
43
+ ${SRC_DIR}/contentposition/ImageContentPosition.h
44
+ ${SRC_DIR}/utils/ColorUtils.h
45
+ ${SRC_DIR}/utils/SourceSelection.h
46
+ ${SRC_DIR}/utils/Base64.h
47
+ ${SRC_DIR}/ExpoImage/ExpoImageTurboModule.h
48
+ ${SRC_DIR}/ExpoImage/PrefetchListener.h
49
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageComponentViewManager.h
50
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageView.h
51
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageStore.h
52
+ ${SRC_DIR}/ExpoImageComponent/HashImageDecoder.h
53
+ ${SRC_DIR}/ExpoImageComponent/ImageLoadListeners.h
54
+ ${SRC_DIR}/ExpoImageComponent/TransitionAnimator.h
55
+ ${SRC_DIR}/ExpoImageComponent/AccessibilityDelegate.h
56
+ ${SRC_DIR}/ViewManagerFactory.h
54
57
  )
55
58
 
56
- target_link_libraries(
57
- ${PACKAGE_NAME}
58
- PUBLIC
59
- keplerui::keplerscript-${KEPLER_REACT_NATIVE_MAJOR_VERSION}
60
- ${MBED_CRYPTO}
59
+ set(SOURCES
60
+ ${SRC_DIR}/AutoLinkInit.cpp
61
+ ${SRC_DIR}/ViewManagerFactory.cpp
62
+ ${SRC_DIR}/contentposition/ImageContentPosition.cpp
63
+ ${SRC_DIR}/ExpoImage/ExpoImageTurboModule.cpp
64
+ ${SRC_DIR}/ExpoImage/PrefetchListener.cpp
65
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageComponentViewManager.cpp
66
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageView.cpp
67
+ ${SRC_DIR}/ExpoImageComponent/HashImageDecoder.cpp
68
+ ${SRC_DIR}/ExpoImageComponent/ImageLoadListeners.cpp
69
+ ${SRC_DIR}/ExpoImageComponent/TransitionAnimator.cpp
70
+ ${SRC_DIR}/ExpoImageComponent/AccessibilityDelegate.cpp
71
+ ${SRC_DIR}/utils/SourceSelection.cpp
72
+ ${SRC_DIR}/utils/Base64.cpp
73
+ ${SRC_DIR}/blurhash/decode.cpp
74
+ ${SRC_DIR}/thumbhash/decode.cpp
61
75
  )
62
76
 
63
- target_compile_options(
64
- ${PACKAGE_NAME}
65
- PRIVATE
66
- -fpermissive
77
+ set(LIBRARIES
78
+ turbomoduleAPI::turbomoduleAPI
67
79
  )
68
80
 
69
- add_library(${AUTO_LINK_PACKAGE_NAME} SHARED ${KEPLER_INIT} ${SOURCES_KEPLER})
70
81
 
71
- set_target_properties(${AUTO_LINK_PACKAGE_NAME} PROPERTIES SOVERSION ${KEPLER_REACT_NATIVE_MAJOR_VERSION}.${KEPLER_REACT_NATIVE_MINOR_VERSION})
82
+ kepler_add_library(${AUTO_LINK_PACKAGE_NAME} SHARED ${HEADERS} ${SOURCES})
72
83
 
73
- target_link_libraries(
74
- ${AUTO_LINK_PACKAGE_NAME}
75
- PRIVATE
76
- ${PACKAGE_NAME}
77
- )
84
+ target_include_directories(${AUTO_LINK_PACKAGE_NAME} PRIVATE ${SRC_DIR})
78
85
 
79
- # Helps in checking undefined references
80
- add_executable(${AUTO_LINK_PACKAGE_NAME}_exe ${KEPLER_INIT} ${SOURCES_KEPLER})
81
- target_link_libraries(${AUTO_LINK_PACKAGE_NAME}_exe
82
- PRIVATE
83
- ${AUTO_LINK_PACKAGE_NAME}
84
- keplerui::keplerscript-${KEPLER_REACT_NATIVE_MAJOR_VERSION}
85
- ${MBED_CRYPTO}
86
+ target_link_libraries(${AUTO_LINK_PACKAGE_NAME} PRIVATE expo_image_idl ${LIBRARIES})
87
+
88
+ kepler_install_components(${AUTO_LINK_PACKAGE_NAME} IN_PROCESS "/com.amazon.kepler.uitoolkit.react.expoimageapp")
89
+
90
+ set(component_name "com.amazon.kepler.uitoolkit.react.expoimageapp.so")
91
+ add_custom_command(
92
+ TARGET ${AUTO_LINK_PACKAGE_NAME}
93
+ POST_BUILD
94
+ COMMAND ${CMAKE_COMMAND}
95
+ ARGS -E copy $<TARGET_FILE:${AUTO_LINK_PACKAGE_NAME}> ${CMAKE_INSTALL_LIBDIR}/${component_name}
86
96
  )
87
- target_include_directories(${AUTO_LINK_PACKAGE_NAME}_exe PRIVATE ${SRC_DIR})
88
97
 
89
- install(TARGETS ${AUTO_LINK_PACKAGE_NAME}
90
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
98
+ install(TARGETS ${AUTO_LINK_PACKAGE_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
99
+
100
+ # Create a dummy main for link-time symbol checking
101
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/main_stub.cpp "int main() { return 0; }")
102
+
103
+ # Helps in checking undefined references at build time
104
+ add_executable(${AUTO_LINK_PACKAGE_NAME}_exe
105
+ ${CMAKE_CURRENT_BINARY_DIR}/main_stub.cpp
106
+ ${SOURCES}
91
107
  )
108
+ target_include_directories(${AUTO_LINK_PACKAGE_NAME}_exe PRIVATE ${SRC_DIR})
109
+ target_link_libraries(${AUTO_LINK_PACKAGE_NAME}_exe
110
+ PRIVATE
111
+ expo_image_idl
112
+ ${LIBRARIES}
113
+ )
package/README.kepler.md CHANGED
@@ -121,3 +121,4 @@ Check out the dedicated documentation page for info about this library, API refe
121
121
  | Package version | Based on | @amazon-devices/react-native-kepler version |
122
122
  | ---------------- | -------- | --------------------------------- |
123
123
  | 2.0.x | expo-image v1.6.0 | 2.0.x |
124
+ | 2.0.x | expo-image v1.6.0 | 4.0.x+rn0.83.0 |
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoImageModules.kepler.d.ts","sourceRoot":"","sources":["../src/ExpoImageModules.kepler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAsB,MAAM,oCAAoC,CAAC;AAI1F,KAAK,IAAI,GAAG,iBAAiB,CAAC;AAC9B,eAAO,MAAM,eAAe,0GAAqB,CAAC;AAClD,eAAO,MAAM,eAAe,EAA0D,IAAI,CAAC"}
1
+ {"version":3,"file":"ExpoImageModules.kepler.d.ts","sourceRoot":"","sources":["../src/ExpoImageModules.kepler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAsB,MAAM,oCAAoC,CAAC;AAI1F,KAAK,IAAI,GAAG,iBAAiB,CAAC;AAC9B,eAAO,MAAM,eAAe,0GAAqB,CAAC;AAClD,eAAO,MAAM,eAAe,EAA+D,IAAI,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { TurboModuleRegistry } from '@amazon-devices/keplerscript-turbomodule-api';
2
2
  import ExpoImageComponent from './ImageViewNativeComponent';
3
3
  export const NativeExpoImage = ExpoImageComponent;
4
- export const ExpoImageModule = TurboModuleRegistry.getEnforcing('ExpoImage');
4
+ export const ExpoImageModule = TurboModuleRegistry.getEnforcing('ExpoImageAppTM');
5
5
  //# sourceMappingURL=ExpoImageModules.kepler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoImageModules.kepler.js","sourceRoot":"","sources":["../src/ExpoImageModules.kepler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,mBAAmB,EAAC,MAAM,oCAAoC,CAAC;AAE1F,OAAO,kBAAkB,MAAM,4BAA4B,CAAC;AAG5D,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,CAAO,WAAW,CAAS,CAAC","sourcesContent":["import {KeplerTurboModule, TurboModuleRegistry} from '@amazon-devices/keplerscript-turbomodule-api';\n\nimport ExpoImageComponent from './ImageViewNativeComponent';\n\ntype Spec = KeplerTurboModule;\nexport const NativeExpoImage = ExpoImageComponent;\nexport const ExpoImageModule = TurboModuleRegistry.getEnforcing<Spec>('ExpoImage') as Spec;\n"]}
1
+ {"version":3,"file":"ExpoImageModules.kepler.js","sourceRoot":"","sources":["../src/ExpoImageModules.kepler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,mBAAmB,EAAC,MAAM,oCAAoC,CAAC;AAE1F,OAAO,kBAAkB,MAAM,4BAA4B,CAAC;AAG5D,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,CAAO,gBAAgB,CAAS,CAAC","sourcesContent":["import {KeplerTurboModule, TurboModuleRegistry} from '@amazon-devices/keplerscript-turbomodule-api';\n\nimport ExpoImageComponent from './ImageViewNativeComponent';\n\ntype Spec = KeplerTurboModule;\nexport const NativeExpoImage = ExpoImageComponent;\nexport const ExpoImageModule = TurboModuleRegistry.getEnforcing<Spec>('ExpoImageAppTM') as Spec;\n"]}
@@ -8,7 +8,7 @@
8
8
  * @format
9
9
  */
10
10
  import registerNativeComponent from './fabric/registerNativeComponent';
11
- const ImageViewNativeComponent = registerNativeComponent('ExpoImageComponent', {
11
+ const ImageViewNativeComponent = registerNativeComponent('ExpoImageAppComponent', {
12
12
  validAttributes: {
13
13
  placeholder: true,
14
14
  pointerEvents: true,
@@ -1 +1 @@
1
- {"version":3,"file":"ImageViewNativeComponent.js","sourceRoot":"","sources":["../src/ImageViewNativeComponent.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,uBAAuB,MAAM,kCAAkC,CAAC;AAevE,MAAM,wBAAwB,GAAG,uBAAuB,CAAgC,oBAAoB,EAAE;IAC5G,eAAe,EAAE;QACf,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,IAAI;QACZ,qBAAqB,EAAE,IAAI;QAC3B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,sBAAsB,EAAE,IAAI;QAC5B,YAAY,EAAE,IAAI;QAClB,GAAG,EAAE,IAAI;QACT,kBAAkB,EAAE,IAAI;QACxB,yBAAyB,EAAE,IAAI;QAC/B,gBAAgB,EAAE,IAAI;KACvB;CACF,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC","sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow strict-local\n * @format\n */\n\nimport { NativeSyntheticEvent, ProcessedColorValue } from 'react-native';\n\nimport registerNativeComponent from './fabric/registerNativeComponent';\nimport {\n ImageNativeProps,\n ImageErrorEventData,\n ImageLoadEventData,\n ImageProgressEventData,\n} from './Image.types';\n\nexport type ImageViewNativeComponentProps = Omit<ImageNativeProps, 'tintColor' | 'onLoad' | 'onError' | 'onProgress'> & {\n tintColor: ProcessedColorValue | null | undefined;\n onLoad: (event: NativeSyntheticEvent<ImageLoadEventData>) => void;\n onError: (event: NativeSyntheticEvent<ImageErrorEventData>) => void;\n onProgress: (event: NativeSyntheticEvent<ImageProgressEventData>) => void;\n};\n\nconst ImageViewNativeComponent = registerNativeComponent<ImageViewNativeComponentProps>('ExpoImageComponent', {\n validAttributes: {\n placeholder: true,\n pointerEvents: true,\n resizeMode: true,\n contentFit: true,\n contentPosition: true,\n source: true,\n placeholderContentFit: true,\n transition: true,\n blurRadius: true,\n tintColor: true,\n priority: true,\n cachePolicy: true,\n responsivePolicy: true,\n recyclingKey: true,\n onLoadStart: true,\n onLoad: true,\n onProgress: true,\n onError: true,\n onLoadEnd: true,\n defaultSource: true,\n loadingIndicatorSource: true,\n fadeDuration: true,\n alt: true,\n accessibilityLabel: true,\n enableLiveTextInteraction: true,\n allowDownscaling: true,\n },\n});\n\nexport default ImageViewNativeComponent;\n"]}
1
+ {"version":3,"file":"ImageViewNativeComponent.js","sourceRoot":"","sources":["../src/ImageViewNativeComponent.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,uBAAuB,MAAM,kCAAkC,CAAC;AAevE,MAAM,wBAAwB,GAAG,uBAAuB,CAAgC,uBAAuB,EAAE;IAC/G,eAAe,EAAE;QACf,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,IAAI;QACZ,qBAAqB,EAAE,IAAI;QAC3B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,sBAAsB,EAAE,IAAI;QAC5B,YAAY,EAAE,IAAI;QAClB,GAAG,EAAE,IAAI;QACT,kBAAkB,EAAE,IAAI;QACxB,yBAAyB,EAAE,IAAI;QAC/B,gBAAgB,EAAE,IAAI;KACvB;CACF,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC","sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow strict-local\n * @format\n */\n\nimport { NativeSyntheticEvent, ProcessedColorValue } from 'react-native';\n\nimport registerNativeComponent from './fabric/registerNativeComponent';\nimport {\n ImageNativeProps,\n ImageErrorEventData,\n ImageLoadEventData,\n ImageProgressEventData,\n} from './Image.types';\n\nexport type ImageViewNativeComponentProps = Omit<ImageNativeProps, 'tintColor' | 'onLoad' | 'onError' | 'onProgress'> & {\n tintColor: ProcessedColorValue | null | undefined;\n onLoad: (event: NativeSyntheticEvent<ImageLoadEventData>) => void;\n onError: (event: NativeSyntheticEvent<ImageErrorEventData>) => void;\n onProgress: (event: NativeSyntheticEvent<ImageProgressEventData>) => void;\n};\n\nconst ImageViewNativeComponent = registerNativeComponent<ImageViewNativeComponentProps>('ExpoImageAppComponent', {\n validAttributes: {\n placeholder: true,\n pointerEvents: true,\n resizeMode: true,\n contentFit: true,\n contentPosition: true,\n source: true,\n placeholderContentFit: true,\n transition: true,\n blurRadius: true,\n tintColor: true,\n priority: true,\n cachePolicy: true,\n responsivePolicy: true,\n recyclingKey: true,\n onLoadStart: true,\n onLoad: true,\n onProgress: true,\n onError: true,\n onLoadEnd: true,\n defaultSource: true,\n loadingIndicatorSource: true,\n fadeDuration: true,\n alt: true,\n accessibilityLabel: true,\n enableLiveTextInteraction: true,\n allowDownscaling: true,\n },\n});\n\nexport default ImageViewNativeComponent;\n"]}
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Copyright (c) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ *
4
+ * PROPRIETARY/CONFIDENTIAL
5
+ *
6
+ * Use is subject to license terms.
7
+ */
8
+
9
+ #include <Kepler/turbomodule/KeplerTurboModuleRegistration.h>
10
+
11
+ #include "ExpoImage/ExpoImageTurboModule.h"
12
+
13
+ extern "C" {
14
+ __attribute__((visibility("default"))) void autoLinkKeplerTurboModulesV1() noexcept {
15
+ KEPLER_REGISTER_TURBO_MODULE_WITH_NAME("ExpoImageAppTM", expoimage, ExpoImageTurboModule);
16
+ }
17
+ }
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ *
4
+ * PROPRIETARY/CONFIDENTIAL
5
+ *
6
+ * Use is subject to license terms.
7
+ */
8
+
9
+ #pragma once
10
+
11
+ #include <string_view>
12
+
13
+ namespace expoimage {
14
+
15
+ constexpr std::string_view kUri{"uri"};
16
+ constexpr std::string_view kWidth{"width"};
17
+ constexpr std::string_view kHeight{"height"};
18
+ constexpr std::string_view kPriority{"priority"};
19
+ constexpr std::string_view kCache{"cache"};
20
+
21
+ } // namespace expoimage
@@ -0,0 +1,148 @@
1
+ #include "ExpoImageTurboModule.h"
2
+ #include "PrefetchListener.h"
3
+ #include "../ExpoImageComponent/ExpoImageStore.h"
4
+
5
+ #include <apmf/fn.h>
6
+ #include <apmf/iface/com/amazon/apmf/InvalidArgumentError.h>
7
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/graphics/IGraphicsModule.h>
8
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/graphics/ITask.h>
9
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/CacheType.h>
10
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IImageOptionsBuilder.h>
11
+ #include <apmf/log.h>
12
+ #include <apmf/process.h>
13
+
14
+ namespace expoimage {
15
+
16
+ using apmf::iface::com::amazon::kepler::uitoolkit::graphics::IGraphicsModule;
17
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::CacheType;
18
+
19
+ APMF_DEFINE_LOGGER(ExpoImageTMLogger, "com.amazon.kepler.uitoolkit.react.expoimage.tm");
20
+ using namespace apmf::log_levels;
21
+
22
+ ExpoImageTurboModule::ExpoImageTurboModule() : KeplerTurboModule("ExpoImage") {
23
+ viewModule_ = apmf::GetProcessObject()
24
+ ->getComponent("/com.amazon.kepler.uitoolkit.view")
25
+ .TryQueryInterface<IViewModule>();
26
+ if (!viewModule_) {
27
+ throw apmf::InvalidArgumentError("ExpoImage: failed to acquire IViewModule");
28
+ }
29
+ cacheManager_ = viewModule_->getImageCacheManager();
30
+ imageLoader_ = viewModule_->makeImageLoader();
31
+ if (!imageLoader_) {
32
+ APMF_LOG(ExpoImageTMLogger, WARNING)
33
+ << "ExpoImage: IViewModule::makeImageLoader() returned null; "
34
+ "prefetch will resolve(false)";
35
+ }
36
+ if (!cacheManager_) {
37
+ APMF_LOG(ExpoImageTMLogger, WARNING)
38
+ << "ExpoImage: IViewModule::getImageCacheManager() returned null; "
39
+ "clearMemoryCache / clearDiskCache will resolve(false)";
40
+ }
41
+
42
+ auto graphicsComponent = apmf::GetProcessObject()
43
+ ->getComponent("/com.amazon.kepler.uitoolkit.graphics");
44
+ if (graphicsComponent) {
45
+ auto graphicsModule = graphicsComponent.TryQueryInterface<IGraphicsModule>();
46
+ if (graphicsModule) {
47
+ uiRunLoop_ = graphicsModule->tryGetUIRunLoop();
48
+ if (!uiRunLoop_) {
49
+ APMF_LOG(ExpoImageTMLogger, WARNING)
50
+ << "ExpoImage: IGraphicsModule::tryGetUIRunLoop() returned null; "
51
+ "clearMemoryCache / clearDiskCache will resolve(false)";
52
+ }
53
+ } else {
54
+ APMF_LOG(ExpoImageTMLogger, WARNING)
55
+ << "ExpoImage: failed to query IGraphicsModule from "
56
+ "/com.amazon.kepler.uitoolkit.graphics; clearMemoryCache / "
57
+ "clearDiskCache will resolve(false)";
58
+ }
59
+ } else {
60
+ APMF_LOG(ExpoImageTMLogger, WARNING)
61
+ << "ExpoImage: /com.amazon.kepler.uitoolkit.graphics component is not "
62
+ "available; clearMemoryCache / clearDiskCache will resolve(false)";
63
+ }
64
+ }
65
+
66
+ void ExpoImageTurboModule::aggregateMethods(
67
+ MethodAggregator<KeplerTurboModule>& methodAggregator) const noexcept {
68
+ methodAggregator.addMethod("prefetch", 1, &ExpoImageTurboModule::prefetch);
69
+ methodAggregator.addMethod("clearMemoryCache", 0, &ExpoImageTurboModule::clearMemoryCache);
70
+ methodAggregator.addMethod("clearDiskCache", 0, &ExpoImageTurboModule::clearDiskCache);
71
+ }
72
+
73
+ Promise ExpoImageTurboModule::prefetch(std::vector<std::string> urls) {
74
+ APMF_LOG(ExpoImageTMLogger, DEBUG)
75
+ << "ExpoImageTurboModule::prefetch: count=" << urls.size();
76
+ return Promise([vm = viewModule_, loader = imageLoader_, urls = std::move(urls)](std::shared_ptr<Promise> promise) {
77
+ if (urls.empty()) {
78
+ promise->resolve(true);
79
+ return;
80
+ }
81
+ if (!loader) {
82
+ promise->resolve(false);
83
+ return;
84
+ }
85
+ auto listener = Ptr<PrefetchListener>::Make(urls.size(), [promise](bool success) {
86
+ promise->resolve(success);
87
+ });
88
+ auto options = vm->makeImageOptionsBuilder()->build();
89
+ for (const auto& url : urls) {
90
+ APMF_LOG(ExpoImageTMLogger, DEBUG)
91
+ << "ExpoImageTurboModule::prefetch: url=" << url;
92
+ loader->prefetch(url, listener, options);
93
+ }
94
+ });
95
+ }
96
+
97
+ Promise ExpoImageTurboModule::clearMemoryCache() {
98
+ APMF_LOG(ExpoImageTMLogger, DEBUG) << "ExpoImageTurboModule::clearMemoryCache";
99
+ return Promise([cm = cacheManager_, runLoop = uiRunLoop_](std::shared_ptr<Promise> promise) {
100
+ if (!runLoop || !cm) {
101
+ APMF_LOG(ExpoImageTMLogger, WARNING)
102
+ << "ExpoImageTurboModule::clearMemoryCache: "
103
+ << (!runLoop ? "uiRunLoop_" : "cacheManager_")
104
+ << " is null (graphics module / view module unavailable at init); "
105
+ "resolving false";
106
+ promise->resolve(false);
107
+ return;
108
+ }
109
+ runLoop->scheduleTask(
110
+ apmf::Fn([cm, promise](apmf::method::execute) {
111
+ cm->clear(CacheType::MEMORY);
112
+ // also drop the expo-image decoded-image cache
113
+ // (the process-wide ExpoImageStore), which the framework
114
+ // IImageCacheManager does not know about. Safe here: this task
115
+ // runs on uiRunLoop_ and the store is UI-thread-owned.
116
+ expoimage::sharedExpoImageStore()->clear();
117
+ promise->resolve(true);
118
+ }),
119
+ nullptr,
120
+ nullptr,
121
+ false);
122
+ });
123
+ }
124
+
125
+ Promise ExpoImageTurboModule::clearDiskCache() {
126
+ APMF_LOG(ExpoImageTMLogger, DEBUG) << "ExpoImageTurboModule::clearDiskCache";
127
+ return Promise([cm = cacheManager_, runLoop = uiRunLoop_](std::shared_ptr<Promise> promise) {
128
+ if (!runLoop || !cm) {
129
+ APMF_LOG(ExpoImageTMLogger, WARNING)
130
+ << "ExpoImageTurboModule::clearDiskCache: "
131
+ << (!runLoop ? "uiRunLoop_" : "cacheManager_")
132
+ << " is null (graphics module / view module unavailable at init); "
133
+ "resolving false";
134
+ promise->resolve(false);
135
+ return;
136
+ }
137
+ runLoop->scheduleTask(
138
+ apmf::Fn([cm, promise](apmf::method::execute) {
139
+ cm->clear(CacheType::PERSISTENT);
140
+ promise->resolve(true);
141
+ }),
142
+ nullptr,
143
+ nullptr,
144
+ false);
145
+ });
146
+ }
147
+
148
+ } // namespace expoimage
@@ -0,0 +1,41 @@
1
+ #pragma once
2
+
3
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/graphics/IRunLoop.h>
4
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IImageCacheManager.h>
5
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IImageLoader.h>
6
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IViewModule.h>
7
+ #include <apmf/ptr.h>
8
+ #include <Kepler/turbomodule/JSValue.h>
9
+ #include <Kepler/turbomodule/KeplerTurboModule.h>
10
+ #include <Kepler/turbomodule/Promise.h>
11
+
12
+ namespace expoimage {
13
+
14
+ using apmf::Ptr;
15
+ using com::amazon::kepler::turbomodule::JSArray;
16
+ using com::amazon::kepler::turbomodule::JSObject;
17
+ using com::amazon::kepler::turbomodule::KeplerTurboModule;
18
+ using com::amazon::kepler::turbomodule::MethodAggregator;
19
+ using com::amazon::kepler::turbomodule::Promise;
20
+ using apmf::iface::com::amazon::kepler::uitoolkit::graphics::IRunLoop;
21
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::IImageCacheManager;
22
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::IImageLoader;
23
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::IViewModule;
24
+
25
+ class ExpoImageTurboModule : public KeplerTurboModule {
26
+ public:
27
+ ExpoImageTurboModule();
28
+ void aggregateMethods(MethodAggregator<KeplerTurboModule>& methodAggregator) const noexcept override;
29
+
30
+ Promise prefetch(std::vector<std::string> urls);
31
+ Promise clearMemoryCache();
32
+ Promise clearDiskCache();
33
+
34
+ private:
35
+ Ptr<IViewModule> viewModule_;
36
+ Ptr<IImageCacheManager> cacheManager_;
37
+ Ptr<IImageLoader> imageLoader_;
38
+ Ptr<IRunLoop> uiRunLoop_;
39
+ };
40
+
41
+ } // namespace expoimage
@@ -0,0 +1,45 @@
1
+ #include "PrefetchListener.h"
2
+
3
+ #include <apmf/log.h>
4
+
5
+ namespace expoimage {
6
+
7
+ APMF_DEFINE_LOGGER(PrefetchListenerLogger,
8
+ "com.amazon.kepler.uitoolkit.react.expoimage.prefetch");
9
+ using namespace apmf::log_levels;
10
+
11
+ PrefetchListener::PrefetchListener(size_t total, std::function<void(bool)> onFinish)
12
+ : total_(total), onFinish_(std::move(onFinish)) {}
13
+
14
+ void PrefetchListener::onStart(View<IImageLoadRequest>) {}
15
+ void PrefetchListener::onProgress(View<IImageLoadRequest>, float) {}
16
+
17
+ void PrefetchListener::onSuccess(View<IImageLoadRequest>, View<IImage>) {
18
+ // No counting — onPrefetchComplete handles prefetch completion.
19
+ // Both may fire for a single prefetch; counting here would double-count.
20
+ }
21
+
22
+ void PrefetchListener::onFailure(View<IImageLoadRequest>, ImageLoadError const& error) {
23
+ APMF_LOG(PrefetchListenerLogger, WARNING)
24
+ << "PrefetchListener::onFailure: prefetch failed; resolving false";
25
+ if (!resolved_.exchange(true)) {
26
+ onFinish_(false);
27
+ }
28
+ }
29
+
30
+ void PrefetchListener::onCanceled(View<IImageLoadRequest>) {
31
+ APMF_LOG(PrefetchListenerLogger, DEBUG)
32
+ << "PrefetchListener::onCanceled: prefetch canceled; resolving false";
33
+ if (!resolved_.exchange(true)) {
34
+ onFinish_(false);
35
+ }
36
+ }
37
+
38
+ void PrefetchListener::onPrefetchComplete(View<IImageLoadRequest>) {
39
+ APMF_LOG(PrefetchListenerLogger, DEBUG) << "PrefetchListener::onPrefetchComplete";
40
+ if (++loaded_ == total_ && !resolved_.exchange(true)) {
41
+ onFinish_(true);
42
+ }
43
+ }
44
+
45
+ } // namespace expoimage
@@ -0,0 +1,40 @@
1
+ #pragma once
2
+
3
+ #include <apmf/apmf_base.h>
4
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IImage.h>
5
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IImageLoadListener.h>
6
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IImageLoadRequest.h>
7
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/ImageLoadError.h>
8
+ #include <apmf/log.h>
9
+ #include <apmf/ptr.h>
10
+
11
+ #include <atomic>
12
+ #include <functional>
13
+
14
+ namespace expoimage {
15
+
16
+ using apmf::ApmfBase;
17
+ using apmf::View;
18
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::IImage;
19
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::IImageLoadListener;
20
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::IImageLoadRequest;
21
+ using apmf::iface::com::amazon::kepler::uitoolkit::view::ImageLoadError;
22
+
23
+ struct PrefetchListener : ApmfBase<PrefetchListener, IImageLoadListener> {
24
+ public:
25
+ PrefetchListener(size_t total, std::function<void(bool)> onFinish);
26
+ void onStart(View<IImageLoadRequest> request);
27
+ void onProgress(View<IImageLoadRequest> request, float progress);
28
+ void onSuccess(View<IImageLoadRequest> request, View<IImage> image);
29
+ void onFailure(View<IImageLoadRequest> request, ImageLoadError const& error);
30
+ void onCanceled(View<IImageLoadRequest> request);
31
+ void onPrefetchComplete(View<IImageLoadRequest> request);
32
+
33
+ private:
34
+ std::atomic<size_t> loaded_{0};
35
+ size_t total_;
36
+ std::atomic<bool> resolved_{false};
37
+ std::function<void(bool)> onFinish_;
38
+ };
39
+
40
+ } // namespace expoimage
@@ -0,0 +1,33 @@
1
+ #include "AccessibilityDelegate.h"
2
+
3
+ #include <apmf/iface/com/amazon/kepler/ucc/v1_0/common/Role.h>
4
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IHiddenTraitBuilder.h>
5
+
6
+ namespace expoimage {
7
+
8
+ namespace ucc = apmf::iface::com::amazon::kepler::ucc::v1_0::common;
9
+
10
+ void ExpoImageAccessibilityDelegate::build(
11
+ apmf::View<uiview::IAccessibilityContext> context,
12
+ apmf::View<uiview::IAccessibilityDelegate> defaultDelegate) {
13
+ if (!accessible_) {
14
+ context->setTrait(context->makeHiddenTraitBuilder()->build());
15
+ return;
16
+ }
17
+
18
+ if (defaultDelegate) defaultDelegate->build(context, nullptr);
19
+
20
+ context->setRole(ucc::Role::IMAGE);
21
+
22
+ if (!description_.empty()) {
23
+ context->setDescription(description_);
24
+ }
25
+ }
26
+
27
+ void ExpoImageAccessibilityDelegate::clear(
28
+ apmf::View<uiview::IAccessibilityContext> context,
29
+ apmf::View<uiview::IAccessibilityDelegate> defaultDelegate) {
30
+ if (defaultDelegate) defaultDelegate->clear(context, nullptr);
31
+ }
32
+
33
+ } // namespace expoimage
@@ -0,0 +1,30 @@
1
+ #pragma once
2
+
3
+ #include <apmf/apmf_base.h>
4
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IAccessibilityContext.h>
5
+ #include <apmf/iface/com/amazon/kepler/uitoolkit/view/IAccessibilityDelegate.h>
6
+ #include <apmf/ptr.h>
7
+
8
+ #include <string>
9
+
10
+ namespace expoimage {
11
+
12
+ using apmf::ApmfBase;
13
+ namespace uiview = apmf::iface::com::amazon::kepler::uitoolkit::view;
14
+
15
+ struct ExpoImageAccessibilityDelegate
16
+ : ApmfBase<ExpoImageAccessibilityDelegate, uiview::IAccessibilityDelegate> {
17
+ void build(apmf::View<uiview::IAccessibilityContext> context,
18
+ apmf::View<uiview::IAccessibilityDelegate> defaultDelegate);
19
+ void clear(apmf::View<uiview::IAccessibilityContext> context,
20
+ apmf::View<uiview::IAccessibilityDelegate> defaultDelegate);
21
+
22
+ void setDescription(const std::string& text) { description_ = text; }
23
+ void setAccessible(bool accessible) { accessible_ = accessible; }
24
+
25
+ private:
26
+ std::string description_;
27
+ bool accessible_{true};
28
+ };
29
+
30
+ } // namespace expoimage