@amazon-devices/expo-image 2.0.9000000000 → 2.0.9000000002

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 (76) hide show
  1. package/CMakeLists.txt +83 -57
  2. package/README.kepler.md +1 -0
  3. package/kepler/AutoLinkInit.cpp +17 -0
  4. package/kepler/Constants.h +21 -0
  5. package/kepler/ExpoImage/ExpoImageTurboModule.cpp +148 -0
  6. package/kepler/ExpoImage/ExpoImageTurboModule.h +41 -0
  7. package/kepler/ExpoImage/PrefetchListener.cpp +45 -0
  8. package/kepler/ExpoImage/PrefetchListener.h +40 -0
  9. package/kepler/ExpoImageComponent/AccessibilityDelegate.cpp +33 -0
  10. package/kepler/ExpoImageComponent/AccessibilityDelegate.h +30 -0
  11. package/kepler/ExpoImageComponent/ExpoImageComponentViewManager.cpp +132 -0
  12. package/kepler/ExpoImageComponent/ExpoImageComponentViewManager.h +66 -0
  13. package/kepler/ExpoImageComponent/ExpoImageStore.h +102 -0
  14. package/kepler/ExpoImageComponent/ExpoImageView.cpp +556 -0
  15. package/kepler/ExpoImageComponent/ExpoImageView.h +186 -0
  16. package/kepler/ExpoImageComponent/HashImageDecoder.cpp +91 -0
  17. package/kepler/ExpoImageComponent/HashImageDecoder.h +18 -0
  18. package/kepler/ExpoImageComponent/ImageLoadListeners.cpp +73 -0
  19. package/kepler/ExpoImageComponent/ImageLoadListeners.h +52 -0
  20. package/kepler/ExpoImageComponent/TransitionAnimator.cpp +113 -0
  21. package/kepler/ExpoImageComponent/TransitionAnimator.h +32 -0
  22. package/kepler/ImageSourceInfo.h +21 -0
  23. package/kepler/ViewManagerFactory.cpp +36 -0
  24. package/kepler/ViewManagerFactory.h +29 -0
  25. package/kepler/blurhash/common.h +11 -10
  26. package/kepler/blurhash/decode.cpp +26 -16
  27. package/kepler/contentposition/ImageContentPosition.cpp +50 -69
  28. package/kepler/contentposition/ImageContentPosition.h +36 -26
  29. package/kepler/enums/ImageContentFit.h +47 -15
  30. package/kepler/enums/ImagePriority.h +12 -13
  31. package/kepler/test/blurhash/decode.cpp +36 -27
  32. package/kepler/test/contentposition/ImageContentPosition.cpp +70 -76
  33. package/kepler/test/thumbhash/decode.cpp +18 -10
  34. package/kepler/test/utils/ColorUtils.cpp +53 -0
  35. package/kepler/test/utils/SourceSelection.cpp +87 -0
  36. package/kepler/thumbhash/decode.cpp +0 -1
  37. package/kepler/utils/ColorUtils.h +26 -0
  38. package/kepler/utils/SourceSelection.cpp +80 -0
  39. package/kepler/utils/SourceSelection.h +65 -0
  40. package/kepler-compatibility.json +4 -2
  41. package/package.json +1 -1
  42. package/react-native.config.js +11 -2
  43. package/kepler/ExpoImage.cpp +0 -63
  44. package/kepler/ExpoImage.h +0 -29
  45. package/kepler/ExpoImageCacheHandler.cpp +0 -15
  46. package/kepler/ExpoImageCacheHandler.h +0 -28
  47. package/kepler/ExpoImageComponent.cpp +0 -579
  48. package/kepler/ExpoImageComponent.h +0 -199
  49. package/kepler/ImageWrapper/BlurhashImageWrapper.cpp +0 -37
  50. package/kepler/ImageWrapper/BlurhashImageWrapper.h +0 -23
  51. package/kepler/ImageWrapper/CacheImageWrapper.cpp +0 -80
  52. package/kepler/ImageWrapper/CacheImageWrapper.h +0 -41
  53. package/kepler/ImageWrapper/HashImageWrapper.cpp +0 -21
  54. package/kepler/ImageWrapper/HashImageWrapper.h +0 -22
  55. package/kepler/ImageWrapper/ImageWrapper.cpp +0 -24
  56. package/kepler/ImageWrapper/ImageWrapper.h +0 -33
  57. package/kepler/ImageWrapper/LocalImageWrapper.cpp +0 -61
  58. package/kepler/ImageWrapper/LocalImageWrapper.h +0 -30
  59. package/kepler/ImageWrapper/ThumbhashImageWrapper.cpp +0 -33
  60. package/kepler/ImageWrapper/ThumbhashImageWrapper.h +0 -20
  61. package/kepler/KeplerImageViewComponent.h +0 -64
  62. package/kepler/KeplerInit.cpp +0 -35
  63. package/kepler/managers/ExpoImageManager.cpp +0 -38
  64. package/kepler/managers/ExpoImageManager.h +0 -23
  65. package/kepler/test/ExpoImage.cpp +0 -73
  66. package/kepler/test/ExpoImageComponent.cpp +0 -304
  67. package/kepler/test/managers/ExpoImageManager.cpp +0 -39
  68. package/kepler/test/utils/LoaderDelegate.cpp +0 -130
  69. package/kepler/utils/PlaceholderImageLoaderDelegate.cpp +0 -26
  70. package/kepler/utils/PlaceholderImageLoaderDelegate.h +0 -26
  71. package/kepler/utils/PrefetchImageLoaderDelegate.cpp +0 -55
  72. package/kepler/utils/PrefetchImageLoaderDelegate.h +0 -35
  73. package/kepler/utils/SourceImageLoaderDelegate.cpp +0 -47
  74. package/kepler/utils/SourceImageLoaderDelegate.h +0 -42
  75. package/kepler/utils/SourceImageLoaderDelegateEmitter.cpp +0 -15
  76. package/kepler/utils/SourceImageLoaderDelegateEmitter.h +0 -28
package/CMakeLists.txt CHANGED
@@ -11,81 +11,107 @@
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 2)
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)
36
+ set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/kepler)
44
37
 
45
- find_library (MBED_CRYPTO NAMES mbedcrypto REQUIRED)
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}/ExpoImage/ExpoImageTurboModule.h
47
+ ${SRC_DIR}/ExpoImage/PrefetchListener.h
48
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageComponentViewManager.h
49
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageView.h
50
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageStore.h
51
+ ${SRC_DIR}/ExpoImageComponent/HashImageDecoder.h
52
+ ${SRC_DIR}/ExpoImageComponent/ImageLoadListeners.h
53
+ ${SRC_DIR}/ExpoImageComponent/TransitionAnimator.h
54
+ ${SRC_DIR}/ExpoImageComponent/AccessibilityDelegate.h
55
+ ${SRC_DIR}/ViewManagerFactory.h
56
+ )
46
57
 
47
- add_library(${PACKAGE_NAME} STATIC ${SOURCES_KEPLER})
58
+ set(SOURCES
59
+ ${SRC_DIR}/AutoLinkInit.cpp
60
+ ${SRC_DIR}/ViewManagerFactory.cpp
61
+ ${SRC_DIR}/contentposition/ImageContentPosition.cpp
62
+ ${SRC_DIR}/ExpoImage/ExpoImageTurboModule.cpp
63
+ ${SRC_DIR}/ExpoImage/PrefetchListener.cpp
64
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageComponentViewManager.cpp
65
+ ${SRC_DIR}/ExpoImageComponent/ExpoImageView.cpp
66
+ ${SRC_DIR}/ExpoImageComponent/HashImageDecoder.cpp
67
+ ${SRC_DIR}/ExpoImageComponent/ImageLoadListeners.cpp
68
+ ${SRC_DIR}/ExpoImageComponent/TransitionAnimator.cpp
69
+ ${SRC_DIR}/ExpoImageComponent/AccessibilityDelegate.cpp
70
+ ${SRC_DIR}/utils/SourceSelection.cpp
71
+ ${SRC_DIR}/blurhash/decode.cpp
72
+ ${SRC_DIR}/thumbhash/decode.cpp
73
+ )
48
74
 
75
+ find_library(MBED_CRYPTO NAMES mbedcrypto REQUIRED)
49
76
 
50
- target_include_directories(
51
- ${PACKAGE_NAME}
52
- PUBLIC
53
- ${SRC_DIR}
77
+ set(LIBRARIES
78
+ turbomoduleAPI::turbomoduleAPI
79
+ ${MBED_CRYPTO}
54
80
  )
55
81
 
56
- target_link_libraries(
57
- ${PACKAGE_NAME}
58
- PUBLIC
59
- keplerui::keplerscript-${KEPLER_REACT_NATIVE_MAJOR_VERSION}
60
- ${MBED_CRYPTO}
61
- )
62
82
 
63
- target_compile_options(
64
- ${PACKAGE_NAME}
65
- PRIVATE
66
- -fpermissive
67
- )
83
+ kepler_add_library(${AUTO_LINK_PACKAGE_NAME} SHARED ${HEADERS} ${SOURCES})
68
84
 
69
- add_library(${AUTO_LINK_PACKAGE_NAME} SHARED ${KEPLER_INIT} ${SOURCES_KEPLER})
85
+ set_target_properties(${AUTO_LINK_PACKAGE_NAME} PROPERTIES
86
+ SOVERSION ${EXPO_IMAGE_MAJOR_VERSION}.${EXPO_IMAGE_MINOR_VERSION})
70
87
 
71
- set_target_properties(${AUTO_LINK_PACKAGE_NAME} PROPERTIES SOVERSION ${KEPLER_REACT_NATIVE_MAJOR_VERSION}.${KEPLER_REACT_NATIVE_MINOR_VERSION})
88
+ target_include_directories(${AUTO_LINK_PACKAGE_NAME} PRIVATE ${SRC_DIR})
72
89
 
73
- target_link_libraries(
74
- ${AUTO_LINK_PACKAGE_NAME}
75
- PRIVATE
76
- ${PACKAGE_NAME}
77
- )
90
+ target_link_libraries(${AUTO_LINK_PACKAGE_NAME} PRIVATE expo_image_idl ${LIBRARIES})
78
91
 
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}
92
+ kepler_install_components(${AUTO_LINK_PACKAGE_NAME} IN_PROCESS "/com.amazon.kepler.uitoolkit.react.expoimage")
93
+
94
+ set(component_name "com.amazon.kepler.uitoolkit.react.expoimage.so")
95
+ add_custom_command(
96
+ TARGET ${AUTO_LINK_PACKAGE_NAME}
97
+ POST_BUILD
98
+ COMMAND ${CMAKE_COMMAND}
99
+ ARGS -E copy $<TARGET_FILE:${AUTO_LINK_PACKAGE_NAME}> ${CMAKE_INSTALL_LIBDIR}/${component_name}
86
100
  )
87
- target_include_directories(${AUTO_LINK_PACKAGE_NAME}_exe PRIVATE ${SRC_DIR})
88
101
 
89
- install(TARGETS ${AUTO_LINK_PACKAGE_NAME}
90
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
102
+ install(TARGETS ${AUTO_LINK_PACKAGE_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
103
+
104
+ # Create a dummy main for link-time symbol checking
105
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/main_stub.cpp "int main() { return 0; }")
106
+
107
+ # Helps in checking undefined references at build time
108
+ add_executable(${AUTO_LINK_PACKAGE_NAME}_exe
109
+ ${CMAKE_CURRENT_BINARY_DIR}/main_stub.cpp
110
+ ${SOURCES}
91
111
  )
112
+ target_include_directories(${AUTO_LINK_PACKAGE_NAME}_exe PRIVATE ${SRC_DIR})
113
+ target_link_libraries(${AUTO_LINK_PACKAGE_NAME}_exe
114
+ PRIVATE
115
+ expo_image_idl
116
+ ${LIBRARIES}
117
+ )
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 |
@@ -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("ExpoImage", 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