Skip to content

Commit f0b513e

Browse files
committed
♻️ refactor: change params openPreview | improve GIF on iOS
1 parent c34170f commit f0b513e

19 files changed

+67
-167
lines changed

Diff for: android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePicker.kt

+6-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ class MultipleImagePicker : HybridMultipleImagePickerSpec() {
2626
pickerModule.openCrop(image, config, resolved, rejected)
2727
}
2828

29-
override fun openPreview(media: Array<MediaPreview>, config: NitroPreviewConfig) {
30-
pickerModule.openPreview(media, config)
29+
override fun openPreview(
30+
media: Array<MediaPreview>,
31+
index: Double,
32+
config: NitroPreviewConfig
33+
) {
34+
pickerModule.openPreview(media, index.toInt(), config)
3135
}
3236

3337
}

Diff for: android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt

+10-50
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.margelo.nitro.multipleimagepicker
22

33
import android.app.Activity
4+
import android.content.ContentResolver
45
import android.content.Context
56
import android.content.Intent
67
import android.graphics.Color
78
import android.net.Uri
89
import androidx.core.content.ContextCompat
10+
import com.facebook.react.bridge.ActivityEventListener
911
import com.facebook.react.bridge.BaseActivityEventListener
1012
import com.facebook.react.bridge.ColorPropConverter
1113
import com.facebook.react.bridge.ReactApplicationContext
@@ -17,9 +19,9 @@ import com.luck.picture.lib.basic.PictureSelector
1719
import com.luck.picture.lib.config.PictureMimeType
1820
import com.luck.picture.lib.config.SelectMimeType
1921
import com.luck.picture.lib.config.SelectModeConfig
22+
import com.luck.picture.lib.engine.ImageEngine
2023
import com.luck.picture.lib.engine.PictureSelectorEngine
2124
import com.luck.picture.lib.entity.LocalMedia
22-
import com.luck.picture.lib.interfaces.OnCustomLoadingListener
2325
import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener
2426
import com.luck.picture.lib.interfaces.OnResultCallbackListener
2527
import com.luck.picture.lib.language.LanguageConfig
@@ -30,7 +32,6 @@ import com.luck.picture.lib.style.SelectMainStyle
3032
import com.luck.picture.lib.style.TitleBarStyle
3133
import com.luck.picture.lib.utils.DateUtils
3234
import com.luck.picture.lib.utils.DensityUtil
33-
import com.luck.picture.lib.utils.MediaUtils
3435
import com.yalantis.ucrop.UCrop
3536
import com.yalantis.ucrop.UCrop.Options
3637
import com.yalantis.ucrop.UCrop.REQUEST_CROP
@@ -98,8 +99,7 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
9899
.openGallery(chooseMode)
99100
.setImageEngine(imageEngine)
100101
.setSelectedData(dataList)
101-
.setSelectorUIStyle(style)
102-
.apply {
102+
.setSelectorUIStyle(style).apply {
103103
if (isCrop) {
104104
setCropOption(config.crop)
105105
// Disabled force crop engine for multiple
@@ -126,8 +126,7 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
126126
if (videoQuality != null && videoQuality != 1.0) {
127127
setVideoQuality(if (videoQuality > 0.5) 1 else 0)
128128
}
129-
}
130-
.setImageSpanCount(config.numberOfColumn?.toInt() ?: 3)
129+
}.setImageSpanCount(config.numberOfColumn?.toInt() ?: 3)
131130
.setMaxSelectNum(maxSelect)
132131
.isDirectReturnSingle(true)
133132
.isSelectZoomAnim(true)
@@ -265,60 +264,19 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
265264

266265
@ReactMethod
267266
fun openPreview(media: Array<MediaPreview>, config: NitroPreviewConfig) {
268-
val imageEngine = GlideEngine.createGlideEngine()
269267

270-
val assets: ArrayList<LocalMedia> = arrayListOf()
271-
272-
val previewStyle = PictureSelectorStyle()
273-
val titleBarStyle = TitleBarStyle()
274-
275-
previewStyle.windowAnimationStyle.setActivityEnterAnimation(R.anim.anim_modal_in)
276-
previewStyle.windowAnimationStyle.setActivityExitAnimation(com.luck.picture.lib.R.anim.ps_anim_modal_out)
277-
previewStyle.selectMainStyle.previewBackgroundColor = Color.BLACK
278-
279-
titleBarStyle.previewTitleBackgroundColor = Color.BLACK
280-
previewStyle.titleBarStyle = titleBarStyle
281-
282-
media.forEach { mediaItem ->
283-
var asset: LocalMedia? = null
284-
285-
mediaItem.path?.let { path ->
286-
// network asset
287-
if (path.startsWith("https://") || path.startsWith("http://")) {
288-
val localMedia = LocalMedia.create()
289-
localMedia.path = path
290-
localMedia.mimeType =
291-
if (mediaItem.type == ResultType.VIDEO) "video/mp4" else MediaUtils.getMimeTypeFromMediaHttpUrl(
292-
path
293-
) ?: "image/jpg"
294-
asset = localMedia
295-
} else {
296-
asset = LocalMedia.generateLocalMedia(appContext, path)
297-
}
298-
}
268+
val imageEngine = GlideEngine.createGlideEngine()
299269

300-
asset?.let { assets.add(it) }
301-
}
270+
var list: ArrayList<LocalMedia> = arrayListOf()
302271

303272
PictureSelector
304273
.create(currentActivity)
305274
.openPreview()
306275
.setImageEngine(imageEngine)
307276
.setLanguage(getLanguage(config.language))
308-
.setSelectorUIStyle(previewStyle)
309-
.isPreviewFullScreenMode(true)
310-
.isAutoVideoPlay(true)
311-
.setVideoPlayerEngine(ExoPlayerEngine())
312-
.isVideoPauseResumePlay(true)
313-
.setCustomLoadingListener(getCustomLoadingListener())
314-
.startActivityPreview(config.index.toInt(), false, assets)
315-
}
316-
317-
private fun getCustomLoadingListener(): OnCustomLoadingListener {
318-
return OnCustomLoadingListener { context -> LoadingDialog(context) }
277+
.startFragmentPreview(config.index.toInt(), false, list)
319278
}
320279

321-
322280
private fun getLanguage(language: Language): Int {
323281
return when (language) {
324282
Language.VI -> LanguageConfig.VIETNAM // -> 🇻🇳 My country. Yeahhh
@@ -385,7 +343,9 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
385343
0,
386344
*ratioList.take(5).toTypedArray()
387345
)
346+
388347
}
348+
389349
}
390350
}
391351

Diff for: example/src/index.tsx

+1-10
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,7 @@ export default function App() {
7676
}
7777

7878
const onPressImage = (_: Result, index: number) => {
79-
openPreview(
80-
[
81-
{
82-
path: 'https://images.unsplash.com/photo-1733863200891-22bba4483644?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxmZWF0dXJlZC1waG90b3MtZmVlZHw0fHx8ZW58MHx8fHx8',
83-
type: 'image',
84-
} as MediaPreview,
85-
...images,
86-
],
87-
{ index, backgroundColor: 'red' }
88-
)
79+
openPreview(images, index, {})
8980
}
9081

9182
const onPicker = async () => {

Diff for: ios/HybridMultipleImagePicker+Preview.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@
66
//
77

88
import HXPhotoPicker
9-
import Kingfisher
109

1110
extension HybridMultipleImagePicker {
12-
func openPreview(media: [MediaPreview], config: NitroPreviewConfig) throws {
11+
func openPreview(media: [MediaPreview], index: Double, config: NitroPreviewConfig) throws {
1312
var previewConfig = HXPhotoPicker.PhotoBrowser.Configuration()
1413
previewConfig.showDelete = false
1514

16-
let index = config.index
1715
var assets: [PhotoAsset] = []
1816

1917
previewConfig.tintColor = .white
@@ -30,8 +28,8 @@ extension HybridMultipleImagePicker {
3028
asset = .init(localIdentifier: localIdentifier)
3129

3230
// auto play gif
33-
if let filePath = mediaItem.path, asset?.isGifAsset == true,
34-
let url = URL(string: filePath)
31+
if let filePath = mediaItem.path,
32+
let url = URL(string: filePath), isGifFile(url) == true
3533
{
3634
asset = .init(.init(imageURL: url))
3735
}
@@ -62,6 +60,8 @@ extension HybridMultipleImagePicker {
6260
}
6361
}
6462

63+
if Int(index) > assets.count - 1 { return }
64+
6565
DispatchQueue.main.async {
6666
HXPhotoPicker.PhotoBrowser.show(
6767
assets,

Diff for: ios/Utils.swift

+16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import MobileCoreServices
9+
import UniformTypeIdentifiers
910

1011
func isImage(_ urlString: String) -> Bool {
1112
guard let url = URL(string: urlString),
@@ -18,3 +19,18 @@ func isImage(_ urlString: String) -> Bool {
1819

1920
return UTTypeConformsTo(uti, kUTTypeImage)
2021
}
22+
23+
func isGifFile(_ url: URL) -> Bool {
24+
// Kiểm tra phần mở rộng
25+
if url.pathExtension.lowercased() == "gif" {
26+
return true
27+
}
28+
29+
// Kiểm tra UTI
30+
let fileExtension = url.pathExtension as CFString
31+
guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)?.takeRetainedValue() else {
32+
return false
33+
}
34+
35+
return UTTypeConformsTo(uti, kUTTypeGIF)
36+
}

Diff for: nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ namespace margelo::nitro::multipleimagepicker {
109109
static const auto method = _javaPart->getClass()->getMethod<void(jni::alias_ref<jni::JString> /* image */, jni::alias_ref<JNitroCropConfig> /* config */, jni::alias_ref<JFunc_void_CropResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCrop");
110110
method(_javaPart, jni::make_jstring(image), JNitroCropConfig::fromCpp(config), JFunc_void_CropResult::fromCpp(resolved), JFunc_void_double::fromCpp(rejected));
111111
}
112-
void JHybridMultipleImagePickerSpec::openPreview(const std::vector<MediaPreview>& media, const NitroPreviewConfig& config) {
113-
static const auto method = _javaPart->getClass()->getMethod<void(jni::alias_ref<jni::JArrayClass<JMediaPreview>> /* media */, jni::alias_ref<JNitroPreviewConfig> /* config */)>("openPreview");
112+
void JHybridMultipleImagePickerSpec::openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config) {
113+
static const auto method = _javaPart->getClass()->getMethod<void(jni::alias_ref<jni::JArrayClass<JMediaPreview>> /* media */, double /* index */, jni::alias_ref<JNitroPreviewConfig> /* config */)>("openPreview");
114114
method(_javaPart, [&]() {
115115
size_t __size = media.size();
116116
jni::local_ref<jni::JArrayClass<JMediaPreview>> __array = jni::JArrayClass<JMediaPreview>::newArray(__size);
@@ -119,7 +119,7 @@ namespace margelo::nitro::multipleimagepicker {
119119
__array->setElement(__i, *JMediaPreview::fromCpp(__element));
120120
}
121121
return __array;
122-
}(), JNitroPreviewConfig::fromCpp(config));
122+
}(), index, JNitroPreviewConfig::fromCpp(config));
123123
}
124124

125125
} // namespace margelo::nitro::multipleimagepicker

Diff for: nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ namespace margelo::nitro::multipleimagepicker {
5353
// Methods
5454
void openPicker(const NitroConfig& config, const std::function<void(const std::vector<Result>& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override;
5555
void openCrop(const std::string& image, const NitroCropConfig& config, const std::function<void(const CropResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override;
56-
void openPreview(const std::vector<MediaPreview>& media, const NitroPreviewConfig& config) override;
56+
void openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config) override;
5757

5858
private:
5959
friend HybridBase;

Diff for: nitrogen/generated/android/c++/JNitroPreviewConfig.hpp

+2-11
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
#include "JLanguage.hpp"
1414
#include "Language.hpp"
15-
#include <optional>
1615

1716
namespace margelo::nitro::multipleimagepicker {
1817

@@ -32,16 +31,10 @@ namespace margelo::nitro::multipleimagepicker {
3231
[[maybe_unused]]
3332
NitroPreviewConfig toCpp() const {
3433
static const auto clazz = javaClassStatic();
35-
static const auto fieldIndex = clazz->getField<double>("index");
36-
double index = this->getFieldValue(fieldIndex);
3734
static const auto fieldLanguage = clazz->getField<JLanguage>("language");
3835
jni::local_ref<JLanguage> language = this->getFieldValue(fieldLanguage);
39-
static const auto fieldBackgroundColor = clazz->getField<jni::JDouble>("backgroundColor");
40-
jni::local_ref<jni::JDouble> backgroundColor = this->getFieldValue(fieldBackgroundColor);
4136
return NitroPreviewConfig(
42-
index,
43-
language->toCpp(),
44-
backgroundColor != nullptr ? std::make_optional(backgroundColor->value()) : std::nullopt
37+
language->toCpp()
4538
);
4639
}
4740

@@ -52,9 +45,7 @@ namespace margelo::nitro::multipleimagepicker {
5245
[[maybe_unused]]
5346
static jni::local_ref<JNitroPreviewConfig::javaobject> fromCpp(const NitroPreviewConfig& value) {
5447
return newInstance(
55-
value.index,
56-
JLanguage::fromCpp(value.language),
57-
value.backgroundColor.has_value() ? jni::JDouble::valueOf(value.backgroundColor.value()) : nullptr
48+
JLanguage::fromCpp(value.language)
5849
);
5950
}
6051
};

Diff for: nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ abstract class HybridMultipleImagePickerSpec: HybridObject() {
6565

6666
@DoNotStrip
6767
@Keep
68-
abstract fun openPreview(media: Array<MediaPreview>, config: NitroPreviewConfig): Unit
68+
abstract fun openPreview(media: Array<MediaPreview>, index: Double, config: NitroPreviewConfig): Unit
6969

7070
private external fun initHybrid(): HybridData
7171

Diff for: nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/NitroPreviewConfig.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,5 @@ import com.margelo.nitro.core.*
1717
@DoNotStrip
1818
@Keep
1919
data class NitroPreviewConfig(
20-
val index: Double,
21-
val language: Language,
22-
val backgroundColor: Double?
20+
val language: Language
2321
)

Diff for: nitrogen/generated/ios/c++/HybridMultipleImagePickerSpecSwift.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ namespace margelo::nitro::multipleimagepicker {
115115
inline void openCrop(const std::string& image, const NitroCropConfig& config, const std::function<void(const CropResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override {
116116
_swiftPart.openCrop(image, config, resolved, rejected);
117117
}
118-
inline void openPreview(const std::vector<MediaPreview>& media, const NitroPreviewConfig& config) override {
119-
_swiftPart.openPreview(media, config);
118+
inline void openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config) override {
119+
_swiftPart.openPreview(media, std::forward<decltype(index)>(index), config);
120120
}
121121

122122
private:

Diff for: nitrogen/generated/ios/swift/HybridMultipleImagePickerSpec.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ public protocol HybridMultipleImagePickerSpec: AnyObject, HybridObjectSpec {
3434
// Methods
3535
func openPicker(config: NitroConfig, resolved: @escaping ((_ result: [Result]) -> Void), rejected: @escaping ((_ reject: Double) -> Void)) throws -> Void
3636
func openCrop(image: String, config: NitroCropConfig, resolved: @escaping ((_ result: CropResult) -> Void), rejected: @escaping ((_ reject: Double) -> Void)) throws -> Void
37-
func openPreview(media: [MediaPreview], config: NitroPreviewConfig) throws -> Void
37+
func openPreview(media: [MediaPreview], index: Double, config: NitroPreviewConfig) throws -> Void
3838
}

Diff for: nitrogen/generated/ios/swift/HybridMultipleImagePickerSpecCxx.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ public class HybridMultipleImagePickerSpecCxx {
147147
}
148148

149149
@inline(__always)
150-
public func openPreview(media: bridge.std__vector_MediaPreview_, config: NitroPreviewConfig) -> Void {
150+
public func openPreview(media: bridge.std__vector_MediaPreview_, index: Double, config: NitroPreviewConfig) -> Void {
151151
do {
152-
try self.__implementation.openPreview(media: media.map({ __item in __item }), config: config)
152+
try self.__implementation.openPreview(media: media.map({ __item in __item }), index: index, config: config)
153153
return
154154
} catch {
155155
let __message = "\(error.localizedDescription)"

Diff for: nitrogen/generated/ios/swift/NitroPreviewConfig.swift

+2-36
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,10 @@ public extension NitroPreviewConfig {
1818
/**
1919
* Create a new instance of `NitroPreviewConfig`.
2020
*/
21-
init(index: Double, language: Language, backgroundColor: Double?) {
22-
self.init(index, language, { () -> bridge.std__optional_double_ in
23-
if let __unwrappedValue = backgroundColor {
24-
return bridge.create_std__optional_double_(__unwrappedValue)
25-
} else {
26-
return .init()
27-
}
28-
}())
21+
init(language: Language) {
22+
self.init(language)
2923
}
3024

31-
var index: Double {
32-
@inline(__always)
33-
get {
34-
return self.__index
35-
}
36-
@inline(__always)
37-
set {
38-
self.__index = newValue
39-
}
40-
}
41-
4225
var language: Language {
4326
@inline(__always)
4427
get {
@@ -49,21 +32,4 @@ public extension NitroPreviewConfig {
4932
self.__language = newValue
5033
}
5134
}
52-
53-
var backgroundColor: Double? {
54-
@inline(__always)
55-
get {
56-
return self.__backgroundColor.value
57-
}
58-
@inline(__always)
59-
set {
60-
self.__backgroundColor = { () -> bridge.std__optional_double_ in
61-
if let __unwrappedValue = newValue {
62-
return bridge.create_std__optional_double_(__unwrappedValue)
63-
} else {
64-
return .init()
65-
}
66-
}()
67-
}
68-
}
6935
}

Diff for: nitrogen/generated/shared/c++/HybridMultipleImagePickerSpec.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ namespace margelo::nitro::multipleimagepicker {
6969
// Methods
7070
virtual void openPicker(const NitroConfig& config, const std::function<void(const std::vector<Result>& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) = 0;
7171
virtual void openCrop(const std::string& image, const NitroCropConfig& config, const std::function<void(const CropResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) = 0;
72-
virtual void openPreview(const std::vector<MediaPreview>& media, const NitroPreviewConfig& config) = 0;
72+
virtual void openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config) = 0;
7373

7474
protected:
7575
// Hybrid Setup

0 commit comments

Comments
 (0)