Skip to content

🌈 HXPhoto Picker & Nitro Modules #173

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
cce00e1
✨ feat: convert to HXPhotoPicker && using nitro module
baronha Oct 23, 2024
de1b9d7
✨ feat: doing nitro modules
baronha Oct 23, 2024
ee63bb3
✨ feat: add editor for picker
baronha Oct 24, 2024
e099257
✨ feat: done iOS
baronha Oct 24, 2024
db8afbd
✨ feat: config nitro on Android still very very bugs
baronha Oct 26, 2024
56c5e65
✨ migrate to com.margelo.nitro.multipleimagepicker
baronha Oct 27, 2024
d24cbf7
🐛 bug: .R on Android
baronha Oct 27, 2024
48e4d12
✨ feat: upgrade nitro modules 0.14.0
baronha Oct 30, 2024
fe83d76
✨ feat: upgrade nitro 0.17 && improve Picture Selector on Android
baronha Nov 27, 2024
9484dab
✨ feat: add more android
baronha Nov 28, 2024
5caab21
✨ feat: upgrade nitro 0.18 and add more drawable for android xml
baronha Nov 28, 2024
5be0f94
✨ feat: Add more option for Android and save status for asset
baronha Nov 28, 2024
09e8d7a
✨ feat: completed android
baronha Nov 29, 2024
f26d2d1
🐛 fix: handle empty selected
baronha Nov 29, 2024
267e74a
✨ feat: add /example
baronha Dec 2, 2024
a526143
✨ feat: upgrade nitro 0.18.1
baronha Dec 2, 2024
b92d6a4
✨ feat: handle selected assets
baronha Dec 3, 2024
a08b1de
♻️ refactor: remove originalPath
baronha Dec 3, 2024
de829aa
✨ feat: add light mode for iOS
baronha Dec 3, 2024
3159d21
✨ feat: Add button close light mode for iOS
baronha Dec 4, 2024
43753d4
✨ feat: custom more language for Android
baronha Dec 4, 2024
db04a71
♻️ refactor: convert to Language Code
baronha Dec 4, 2024
99b9cb8
♻️ refactor: remove max photo config
baronha Dec 4, 2024
e4d6d85
✨ feat: double check language
baronha Dec 4, 2024
f759ca8
✨ feat: add video quality on android
baronha Dec 4, 2024
dd2259c
✨ feat: add JSDoc for Typescript
baronha Dec 4, 2024
8b9161b
🐛 fix: solved conflict nitro type options
baronha Dec 5, 2024
b881413
✨ feat: Docusaurus
baronha Dec 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
✨ feat: add video quality on android
  • Loading branch information
baronha committed Dec 4, 2024
commit f759ca864517b43f36c41f0e59b2c03c7545c22c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import top.zibin.luban.Luban
import top.zibin.luban.OnNewCompressListener
import java.io.File

class ImageFileCompressEngine : CompressFileEngine {
//TODO:
class CompressEngine : CompressFileEngine {
override fun onStartCompress(
context: Context,
source: ArrayList<Uri>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.margelo.nitro.multipleimagepicker

import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.media.MediaMetadataRetriever
import androidx.core.content.ContextCompat
import com.facebook.react.bridge.ColorPropConverter
import com.facebook.react.bridge.ReactApplicationContext
Expand All @@ -17,7 +15,6 @@ import com.luck.picture.lib.config.SelectMimeType
import com.luck.picture.lib.config.SelectModeConfig
import com.luck.picture.lib.engine.PictureSelectorEngine
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.entity.LocalMedia.generateLocalMedia
import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener
import com.luck.picture.lib.interfaces.OnResultCallbackListener
import com.luck.picture.lib.language.LanguageConfig
Expand All @@ -28,10 +25,6 @@ import com.luck.picture.lib.style.SelectMainStyle
import com.luck.picture.lib.style.TitleBarStyle
import com.luck.picture.lib.utils.DensityUtil
import com.yalantis.ucrop.UCrop.Options
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.util.UUID

class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
ReactContextBaseJavaModule(reactContext), IApp {
Expand Down Expand Up @@ -79,14 +72,19 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
val maxFileSize = config.maxFileSize?.toLong()
val maxDuration = config.maxVideoDuration?.toInt()
val allowSwipeToSelect = config.allowSwipeToSelect ?: false
val imageQuality = config.imageQuality
val videoQuality = config.videoQuality

val isMultiple = config.selectMode == SelectMode.MULTIPLE
val selectMode = if (isMultiple) SelectModeConfig.MULTIPLE else SelectModeConfig.SINGLE


val isCrop = config.crop != null

PictureSelector.create(activity).openGallery(chooseMode).setImageEngine(imageEngine)
PictureSelector.create(activity)
.openGallery(chooseMode)
.setImageEngine(imageEngine)
.setSelectedData(dataList)
.setSelectorUIStyle(style).apply {
if (isCrop) {
setCropOption()
Expand All @@ -100,13 +98,31 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
maxFileSize?.let {
setFilterMaxFileSize(it)
}
}.setImageSpanCount(config.numberOfColumn?.toInt() ?: 3).setMaxSelectNum(maxSelect)
.isDirectReturnSingle(true).isSelectZoomAnim(true).isPageStrategy(true, 50)

//TODO: set compress export
// if (imageQuality != null && imageQuality != 1.0) {
// setCompressEngine(CompressEngine())
// }

if (videoQuality != null && videoQuality != 1.0) {
setVideoQuality(if (videoQuality > 0.5) 1 else 0)
}
}
.setImageSpanCount(config.numberOfColumn?.toInt() ?: 3)
.setMaxSelectNum(maxSelect)
.isDirectReturnSingle(true)
.isSelectZoomAnim(true)
.isPageStrategy(true, 50)
.isWithSelectVideoImage(true)
.setMaxVideoSelectNum(if (maxVideo != 20) maxVideo else maxSelect)
.isMaxSelectEnabledMask(true).isAutoVideoPlay(true)
.isFastSlidingSelect(allowSwipeToSelect).isPageSyncAlbumCount(true)
.setSelectedData(dataList).isPreviewImage(isPreview).isPreviewVideo(isPreview)
.isMaxSelectEnabledMask(true)
.isAutoVideoPlay(true)
.isFastSlidingSelect(allowSwipeToSelect)
.isPageSyncAlbumCount(true)
// isPreview
.isPreviewImage(isPreview)
.isPreviewVideo(isPreview)
//
.isDisplayCamera(config.allowedCamera ?: true)
.isDisplayTimeAxis(true)
.setSelectionMode(selectMode)
Expand All @@ -120,8 +136,10 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
resolved(arrayOf())
return
}

// set dataList
dataList = localMedia.filterNotNull().toMutableList()

localMedia.forEach { item ->
if (item != null) {
val media = getResult(item)
Expand Down Expand Up @@ -227,7 +245,8 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
mainStyle.statusBarColor = background
mainStyle.mainListBackgroundColor = background
mainStyle.adapterPreviewGalleryItemSize = DensityUtil.dip2px(appContext, 52f);
mainStyle.adapterPreviewGalleryBackgroundResource = R.drawable.preview_gallery_bg
mainStyle.adapterPreviewGalleryBackgroundResource =
if (isDark) com.luck.picture.lib.R.drawable.ps_preview_gallery_bg else R.drawable.preview_gallery_white_bg
mainStyle.adapterPreviewGalleryFrameResource = R.drawable.preview_gallery_item
mainStyle.previewBackgroundColor = background

Expand All @@ -240,8 +259,6 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
// MAIN STYLE
mainStyle.isCompleteSelectRelativeTop = false
mainStyle.isPreviewDisplaySelectGallery = true
mainStyle.adapterPreviewGalleryBackgroundResource =
com.luck.picture.lib.R.drawable.ps_preview_gallery_bg
mainStyle.isAdapterItemIncludeEdge = true
mainStyle.isPreviewSelectRelativeBottom = false
// mainStyle.previewSelectTextSize = Constant.TOOLBAR_TEXT_SIZE
Expand Down Expand Up @@ -310,7 +327,6 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
height = item.cropImageHeight.toDouble()
}


val media = Result(
path,
fileName = item.fileName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.util.Log
import com.luck.picture.lib.basic.IBridgeLoaderFactory
import com.luck.picture.lib.config.InjectResourceSource
import com.luck.picture.lib.engine.*
import com.luck.picture.lib.engine.CompressEngine
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnInjectLayoutResourceListener
import com.luck.picture.lib.interfaces.OnResultCallbackListener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
android:right="-1dp"
android:top="-1dp">
<shape android:shape="rectangle">
<solid android:color="@color/app_color_3310" />
<solid android:color="@color/app_color_white_transparent" />
<padding
android:left="0dp"
android:right="0dp" />
Expand Down
2 changes: 1 addition & 1 deletion android/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
<color name="app_color_red">#FF0000</color>
<color name="app_color_pri">#FB9300</color>
<color name="app_color_33">#333333</color>
<color name="app_color_3310">#33333310</color>
<color name="app_color_3310">#0D333333</color>
</resources>
8 changes: 5 additions & 3 deletions example/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ export default function App() {
const response = await openPicker({
...options,
selectedAssets: Array.isArray(images) ? images : [images],
theme: 'dark',
theme: 'light',
language: 'vi',
imageQuality: 0.4,
videoQuality: 0.2,
imageQuality: 0.1,
videoQuality: 0.1,
crop: {
//
},
Expand All @@ -72,6 +72,8 @@ export default function App() {
// },
})

console.log('response: ', response)

setImages(Array.isArray(response) ? response : [response])
layoutEffect()
} catch (e) {
Expand Down
4 changes: 4 additions & 0 deletions ios/HybridMultipleImagePicker+Config.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ extension HybridMultipleImagePicker {
config.maximumSelectedVideoDuration = Int(maxVideoDuration)
}

if let maxSelect = options.maxSelect {
config.maximumSelectedCount = Int(maxSelect)
}

config.allowSyncICloudWhenSelectPhoto = true

config.allowCustomTransitionAnimation = true
Expand Down
23 changes: 20 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ export async function openPicker<T extends Config>(
config.theme = theme
}

if (config?.language && !LANGUAGES.includes(config.language)) {
config.language = 'system'
}

return Picker.openPicker(
config,
(result: Result[]) => {
Expand All @@ -47,9 +51,6 @@ const DEFAULT_COUNT = 20
export const defaultOptions: Config = {
maxSelect: DEFAULT_COUNT,
maxVideo: DEFAULT_COUNT,

maxFileSize: 0,

primaryColor: '#FB9300',
backgroundDark: '#2f2f2f',
allowedCamera: true,
Expand All @@ -66,3 +67,19 @@ export const defaultOptions: Config = {
theme: 'system',
isHiddenOriginalButton: false,
}

const LANGUAGES = [
'system',
'zh-Hans',
'zh-Hant',
'ja',
'ko',
'en',
'th',
'id',
'vi',
'ru',
'de',
'fr',
'ar',
] as const