react-native-attachment-kit 1.0.2 → 1.0.5
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.
- package/CHANGELOG.md +111 -0
- package/README.md +356 -213
- package/android/build.gradle +3 -0
- package/android/src/main/libs/rnattachmentkit-release.aar +0 -0
- package/android/src/newarch/java/com/rnattachmentkit/RNAttachmentKitModule.kt +308 -10
- package/android/src/oldarch/java/com/rnattachmentkit/RNAttachmentKitModule.kt +311 -9
- package/ios/RNAttachmentKit.m +44 -0
- package/ios/RNAttachmentKit.swift +307 -23
- package/ios/RNAttachmentKit.xcframework/Info.plist +5 -5
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/Headers/RNAttachmentKit-Swift.h +30 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios.abi.json +20349 -13021
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios.private.swiftinterface +118 -1
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios.swiftinterface +118 -1
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/RNAttachmentKit +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_crop_reflect~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_crop_reflect~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_crop_rotate~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_crop_rotate~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_delete~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_delete~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_forward~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_forward~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_reward~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_reward~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_back~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_back~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_blur~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_blur~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check_small~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check_small~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_close~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_close~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_crop~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_crop~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_drawing~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_drawing~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_effect~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_effect~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_emoji~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_emoji~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_eraser~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_eraser~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_mosaic~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_mosaic~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_text~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_editor_text~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_text_add~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/ToolbarIcons/ic_text_add~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/_CodeSignature/CodeDirectory +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/_CodeSignature/CodeResources +192 -60
- package/ios/RNAttachmentKit.xcframework/ios-arm64/RNAttachmentKit.framework/_CodeSignature/CodeSignature +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Headers/RNAttachmentKit-Swift.h +60 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios-simulator.abi.json +20349 -13021
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +118 -1
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/arm64-apple-ios-simulator.swiftinterface +118 -1
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/x86_64-apple-ios-simulator.abi.json +20349 -13021
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +118 -1
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/Modules/RNAttachmentKit.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +118 -1
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/RNAttachmentKit +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_crop_reflect~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_crop_reflect~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_crop_rotate~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_crop_rotate~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_delete~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_delete~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_forward~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_forward~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_reward~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_drawing_reward~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_back~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_back~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_blur~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_blur~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check_small~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check_small~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_check~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_close~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_close~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_crop~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_crop~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_drawing~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_drawing~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_effect~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_effect~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_emoji~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_emoji~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_eraser~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_eraser~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_mosaic~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_mosaic~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_text~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_editor_text~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_text_add~dark.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/ToolbarIcons/ic_text_add~light.webp +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/_CodeSignature/CodeDirectory +0 -0
- package/ios/RNAttachmentKit.xcframework/ios-arm64_x86_64-simulator/RNAttachmentKit.framework/_CodeSignature/CodeResources +202 -70
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_crop_reflect~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_crop_reflect~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_crop_rotate~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_crop_rotate~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_drawing_delete~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_drawing_delete~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_drawing_forward~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_drawing_forward~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_drawing_reward~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_drawing_reward~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_back~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_back~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_blur~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_blur~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_check_small~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_check_small~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_check~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_check~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_close~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_close~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_crop~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_crop~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_drawing~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_drawing~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_effect~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_effect~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_emoji~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_emoji~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_eraser~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_eraser~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_mosaic~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_mosaic~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_text~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_editor_text~light.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_text_add~dark.webp +0 -0
- package/ios/RNAttachmentKitAssets/ToolbarIcons/ic_text_add~light.webp +0 -0
- package/package.json +1 -1
- package/src/NativeAttachmentKit.ts +10 -0
- package/src/index.d.ts +5 -56
- package/src/index.ts +188 -35
- package/src/types.ts +207 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,115 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.5 — 2026-10-10
|
|
4
|
+
|
|
5
|
+
- iOS map viewer: Directions is a menu anchored above the button (the action sheet floated at the top on iOS 26); TMAP added (Korean only, with Kakao Map / Naver Map); cancelling the system "Open in …?" prompt no longer falls through to the web map (which opened the app anyway). Uses `canOpenURL` when the host declares `comgooglemaps`, `kakaomap`, `nmap`, `tmap` in `LSApplicationQueriesSchemes`.
|
|
6
|
+
- Map viewer open (iOS + Android): the thumbnail grows opaque to full screen and is removed only after the map has rendered (max 1.2 s wait) — no blank-map flash or double image. Background fade is white in light mode, black in dark mode. iOS open 0.24 s / close 0.22 s (was 0.32 / 0.30).
|
|
7
|
+
- Android map viewer opens a little slower: image grow 360 → 420 ms, fade-in without an image 220 → 260 ms (close unchanged).
|
|
8
|
+
- Android map viewer: no flash on the first frame when opening. The open start state (transparent background, map panel off-screen, bubble image at the bubble rect — or, without an image, map transparent at 0.96×) is now applied before the first frame is drawn: set up in `onCreateView` and placed/started in the first `OnPreDrawListener` instead of `outer.post` (which drew one frame with the full map and an opaque black background first). The dialog window animation is also turned off in code (`setWindowAnimations(0)`, same as the theme's `windowAnimationStyle @null`).
|
|
9
|
+
- Map viewer from a `renderLocationThumbnail` bubble: the marker no longer changes size when the image grows/shrinks. The thumbnail is drawn at bubble width, so its baked-in marker (19% of the image width) was ~2.4× too big once the image filled the screen and then jumped to the real map-marker size. The renderer now also saves the same map without the marker (`<key>.base.webp`, cache key bumped → thumbnails re-render once); when `sourceImageUri` is such a thumbnail, the viewer uses the markerless image and draws the marker separately, tip on the point, going smoothly from the bubble's marker size to the live map-marker size (reverse on close) while the live map marker stays hidden. Other images (e.g. sent snapshots) behave as before.
|
|
10
|
+
- **`reverseGeocode` (new)**: `AttachmentKit.reverseGeocode({ latitude, longitude, languageCode? }): Promise<{ address, shortAddress, cached }>` and `clearReverseGeocodeCache()`. Uses the device geocoder (iOS `CLGeocoder.reverseGeocodeLocation(preferredLocale:)`, Android `Geocoder(context, Locale.forLanguageTag(lang))` with the async listener on API 33+) — free, no key. `languageCode` is passed as the locale as is (default: `setDefaults`/`init` languageCode as given, not reduced to the UI languages). Address format = Location tab (`fullAddress` / `shortAddress`; Android: address line without country name and postal code). Disk cache (iOS `Library/Caches/RNAttachmentKit/Geocode/`, Android `cacheDir/RNAttachmentKitGeocode/`), key `round(lat,5)|round(lng,5)|languageCode`, "no result" (`address: null`) cached too, 1000 max → trimmed to 800 least recently used, not part of the 24-hour temp cleanup. Same-key requests merged; geocoder called one at a time; 8 s timeout per call. Rejects (never cached): `E_INVALID_COORDINATE`, `E_GEOCODE_UNAVAILABLE`, `E_GEOCODE_THROTTLED` (iOS `kCLErrorNetwork` + GEO throttle → queued requests rejected and new ones rejected until `timeUntilReset`; Android `IOException` while online), `E_GEOCODE_TIMEOUT`, `E_GEOCODE_NETWORK` (offline), `E_GEOCODE_FAILED`. Logs contain only a key hash. Android library manifest adds `ACCESS_NETWORK_STATE` (normal permission) to tell "offline" from "no result". See `docs/location-api.md`.
|
|
11
|
+
- Map viewer: a missing `address` is filled through the same geocode cache and language (`addressLanguageCode`, sent by JS = `languageCode` as given or the `setDefaults` value). Android Location tab addresses now drop the country name (same formatter).
|
|
12
|
+
- Map viewer sticky open/close works when `sourceRect` and `sourceImageUri` have different aspects (e.g. 4:3 bubble cell + screen-ratio thumbnail shown with `resizeMode="cover"`): the image is always drawn center-cropped (cover) inside the animated cell, so the first frame equals the bubble and the cropped top/bottom unfold to full screen (reverse on close). Android: new `CoverImageView` draws the bitmap into the animated rounded rect (BitmapShader, no per-frame layout — the old `ImageView` resized via layout params lagged a frame behind its position).
|
|
13
|
+
- `renderLocationThumbnail`: `maxWidth` / `maxHeight` documented on `LocationThumbnailOptions`; when only one is given the other is no longer capped at 512 (both omitted → 512 × 512 as before). `width: 170, aspect: 'device', maxWidth: 512, maxHeight: 1152` → about 510×1105 px on a 3× device.
|
|
14
|
+
- **Location thumbnails rendered on the receiving device**: `AttachmentKit.renderLocationThumbnail(options): Promise<{ uri, path, width, height, cached }>` draws a chat-bubble map thumbnail from location info only, in the device's own theme, and caches it on disk (iOS `Library/Caches/RNAttachmentKit/LocationThumbs`, Android `cacheDir/RNAttachmentKitLocationThumbs`; 300 files max, trimmed to 250 by last use; not touched by the 24 h temp cleanup). Same look as the sent snapshot: teardrop marker with the `markerType` / `placeCategory` icon at the sent point and, when `myLatitude`/`myLongitude` are given (sender had "Share my location" on), the blue my-location dot with the span widened so both fit. Options: `latitude`, `longitude`, `width`, `height` or `aspect` (`'square'` 1:1 / `'portrait'` 9:19.5 / `'device'` this screen's ratio), `markerType?`, `placeCategory?`, `spanMeters?` (default 400 m), `myLatitude?`, `myLongitude?`, `themeColor?`, `appearance?`. Identical concurrent requests render once; iOS renders up to 2 at a time (`MKMapSnapshotter`), Android 1 at a time on a reusable off-screen `MapView`. Rejects `E_THUMBNAIL_FAILED` (e.g. offline, 10 s timeout) / `E_INVALID_ARGS`. `AttachmentKit.clearLocationThumbnailCache()`.
|
|
15
|
+
- `openGallery({ captureLocationImage: false })`: the Location tab sends immediately without taking a map snapshot (no `imageUri/imagePath/imageWidth/imageHeight` in `AttachLocationResult`); `imageSpanMeters`, `markerType`, `placeCategory`, `includesMyLocation` and `currentLatitude/Longitude` are still returned so the receiver can render the same thumbnail. Default `true` (unchanged behavior).
|
|
16
|
+
|
|
17
|
+
## 1.0.4 — 2026-10-10
|
|
18
|
+
|
|
19
|
+
- **Map viewer RN API**: `AttachmentKit.openMapViewer(options: MapViewerOptions): Promise<void>` (resolves when the viewer closes) and `AttachmentKit.updateMapViewerSourceRect(rect | null)` (where to shrink back to on close, e.g. after the list scrolled; `null` = the original `sourceRect`). `MapViewerOptions`: `latitude`, `longitude`, `title?`, `address?`, `markerType?`, `placeCategory?` (iOS), `spanMeters?` (pass `imageSpanMeters`), `showDirections?` (default true), `sourceRect?` (RN `measureInWindow` values), `sourceImageUri?` (`https://` or `file://`), `sourceCornerRadius?` (dp/pt, default 12), `themeColor?` / `languageCode?` / `appearance?` (default to `setDefaults`). With `sourceRect` the bubble image grows into the map (sticky); if the image can't be loaded within ~1.5 s (or fails) the viewer opens without it. Image source: iOS memory/disk viewer cache → download; Android `file://` as is, `https://` via the Glide cache. New native methods `openMapViewer` / `updateMapViewerSourceRect` (iOS + Android newarch/oldarch, TurboModule spec).
|
|
20
|
+
- Android map viewer follows `appearance` (light / dark / system) — `MapViewerDialogFragment.show(..., appearance)`.
|
|
21
|
+
|
|
22
|
+
- Location snapshot is now portrait **480×1040 webp (9:19.5, average phone screen ratio)**, the sent point exactly centered (Android crops the tall MapView bitmap; iOS `MKMapSnapshotter` 240×520 @2x). Result gains `imageSpanMeters` (real distance covered by the image width).
|
|
23
|
+
- Map viewer: opens at the same scale as the image (`spanMeters` = `imageSpanMeters`), the shared point exactly at screen center (symmetric map padding), and the sticky open grows the image from the thumbnail until it just fills the screen (aspect-fill) while it cross-fades into the map (iOS: the map is revealed through a mask that grows with the image; Android: the map fades in full-screen underneath, since its surface can't be shape-clipped); close is the reverse — the image fades in while shrinking back into the thumbnail.
|
|
24
|
+
- New native map viewer (Android `MapViewerDialogFragment.show(activity, lat, lng, title, address, markerType, themeColor, languageCode)`, iOS `MapViewerViewController(latitude:longitude:title:address:markerType:placeCategory:accentColor:languageCode:)`): full-screen map of a shared location with the same teardrop marker as the sender, ✕ close, glass button box (map type / my location — fits both me and the place), bottom glass card with title and "distance · address" (address reverse-geocoded locally if missing) and a **Directions** button (Android: `geo:` chooser of installed map apps; iOS: Apple Maps / Google Maps / Kakao Map / Naver Map, falling back to the web). Android is a DialogFragment (no new Activity → no AppState change). Dark map style on Android dark mode. New strings `location_directions`, `map_app_apple/google/kakao/naver`. Test apps open it when the location result image is tapped.
|
|
25
|
+
- Sticky open/close from the tapped thumbnail: iOS `sourceRect` / `sourceImage` / `sourceCornerRadius` / `sourceRectProvider` (present with `animated: false`) — the whole viewer is revealed through a rounded mask growing from the thumbnail while the thumbnail image scales up and cross-fades into the live map, and shrinks back on close. Android `sourceRect` / `sourceImagePath` / `sourceCornerRadius` + `sourceRectProvider` — the Google map draws on its own surface and can't be shape-clipped, so the thumbnail image grows from its spot to full screen (rounded corners easing to 0), then the map fades in; on close the map fades out and the thumbnail shrinks back. Without a source rect both fall back to a fade.
|
|
26
|
+
- Directions button is optional: `showsDirections` (iOS) / `showDirections` (Android), default on. Kakao Map and Naver Map are offered only when `languageCode` is Korean (iOS sheet: Apple Maps + Google Maps otherwise; Android uses the system app chooser).
|
|
27
|
+
- Location result gains `markerType` (`"current"` / `"pin"` / `"place"`) and on iOS `placeCategory`, so the viewer draws the same icon the sender saw (current = arrow, pin = location icon, place = category icon on iOS / location icon on Android). Android marker drawing moved to a shared `LocationMarker`.
|
|
28
|
+
|
|
29
|
+
## 1.0.3 — 2026-10-10
|
|
30
|
+
|
|
31
|
+
- Android Location: while map tiles load, the map shows a theme background instead of white — dark mode `#1D2128` (same as the dark map style), light mode white (`GoogleMapOptions.backgroundColor` + MapView/container background).
|
|
32
|
+
|
|
33
|
+
Android attach menu bar:
|
|
34
|
+
- Android attach menu bar is easier to read over photos: much denser frosted fill (light: white ~80%, dark: near-black ~73%), soft drop shadow (6dp), and a selected-tab capsule that stays visible on the denser fill (light: 8% black, dark: 18% white). Android has no live backdrop blur for views, so the fill is made denser instead.
|
|
35
|
+
- Navigation bar height is now resolved reliably, in order: the Activity window inset → the bottom-sheet window inset → the system `navigation_bar_height` resource (0 = device without a navigation bar). The bar is placed with that height from the start (no jump on open); the inset listener only re-applies when the value really changes (rotation, navigation mode) and ignores 0. Only the part of the navigation bar the sheet container actually overlaps is used, so 3-button navigation (container ends above the buttons) no longer lifts the bar twice. The grid's bottom padding (`attachMenuReservePx`) and the Location panel inset use the same value, so the bar and the last grid row line up.
|
|
36
|
+
- New `openGallery` options (Android only, iOS ignores): `attachMenuSinkIntoNav?: number` (dp, default 12 — current look; 0 = right above the navigation bar) and `attachMenuMinBottomMargin?: number` (dp, default 8). Negative values are clamped to 0. `AttachMenuBarView.bottomMarginPx(density, navInset, sinkDp, minDp)`.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
Attach menu → Location (Android & RN):
|
|
40
|
+
- New `openGallery` options `showAttachMenu?: boolean` (default false; shows the Gallery / Location / File bar) and `onLocationSelected?: (location: AttachLocationResult) => void`. Sending a location fires `onLocationSelected` (`{latitude, longitude, accuracy?, title?, address?, isCurrentLocation}`) and `openGallery` resolves with `[]`. New native event `onLocationSelected` (iOS + Android).
|
|
41
|
+
- Android Location panel (`LocationPanelView`): Google Maps map with a center pin, my-location button, "send my current location" (FusedLocationProvider, accuracy shown), drag the map → reverse geocoded address, search box and POI taps. Addresses and search use the built-in `android.location.Geocoder` (no Places API).
|
|
42
|
+
- Android needs the host app to set its own key in `AndroidManifest.xml`: `<meta-data android:name="com.google.android.geo.API_KEY" android:value="..."/>` (Maps SDK for Android + Places API (New) enabled and allowed on the key). The library carries no key. New dependencies `play-services-maps:19.0.0` and `play-services-location:21.3.0`; the library manifest adds `ACCESS_FINE_LOCATION` / `ACCESS_COARSE_LOCATION` (remove with `tools:node="remove"` if unused).
|
|
43
|
+
- Attach menu → File: new `openGallery` option `onFilesSelected?: (files: AttachFileResult[]) => void` and native event `onFilesSelected` (`{ files: [{uri, path, name, size, mimeType}] }`, iOS + Android); `openGallery` resolves with `[]`. Android gets the same File panel as iOS (`FilePanelView`: theme-color icon with pulse, title/description, "Choose from Files" capsule, file-type icons). The button opens the system file picker (`ACTION_OPEN_DOCUMENT`, multiple, any type: recent files, internal storage, other apps); picked files are copied to `cache/AttachmentKitFiles/<uuid>/<name>`.
|
|
44
|
+
- Android Location / File tabs keep the sheet's current height (no auto-expand), like Telegram. Location at half height shows the map + "send" row fitted above the menu bar; dragging the list expands the sheet and the search box slides in (hidden again when collapsed). Map drags never move the sheet. File at half height hides the file-type icon row when it would sit under the menu bar. The sheet no longer stops at the unused half-expanded step after a drag-down (it settles to the collapsed height).
|
|
45
|
+
- Android Location panel, iOS-style: the map draws behind the (now background-less) top bar and grows with the sheet drag (collapsed: map + send row fit above the menu bar; expanded: ~55% of the screen). Right-side glass button box: full screen / map type (normal ↔ hybrid) / my location (new 24-grid icons `ic_map_*`; the locate arrow fills with the theme color while showing the current location). Full-screen map like iOS: sheet expands, list slides away, floating glass "send" capsule, ✕ becomes ←, attach menu hides, system back exits full screen. Search works like iOS: 🔍 in the top bar (shown when the sheet is fully expanded) opens search — the map fills the panel, a glass search capsule + ✕ circle sits just above the keyboard (tracks the IME), and results appear as dark glass cards under the top bar with "distance · address" (distance from my location, else the map center). Results update as you type (350 ms debounce); picking a card closes search and moves the map there; back key / ✕ closes search. Place search uses Google Places API (New) over REST (`PlacesSearch`, no extra dependency) with the app's same manifest key `com.google.android.geo.API_KEY`, in the cheapest form: **Autocomplete (New) with a session token** while typing (from 2 characters, 400 ms debounce; candidates show name + "distance · address") and, when a candidate is picked, **Place Details Essentials (location only)** with the same token to close the session. Text Search / Nearby Search (Pro tier) are not used; the automatic "Nearby" list was removed. Sends `X-Android-Package`/`X-Android-Cert` so Android-restricted keys work. Requires **Places API (New)** enabled and allowed on the key; on failure (403, quota exceeded, network) it falls back to the device Geocoder (near-map + worldwide merged, deduplicated). Controls use a translucent glass style (`GlassStyle`).
|
|
46
|
+
- Android Location map follows the picker appearance (RN `appearance` light / dark / system): dark mode uses a dark map style (`res/raw/turbo_map_style_dark.json`).
|
|
47
|
+
- Android Location: camera moves are animated like iOS (my location / search result glide over 0.6–0.8 s; the first fix zooms in place instead of flying from the world view). Full-screen map keeps the attach menu (3 tabs) visible, with the send capsule floating above it; the pinned spot stays put when entering/leaving full screen, and the center pin tip is placed exactly at the camera center (between top bar and bottom padding). A fast upward fling on the map no longer expands the sheet (gallery-only fling assist).
|
|
48
|
+
- Location send now includes a map snapshot (Android & iOS): `AttachLocationResult` gains `imageUri` / `imagePath` / `imageWidth` / `imageHeight` — a 512×512 square **webp** (quality 75, ~15–20 KB) centered on the sent point (side ≈ 70% of the visible map width), with the theme-color pin drawn at the point and **without** the my-location dot / search markers, in the current map type and light/dark style. Android: `GoogleMap.snapshot` (my-location layer hidden for the capture) → `cache/AttachmentKitLocation/`; iOS: `MKMapSnapshotter` → `tmp/AttachmentKitLocation/` (SDWebImageWebPCoder, JPEG fallback if unavailable). Image fields are omitted if capture fails.
|
|
49
|
+
- Location send also returns the device's current location at send time (Android & iOS): `currentLatitude` / `currentLongitude` / `currentAccuracy` (only when known), regardless of whether a pin, place or my location was sent.
|
|
50
|
+
- Android Location: the "send" card has a fixed height (address always reserves two lines) so it no longer jumps as the address changes; with no list below it, expanding the sheet grows the map all the way down to the send card. The panel's list area no longer scrolls (removed an extra bottom spacer that made the send card scrollable when expanded).
|
|
51
|
+
- Android Location: all panel texts now use the picker `languageCode` (were using the device language); search (Places `languageCode`) and addresses (Geocoder locale) already did.
|
|
52
|
+
- Android Location drag: dragging from the top bar keeps the live behavior (map grows with the drag); dragging from the send card / lower area moves the card up with the sheet, and once the sheet settles the map animates to its new size and the card slides to its place (same on collapse).
|
|
53
|
+
- iOS Location: dragging the list down from its top while the sheet is expanded collapses the sheet interactively — the sheet follows the finger and settles on release (the panel no longer disables list scrolling mid-drag, which cancelled the gesture and made the sheet jump). While searching, the map can be dragged in the empty area below the result cards, and the search capsule / ✕ stay above the attach menu bar when the keyboard is hidden (they were hidden behind it and untappable).
|
|
54
|
+
- Native test apps (Android `android/app`, iOS harness, RN `RNAttachmentKitApp`) now show the returned location snapshot image as a result.
|
|
55
|
+
- Location "Share my location" switch on the send row (Android & iOS; new string `location_include_me`, all languages). Off by default; the choice is remembered on the device (Android SharedPreferences `rnattachmentkit_location`, iOS UserDefaults `RNAttachmentKit.location.shareMyLocation`). It only affects the sent image: when on, my location dot is drawn into the snapshot and the crop/region is widened so both the sent point and me fit; the live map always shows my location. Result gains `includesMyLocation`; `currentLatitude/Longitude/Accuracy` are always returned when known.
|
|
56
|
+
- Android Location: the center pin lifts while the map is dragged and drops back with a small bounce when it stops, with a dot marking the exact point (same as iOS). Releasing a drag started on the send card no longer jumps: the map height follows the sheet's settle animation from the release point.
|
|
57
|
+
- iOS Location: no more layout flashing when a list drag is released midway — the panel now tracks the sheet's on-screen (presentation-layer) position during the expand/collapse snap animation, so the map and list follow the sheet instead of jumping to the final layout first.
|
|
58
|
+
- Android Location: the pinned spot no longer shifts when the sheet expands/collapses (or the map padding changes) — the point under the pin is remembered and re-centered right after each map resize; programmatic camera animations are not interrupted by this.
|
|
59
|
+
- Android Location, smoother transitions: the MapView no longer resizes while the sheet moves. It keeps the full panel height and is shifted with `translationY` so the visible area's center stays on the camera target (symmetric map padding keeps the Google logo at the visible bottom). No camera moves happen during expand/collapse/full screen, so the map doesn't stutter and the pinned spot doesn't move. Snapshot crop accounts for the shift.
|
|
60
|
+
- Android Location: the pin is always at the center of the visible map. Releasing/flinging a drag started on the send card: the map height is interpolated frame-by-frame with the sheet's settle animation (from the height at release to the target), so nothing jumps when the sheet arrives. Dragging down from the expanded state (header or send card) shrinks the map live so the send card stays above the attach menu.
|
|
61
|
+
- Android sheet: the unused half-expanded step is now kept at exactly the collapsed height (`halfExpandedRatio` = peekHeight / parent height, synced on slide), so a fling down no longer pauses midway and then drops a little further (gallery too). Location MapView height is fixed once (2× panel height) and never resized, so the map SDK never re-centers at the end of an expand.
|
|
62
|
+
- Android Location: fixed the last drop when the sheet arrives fully expanded — the pin/map center is now computed from the header's own height (excluding the status-bar padding that is added when the sheet reaches the top), so the reference never changes at that moment; no compensating animation. Search result cards still start below the full header.
|
|
63
|
+
- Android Location: dragging the sheet from the send card now tracks the finger 1:1. The card area's NestedScrollView had nested scrolling enabled; since it moves with the sheet, its touch deltas compounded and the sheet accelerated far past the finger ("훅 떨어짐"). Nested scrolling is off (nothing to scroll), so the sheet's own drag handles it. While dragging from the card the map keeps its size (card follows the finger) and only shrinks once the card reaches the attach menu.
|
|
64
|
+
- Android Location: if the sheet reaches full height while the finger is still dragging up from the send card (or any case where the map is still far from its target size when the sheet settles), the map now grows with a 320 ms animation instead of switching in one frame.
|
|
65
|
+
- Location center marker redesigned (Android & iOS): a teardrop — theme-color gradient circle (lighter top → darker bottom) with a short, round-tipped tail, one continuous white border (2.5) around both — drawn as an inside stroke of the same outline so its width is exactly even along the tail; the tail leaves the circle along the circle's tangent (cubic curves) so the join has no kink, soft shadow, with enough padding that nothing is clipped. White icon: place category on iOS (cup for cafés, etc.) / place icon on Android for a selected place, the location icon for a moved point (both platforms; Android now uses the same filled location glyph as iOS — `ic_attach_location`). Marker glyphs enlarged: location icon 29dp (Android) / 27pt (iOS), other icons 25dp / 23pt), the arrow for my location. The point dot below is a little smaller (5). A selected place no longer adds a separate system marker. The sent snapshot draws exactly the same marker (tail tip on the point).
|
|
66
|
+
- "Share this location" button (new string `location_share_this`, all languages) floats at the top-right of the marker when the map has stopped on a moved point or a selected / searched place (hidden while dragging, searching or in full-screen map): location icon + label, theme-color capsule with a thin (1) white border and shadow; tapping it sends that location. iOS: excluded from the sheet's drag gesture so taps always reach it.
|
|
67
|
+
- iOS Location list separators: none under the send row, the "Nearby" header now has a hairline running to the right of its label, and no line above the first nearby place.
|
|
68
|
+
- Location snapshot: the sent point is now always at the exact center of the image (also with "Share my location" on — the square is widened symmetrically around the point until my location fits, instead of centering between the two), and the marker is drawn larger (19% of the image width, was 14%). Android also no longer drifts off-center when the point is near the crop edge.
|
|
69
|
+
- Android Location opens at the last known location (saved on each location fix) at street zoom, then glides to the current location — no long zoom-in from the world map after the first time.
|
|
70
|
+
- Android attach menu bar: smaller and centered — max width 300dp, height 50dp, icons 24dp (was 28), labels 10sp (was 11).
|
|
71
|
+
- Location menu: removed "Share My Live Location" row (iOS; Android never had it).
|
|
72
|
+
- Android Location: the top bar can be grabbed to drag the sheet between half and full height (it no longer passes drags to the map underneath); the map stays visible behind the top bar after returning to half height (slide no longer repaints the header background); "send" row and "Nearby" list are rounded cards with per-place colored icons (Telegram-like). Returning to Gallery restores the header exactly as it was (album title / tabs / done visibility depend on selection).
|
|
73
|
+
- Android attach menu bar: dark mode gets a light black translucent fill (30–35%) so the buttons stay readable over photos.
|
|
74
|
+
- Native test app (`android/app`) reads its map key from `android/local.properties` (`GOOGLE_MAPS_API_KEY`, git-ignored).
|
|
75
|
+
|
|
76
|
+
Editor icons (Android & iOS):
|
|
77
|
+
- New consistent icon set for the editor, drawing and crop screens (all except close ✕ and confirm ✓): 24×24 grid, 1.8 stroke, round caps/joins, outline style — back, effect, crop, text, emoji, draw/pen, add text, undo, redo, delete, mosaic, blur, eraser, rotate, flip. Android uses vector drawables (one set, replaces the light/dark webp pairs); iOS uses generated light/dark webp in `ToolbarIcons` (new: `ic_editor_back`, `ic_editor_blur`, `ic_text_add`). Source of truth: `scripts/editor_icons/icons.py`.
|
|
78
|
+
- Close ✕ / confirm ✓ in the editor-family screens (editor effect/text modes, emoji picker, drawing, crop) are now bubble buttons: ✕ = neutral bubble, ✓ = theme-color bubble with a white check. iOS 26 uses the system Liquid Glass bubble (`.glass()` / `.prominentGlass()`), older iOS a matching round button; Android uses the same design (`EditorBubble`). New icons `ic_editor_close`, `ic_editor_check`, `ic_editor_check_small` (the "✓ 1" send button). The picker / image viewer close buttons are unchanged.
|
|
79
|
+
- Editor bars match iOS on Android: the top bar is status bar + 52dp (the 48dp fade spacer from the old transparent bar is removed) and translucent (white 75% / black 60% plus the dark-mode top gradient) and the bottom bars use `editor_bar_background` at 95% (was opaque).
|
|
80
|
+
- Icons: the whole set is 6% larger (`SCALE` in `scripts/editor_icons/icons.py`), and the editor's five bottom tools are a bit larger again (padding 14→12).
|
|
81
|
+
- Confirming any tool with ✓ (effect, crop, text, emoji, drawing) always returns the editor to the unzoomed photo (effect/crop/drawing used to keep the previous zoom).
|
|
82
|
+
- The confirm ✓ bubble is enabled only when something changed in that tab (dimmed and not tappable otherwise; going back to the starting state disables it again): effect = filter or intensity differs from when the tab opened; text / emoji = stickers added, removed, edited, moved, resized or rotated; drawing = at least one stroke; crop = rotated, flipped, or the crop area differs from the whole photo.
|
|
83
|
+
- iOS drawing screen: fixed the canvas sometimes getting a zero size (so nothing could be drawn) — the scroll view's content is laid out before the canvas frame is computed, and the full-screen scroll view no longer adds safe-area insets.
|
|
84
|
+
- The theme color now reaches the crop screen (Android/iOS) and the drawing/emoji screens use the editor's default accent when the app passes none (previously yellow).
|
|
85
|
+
- Drawing screen: the photo now fills the whole screen like the editor, and the top/bottom bars (incl. color palette / strength rows) are translucent over it (iOS `editorOverlay`, Android `editor_bar_translucent`: white 75% / black 60%), so a zoomed photo shows through the bars. iOS drawing bars use their own, less transparent `drawingBarBackground` (white 90% / black 82%); the editor's top bar keeps `editorOverlay`.
|
|
86
|
+
- `deploy.rb` now always syncs iOS `ToolbarIcons` to Dist (`Assets.xcassets` / `Fonts` stay behind `SYNC_ASSETS=1`).
|
|
87
|
+
|
|
88
|
+
Editor stickers (Android, now matches iOS):
|
|
89
|
+
- iOS: while in text/emoji mode, stickers now zoom with the photo (they used to keep a fixed on-screen size until applied). Stickers are always shown at their image-space size; handles and the border stay a constant on-screen size. A sticker added while zoomed still appears at its normal on-screen size.
|
|
90
|
+
- An emoji or text added while the photo is zoomed now appears at its normal on-screen size at the center of the current view. It used to be divided by the zoom twice (emoji came out much smaller), and text ignored the zoom.
|
|
91
|
+
- Stickers no longer change size when selected/deselected while zoomed (the selected sticker used to be shown divided by the zoom).
|
|
92
|
+
|
|
93
|
+
Drawing tool (Android & iOS, same rules on both):
|
|
94
|
+
- Brush width is screen-relative: when the photo is pinch-zoomed, new strokes (pen, mosaic, blur, eraser) keep the same on-screen width (stored as width ÷ zoom), so zooming in allows finer work. Mosaic block size / blur radius stay image-relative. The brush-size preview shows the on-screen size regardless of zoom.
|
|
95
|
+
- Mosaic strength is saved per stroke — changing the strength no longer re-renders strokes already drawn.
|
|
96
|
+
- Mosaic/blur strength is set with a horizontal slider shown where the color palette is (1-step, small dot = weak, big dot = strong): mosaic blocks 4–24 (dp/pt, default 16), blur radius 2–22 (default 14); a size preview shows while dragging. The vertical slider now sets the brush width for mosaic/blur (16–80, default 40). Saved per device (Android `drawing_prefs` `mosaic_strength` / `blur_strength` / `effect_brush_size`, iOS `drawing_mosaicStrength` / `drawing_blurStrength` / `drawing_effectBrushSize`).
|
|
97
|
+
- Mosaic blocks get a small fixed per-block brightness noise so very small text is harder to recover.
|
|
98
|
+
- iOS mosaic now uses the screen-based block grid like Android (it was based on image pixels, so large photos came out much finer on iOS), with area-averaged block colors and the painted area snapped to the same blocks.
|
|
99
|
+
- New blur brush (tool order: pen / mosaic / blur / eraser). Its edges are feathered (the brush mask is Gaussian-blurred, sigma = 25% of the brush width) so the blurred area fades into the photo instead of looking like a painted stroke.
|
|
100
|
+
|
|
101
|
+
수정 (2026-10-09, 첨부 메뉴 / 브릿지 안정화):
|
|
102
|
+
- iOS: 갤러리·첨부 메뉴 클로저의 retain cycle 수정 — 갤러리를 닫은 뒤 `GalleryViewController` 가 해제되지 않던 문제.
|
|
103
|
+
- Android: 뷰어를 닫을 때 Glide 디스크 캐시를 더 이상 비우지 않음 (메모리 캐시만 정리). 닫을 때마다 썸네일·원본을 다시 내려받던 문제.
|
|
104
|
+
- Android: 위치 패널이 Activity 가 없거나 지도 초기화 전에 호출될 때 크래시하던 경로에 보호 코드 추가.
|
|
105
|
+
- 파일 탭: 복사에 실패한 파일이 있으면 사용자에게 알리고, `onFilesSelected` 이벤트에 `failed: [{ name, error }]` 배열을 함께 보냄 (JS: `onFilesSelected(files, failed?)`, 새 타입 `AttachFileFailure`).
|
|
106
|
+
- 임시 파일 정리: `AttachmentKitFiles`(iOS `tmp/`, Android `cache/`) 안에서 24시간 지난 항목은 다음 갤러리 열기 때 자동 삭제. 앱은 받은 파일을 바로 옮기거나 업로드해야 함.
|
|
107
|
+
- Android: 갤러리/편집기 취소 코드를 `E_PICKER_CANCELLED` 로 통일 (iOS 는 그대로 `CANCELLED`).
|
|
108
|
+
- JS: `openViewer` 가 `onViewerWillClose` 콜백을 넘기지 않아도 네이티브 `onViewerWillClose` 를 항상 구독해 `onPageSelected` / `onImageDeleted` 구독을 정리 (뷰어를 열 때마다 리스너가 누수되던 문제). 네이티브가 reject 하면 즉시 정리. `asyncProcessing` 모드의 `onImageProcessed` 구독은 다음 `openGallery(asyncProcessing)` 호출 때 이전 것만 제거해 최대 1개만 유지 (기존처럼 finally 에서는 제거하지 않음).
|
|
109
|
+
- JS: `openGallery` / `openEditor` 를 앞 호출이 끝나기 전에 다시 부르면 네이티브를 건드리지 않고 `code: "E_ALREADY_OPEN"` 으로 reject (네이티브가 Promise 를 하나만 보관해 앞 호출이 영영 끝나지 않던 문제).
|
|
110
|
+
- JS: `src/index.d.ts` 는 더 이상 손으로 관리하는 복사본이 아니라 `index.ts` / `types.ts` 재노출. `types.ts` 의 오래된 `RNAttachmentKit` 인터페이스(존재하지 않는 `updateViewerSourceRect`) 제거 — 실제 인터페이스는 `index.ts` 의 것 하나.
|
|
111
|
+
- 문서: README 에 "첨부 메뉴 (위치 / 파일)" 섹션 추가 (옵션·결과 타입·오류 코드·임시 파일 위치·Android 키/권한·iOS `NSLocationWhenInUseUsageDescription`).
|
|
112
|
+
|
|
3
113
|
## 1.0.2 — 2026-10-09
|
|
4
114
|
|
|
5
115
|
Android:
|
|
@@ -18,6 +128,7 @@ Android fixes:
|
|
|
18
128
|
- Tapping a photo in the picker no longer blinks the grid cell before the zoom animation. The cell is now hidden right after the editor draws its first frame (the editor's overlay photo covers the cell at that moment), instead of when the picker launches the editor.
|
|
19
129
|
- Pull-to-dismiss in the editor now slides the selection badge away with the top bar (it used to stay floating on screen while the photo was dragged).
|
|
20
130
|
- Picker grid spacing reduced from 4dp to 1dp between cells (same as iOS).
|
|
131
|
+
- Mosaic (drawing tool) quality matches iOS: one block grid from the block-size slider (previously a second fixed 8dp grid re-sampled the mosaic with nearest-neighbour, giving uneven blocks and noisy colors); block colors are area-averaged by progressive halving; painted area snaps to the same blocks (a block is filled when ~35% covered); export renders at the source resolution instead of upscaling a screen-sized overlay with filtering; mosaic brush is 40dp like iOS (was 40px).
|
|
21
132
|
- Guard against sending the same photo twice after editing (multi-select): the selection returned from the editor is mapped back to original URIs and de-duplicated, the editor keeps only original URIs in its selection, and `sendSelectedImagesNow()` de-duplicates after mapping to edited files.
|
|
22
133
|
|
|
23
134
|
## 1.0.0 — 2026-10-02
|