├── .github └── ISSUE_TEMPLATE.md ├── .gitignore ├── LICENSE ├── README.md ├── README_CN.md ├── app ├── .gitignore ├── build.gradle ├── demo │ └── demo_2023-12-17_060744_v3.11.2.apk ├── libs │ ├── arm64-v8a │ │ ├── libijkffmpeg.so │ │ ├── libijkplayer.so │ │ └── libijksdl.so │ └── armeabi │ │ ├── libijkffmpeg.so │ │ ├── libijkplayer.so │ │ └── libijksdl.so ├── proguard-rules.pro ├── signature │ └── picture.jks └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── luck │ │ └── pictureselector │ │ ├── App.java │ │ ├── CoilEngine.kt │ │ ├── CustomBottomNavBar.java │ │ ├── CustomCompleteSelectView.java │ │ ├── CustomLoadingDialog.java │ │ ├── CustomPreviewAdapter.java │ │ ├── CustomPreviewBottomNavBar.java │ │ ├── CustomPreviewFragment.java │ │ ├── CustomPreviewTitleBar.java │ │ ├── CustomTitleBar.java │ │ ├── ExoPlayerEngine.java │ │ ├── FullyGridLayoutManager.java │ │ ├── GlideEngine.java │ │ ├── IjkPlayerEngine.java │ │ ├── IjkPlayerView.java │ │ ├── ImageCacheUtils.java │ │ ├── ImageLoaderUtils.java │ │ ├── ImageUtil.java │ │ ├── InjectFragmentActivity.java │ │ ├── LineWrapRadioGroup.java │ │ ├── MainActivity.java │ │ ├── OnlyQueryDataActivity.java │ │ ├── PicassoEngine.java │ │ ├── PictureSelectorEngineImp.java │ │ ├── RoundedCornersTransform.java │ │ ├── SimpleActivity.java │ │ ├── VideoRequestHandler.java │ │ ├── adapter │ │ └── GridImageAdapter.java │ │ └── listener │ │ ├── DragListener.java │ │ └── OnItemLongClickListener.java │ └── res │ ├── drawable-hdpi │ └── ic_launcher.png │ ├── drawable-mdpi │ └── ic_launcher.png │ ├── drawable-xhdpi │ ├── ic_add_image.png │ ├── ic_dump_delete.png │ ├── ic_item_delete.png │ ├── ic_launcher.png │ ├── ic_mark_win.png │ ├── ic_minus.png │ ├── ic_normal_delete.png │ ├── ic_play.png │ └── ic_plus.png │ ├── drawable-xxhdpi │ ├── ic_check.png │ ├── ic_launcher.png │ ├── ic_orange_arrow_down.png │ └── ps_select_check.png │ ├── drawable-xxxhdpi │ └── ic_launcher.png │ ├── drawable │ ├── ps_demo_blue_num_normal.xml │ ├── ps_demo_blue_num_selected.xml │ ├── ps_demo_blue_num_selector.xml │ ├── ps_demo_custom_selector.xml │ ├── ps_demo_only_album_bg.xml │ ├── ps_demo_permission_desc_bg.xml │ ├── ps_demo_preview_blue_num_selected.xml │ ├── ps_demo_preview_blue_num_selector.xml │ ├── ps_demo_preview_grey_oval_normal.xml │ ├── ps_demo_transparent_bg.xml │ └── ps_demo_white_preview_selector.xml │ ├── layout │ ├── activity_inject_fragment.xml │ ├── activity_main.xml │ ├── activity_only_query_data.xml │ ├── activity_other.xml │ ├── activity_simp.xml │ ├── custom_alert_dialog.xml │ ├── gv_filter_image.xml │ ├── layout_number.xml │ ├── layout_video_number.xml │ ├── ps_custom_album_folder_item.xml │ ├── ps_custom_bottom_nav_bar.xml │ ├── ps_custom_complete_selected_layout.xml │ ├── ps_custom_fragment_preview.xml │ ├── ps_custom_fragment_selector.xml │ ├── ps_custom_item_grid_audio.xml │ ├── ps_custom_item_grid_image.xml │ ├── ps_custom_item_grid_video.xml │ ├── ps_custom_preview_gallery_item.xml │ ├── ps_custom_preview_image.xml │ ├── ps_custom_preview_video.xml │ └── ps_custom_title_bar.xml │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── camerax ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── luck │ │ └── lib │ │ └── camerax │ │ ├── CameraImageEngine.java │ │ ├── CustomCameraConfig.java │ │ ├── CustomCameraView.java │ │ ├── PictureCameraActivity.java │ │ ├── SimpleCameraX.java │ │ ├── listener │ │ ├── CameraListener.java │ │ ├── CameraXOrientationEventListener.java │ │ ├── CameraXPreviewViewTouchListener.java │ │ ├── CaptureListener.java │ │ ├── ClickListener.java │ │ ├── IObtainCameraView.java │ │ ├── ImageCallbackListener.java │ │ ├── OnSimpleXPermissionDeniedListener.java │ │ ├── OnSimpleXPermissionDescriptionListener.java │ │ └── TypeListener.java │ │ ├── permissions │ │ ├── PermissionChecker.java │ │ ├── PermissionResultCallback.java │ │ └── SimpleXPermissionUtil.java │ │ ├── utils │ │ ├── BitmapUtils.java │ │ ├── CameraUtils.java │ │ ├── DateUtils.java │ │ ├── DensityUtil.java │ │ ├── DoubleUtils.java │ │ ├── FileUtils.java │ │ └── SimpleXSpUtils.java │ │ └── widget │ │ ├── CaptureButton.java │ │ ├── CaptureLayout.java │ │ ├── FocusImageView.java │ │ ├── ReturnButton.java │ │ └── TypeButton.java │ └── res │ ├── anim │ └── focusview_show.xml │ ├── drawable-xxhdpi │ ├── focus_failed.9.png │ ├── focus_focused.9.png │ └── focus_focusing.9.png │ ├── drawable │ ├── picture_ic_camera.xml │ ├── picture_ic_flash_auto.xml │ ├── picture_ic_flash_off.xml │ └── picture_ic_flash_on.xml │ ├── layout │ └── picture_camera_view.xml │ ├── values-ar-rAE │ └── strings.xml │ ├── values-de-rDE │ └── strings.xml │ ├── values-en-rUS │ └── string.xml │ ├── values-es-rES │ └── strings.xml │ ├── values-fr-rFR │ └── strings.xml │ ├── values-ja-rJP │ └── strings.xml │ ├── values-ko-rKR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-ru-rRU │ └── strings.xml │ ├── values-vi-rVN │ └── string.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── compress ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── top │ │ └── zibin │ │ └── luban │ │ ├── Checker.java │ │ ├── CompressionPredicate.java │ │ ├── Engine.java │ │ ├── InputStreamAdapter.java │ │ ├── InputStreamProvider.java │ │ ├── Luban.java │ │ ├── LubanUtils.java │ │ ├── OnCompressListener.java │ │ ├── OnNewCompressListener.java │ │ ├── OnRenameListener.java │ │ └── io │ │ ├── ArrayAdapterInterface.java │ │ ├── ArrayPool.java │ │ ├── ArrayPoolProvide.java │ │ ├── BaseKeyPool.java │ │ ├── BufferedInputStreamWrap.java │ │ ├── ByteArrayAdapter.java │ │ ├── GroupedLinkedMap.java │ │ ├── IntegerArrayAdapter.java │ │ ├── LruArrayPool.java │ │ └── PoolAble.java │ └── res │ └── values │ └── strings.xml ├── config.gradle ├── debug ├── app-debug.apk └── output-metadata.json ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── ijkplayer-java ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── tv │ │ └── danmaku │ │ └── ijk │ │ └── media │ │ └── player │ │ └── ApplicationTest.java │ └── main │ ├── .classpath │ ├── .project │ ├── AndroidManifest.xml │ ├── java │ └── tv │ │ └── danmaku │ │ └── ijk │ │ └── media │ │ └── player │ │ ├── AbstractMediaPlayer.java │ │ ├── AndroidMediaPlayer.java │ │ ├── IMediaPlayer.java │ │ ├── ISurfaceTextureHolder.java │ │ ├── ISurfaceTextureHost.java │ │ ├── IjkLibLoader.java │ │ ├── IjkMediaCodecInfo.java │ │ ├── IjkMediaMeta.java │ │ ├── IjkMediaPlayer.java │ │ ├── IjkTimedText.java │ │ ├── MediaInfo.java │ │ ├── MediaPlayerProxy.java │ │ ├── TextureMediaPlayer.java │ │ ├── annotations │ │ ├── AccessedByNative.java │ │ └── CalledByNative.java │ │ ├── exceptions │ │ └── IjkMediaException.java │ │ ├── ffmpeg │ │ └── FFmpegApi.java │ │ ├── misc │ │ ├── AndroidMediaFormat.java │ │ ├── AndroidTrackInfo.java │ │ ├── IAndroidIO.java │ │ ├── IMediaDataSource.java │ │ ├── IMediaFormat.java │ │ ├── ITrackInfo.java │ │ ├── IjkMediaFormat.java │ │ └── IjkTrackInfo.java │ │ └── pragma │ │ ├── DebugLog.java │ │ └── Pragma.java │ ├── project.properties │ └── res │ └── values │ └── strings.xml ├── image ├── home.jpg ├── picture_audio.jpg ├── picture_circular_crop_new_style.jpg ├── picture_default_style_1.jpg ├── picture_default_style_2.jpg ├── picture_default_style_new_3.jpg ├── picture_framework_cn.png ├── picture_framework_es.png ├── picture_num_style_new_1.jpg ├── picture_num_style_new_2.jpg ├── picture_num_style_new_3.jpg ├── picture_sina_style_1.jpg ├── picture_sina_style_new_2.jpg ├── picture_sina_style_new_3.jpg ├── picture_video.jpg ├── picture_wechat_album_style.jpg ├── picture_wechat_single_style_3.jpg ├── picture_wechat_style_1.jpg ├── picture_wechat_style_2.jpg ├── picture_wechat_style_new_3.jpg ├── picture_white_style.jpeg └── test.png ├── publish.gradle ├── selector ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── luck │ │ └── picture │ │ └── lib │ │ ├── PictureOnlyCameraFragment.java │ │ ├── PictureSelectorFragment.java │ │ ├── PictureSelectorPreviewFragment.java │ │ ├── PictureSelectorSystemFragment.java │ │ ├── adapter │ │ ├── PictureAlbumAdapter.java │ │ ├── PictureImageGridAdapter.java │ │ ├── PicturePreviewAdapter.java │ │ └── holder │ │ │ ├── AudioViewHolder.java │ │ │ ├── BasePreviewHolder.java │ │ │ ├── BaseRecyclerMediaHolder.java │ │ │ ├── CameraViewHolder.java │ │ │ ├── ImageViewHolder.java │ │ │ ├── PreviewAudioHolder.java │ │ │ ├── PreviewGalleryAdapter.java │ │ │ ├── PreviewImageHolder.java │ │ │ ├── PreviewVideoHolder.java │ │ │ └── VideoViewHolder.java │ │ ├── animators │ │ ├── AlphaInAnimationAdapter.java │ │ ├── AnimationType.java │ │ ├── BaseAnimationAdapter.java │ │ ├── SlideInBottomAnimationAdapter.java │ │ └── ViewHelper.java │ │ ├── app │ │ ├── IApp.java │ │ └── PictureAppMaster.java │ │ ├── basic │ │ ├── FragmentInjectManager.java │ │ ├── IBridgeLoaderFactory.java │ │ ├── IBridgePictureBehavior.java │ │ ├── IBridgeViewLifecycle.java │ │ ├── IPictureSelectorCommonEvent.java │ │ ├── IPictureSelectorEvent.java │ │ ├── InterpolatorFactory.java │ │ ├── PictureCommonFragment.java │ │ ├── PictureContentResolver.java │ │ ├── PictureContextWrapper.java │ │ ├── PictureFileProvider.java │ │ ├── PictureMediaScannerConnection.java │ │ ├── PictureSelectionCameraModel.java │ │ ├── PictureSelectionModel.java │ │ ├── PictureSelectionPreviewModel.java │ │ ├── PictureSelectionQueryModel.java │ │ ├── PictureSelectionSystemModel.java │ │ ├── PictureSelector.java │ │ ├── PictureSelectorSupporterActivity.java │ │ └── PictureSelectorTransparentActivity.java │ │ ├── config │ │ ├── Crop.java │ │ ├── CustomIntentKey.java │ │ ├── FileSizeUnit.java │ │ ├── InjectResourceSource.java │ │ ├── PermissionEvent.java │ │ ├── PictureConfig.java │ │ ├── PictureMimeType.java │ │ ├── SelectLimitType.java │ │ ├── SelectMimeType.java │ │ ├── SelectModeConfig.java │ │ ├── SelectorConfig.java │ │ ├── SelectorProviders.java │ │ └── VideoQuality.java │ │ ├── decoration │ │ ├── GridSpacingItemDecoration.java │ │ ├── HorizontalItemDecoration.java │ │ ├── ViewPage2ItemDecoration.java │ │ └── WrapContentLinearLayoutManager.java │ │ ├── dialog │ │ ├── AlbumListPopWindow.java │ │ ├── PhotoItemSelectedDialog.java │ │ ├── PictureCommonDialog.java │ │ ├── PictureLoadingDialog.java │ │ └── RemindDialog.java │ │ ├── engine │ │ ├── CompressEngine.java │ │ ├── CompressFileEngine.java │ │ ├── CropEngine.java │ │ ├── CropFileEngine.java │ │ ├── ExtendLoaderEngine.java │ │ ├── ImageEngine.java │ │ ├── MediaPlayerEngine.java │ │ ├── PictureSelectorEngine.java │ │ ├── SandboxFileEngine.java │ │ ├── UriToFileTransformEngine.java │ │ └── VideoPlayerEngine.java │ │ ├── entity │ │ ├── LocalMedia.java │ │ ├── LocalMediaFolder.java │ │ ├── MediaData.java │ │ └── MediaExtraInfo.java │ │ ├── immersive │ │ ├── ImmersiveManager.java │ │ ├── LightStatusBarUtils.java │ │ └── RomUtils.java │ │ ├── interfaces │ │ ├── OnAlbumItemClickListener.java │ │ ├── OnBitmapWatermarkEventListener.java │ │ ├── OnCallbackIndexListener.java │ │ ├── OnCallbackListener.java │ │ ├── OnCameraInterceptListener.java │ │ ├── OnCustomLoadingListener.java │ │ ├── OnExternalPreviewEventListener.java │ │ ├── OnGridItemSelectAnimListener.java │ │ ├── OnInjectActivityPreviewListener.java │ │ ├── OnInjectLayoutResourceListener.java │ │ ├── OnItemClickListener.java │ │ ├── OnKeyValueResultCallbackListener.java │ │ ├── OnMediaEditInterceptListener.java │ │ ├── OnPermissionDeniedListener.java │ │ ├── OnPermissionDescriptionListener.java │ │ ├── OnPermissionsInterceptListener.java │ │ ├── OnPlayerListener.java │ │ ├── OnPreviewInterceptListener.java │ │ ├── OnQueryAlbumListener.java │ │ ├── OnQueryAllAlbumListener.java │ │ ├── OnQueryDataResultListener.java │ │ ├── OnQueryDataSourceListener.java │ │ ├── OnQueryFilterListener.java │ │ ├── OnRecordAudioInterceptListener.java │ │ ├── OnRecyclerViewPreloadMoreListener.java │ │ ├── OnRecyclerViewScrollListener.java │ │ ├── OnRecyclerViewScrollStateListener.java │ │ ├── OnRequestPermissionListener.java │ │ ├── OnResultCallbackListener.java │ │ ├── OnSelectAnimListener.java │ │ ├── OnSelectFilterListener.java │ │ ├── OnSelectLimitTipsListener.java │ │ └── OnVideoThumbnailEventListener.java │ │ ├── language │ │ ├── LanguageConfig.java │ │ ├── LocaleTransform.java │ │ └── PictureLanguageUtils.java │ │ ├── loader │ │ ├── IBridgeMediaLoader.java │ │ ├── LocalMediaLoader.java │ │ ├── LocalMediaPageLoader.java │ │ └── SandboxFileLoader.java │ │ ├── magical │ │ ├── BuildRecycleItemViewParams.java │ │ ├── MagicalView.java │ │ ├── MagicalViewWrapper.java │ │ ├── OnMagicalViewCallback.java │ │ └── ViewParams.java │ │ ├── manager │ │ ├── PictureCacheManager.java │ │ └── SelectedManager.java │ │ ├── obj │ │ └── pool │ │ │ └── ObjectPools.java │ │ ├── permissions │ │ ├── PermissionChecker.java │ │ ├── PermissionConfig.java │ │ ├── PermissionResultCallback.java │ │ └── PermissionUtil.java │ │ ├── photoview │ │ ├── Compat.java │ │ ├── CustomGestureDetector.java │ │ ├── OnGestureListener.java │ │ ├── OnMatrixChangedListener.java │ │ ├── OnOutsidePhotoTapListener.java │ │ ├── OnPhotoTapListener.java │ │ ├── OnScaleChangedListener.java │ │ ├── OnSingleFlingListener.java │ │ ├── OnViewDragListener.java │ │ ├── OnViewTapListener.java │ │ ├── PhotoView.java │ │ ├── PhotoViewAttacher.java │ │ └── Util.java │ │ ├── service │ │ └── ForegroundService.java │ │ ├── style │ │ ├── AlbumWindowStyle.java │ │ ├── BottomNavBarStyle.java │ │ ├── PictureSelectorStyle.java │ │ ├── PictureWindowAnimationStyle.java │ │ ├── SelectMainStyle.java │ │ └── TitleBarStyle.java │ │ ├── thread │ │ └── PictureThreadUtils.java │ │ ├── utils │ │ ├── ActivityCompatHelper.java │ │ ├── AnimUtils.java │ │ ├── BitmapUtils.java │ │ ├── DateUtils.java │ │ ├── DensityUtil.java │ │ ├── DoubleUtils.java │ │ ├── DownloadFileUtils.java │ │ ├── FileDirMap.java │ │ ├── IntentUtils.java │ │ ├── MediaStoreUtils.java │ │ ├── MediaUtils.java │ │ ├── PSEglUtils.java │ │ ├── PictureFileUtils.java │ │ ├── SandboxTransformUtils.java │ │ ├── SdkVersionUtils.java │ │ ├── SortUtils.java │ │ ├── SpUtils.java │ │ ├── StyleUtils.java │ │ ├── ToastUtils.java │ │ └── ValueOf.java │ │ └── widget │ │ ├── BottomNavBar.java │ │ ├── CompleteSelectView.java │ │ ├── MarqueeTextView.java │ │ ├── MediaPlayerView.java │ │ ├── MediumBoldTextView.java │ │ ├── PreviewBottomNavBar.java │ │ ├── PreviewTitleBar.java │ │ ├── RecyclerPreloadView.java │ │ ├── RoundCornerRelativeLayout.java │ │ ├── SlideSelectTouchListener.java │ │ ├── SlideSelectionHandler.java │ │ ├── SquareRelativeLayout.java │ │ └── TitleBar.java │ └── res │ ├── anim │ ├── ps_anim_album_dismiss.xml │ ├── ps_anim_album_show.xml │ ├── ps_anim_alpha_enter.xml │ ├── ps_anim_alpha_exit.xml │ ├── ps_anim_anticipate_interpolator.xml │ ├── ps_anim_down_out.xml │ ├── ps_anim_enter.xml │ ├── ps_anim_exit.xml │ ├── ps_anim_fade_in.xml │ ├── ps_anim_fade_out.xml │ ├── ps_anim_fall_enter.xml │ ├── ps_anim_layout_fall_enter.xml │ ├── ps_anim_modal_in.xml │ ├── ps_anim_modal_out.xml │ ├── ps_anim_overshoot_interpolator.xml │ └── ps_anim_up_in.xml │ ├── drawable-xxhdpi │ ├── ps_ic_audio.png │ ├── ps_ic_audio_placeholder.png │ ├── ps_ic_audio_play.png │ ├── ps_ic_audio_play_cover.png │ ├── ps_ic_audio_stop.png │ ├── ps_ic_back.png │ ├── ps_ic_black_back.png │ ├── ps_ic_camera.png │ ├── ps_ic_default_arrow.png │ ├── ps_ic_delete.png │ ├── ps_ic_editor.png │ ├── ps_ic_fast_play.png │ ├── ps_ic_grey_arrow.png │ ├── ps_ic_no_data.png │ ├── ps_ic_normal.png │ ├── ps_ic_normal_back.png │ ├── ps_ic_placeholder.png │ ├── ps_ic_preview_selected.png │ ├── ps_ic_progress.png │ ├── ps_ic_seek_bar_thumb.png │ ├── ps_ic_selected.png │ ├── ps_ic_shadow_bg.png │ ├── ps_ic_slow_audio.png │ ├── ps_ic_trans_1px.9.png │ ├── ps_ic_video.png │ └── ps_ic_video_play.png │ ├── drawable │ ├── ps_album_bg.xml │ ├── ps_anim_progress.xml │ ├── ps_audio_placeholder.xml │ ├── ps_btn_left_bottom_selector.xml │ ├── ps_btn_left_normal.xml │ ├── ps_btn_left_select.xml │ ├── ps_btn_right_bottom_selector.xml │ ├── ps_btn_right_normal.xml │ ├── ps_btn_right_select.xml │ ├── ps_btn_selector.xml │ ├── ps_cancel_default_bg.xml │ ├── ps_checkbox_selector.xml │ ├── ps_default_num_oval_normal.xml │ ├── ps_default_num_oval_selected.xml │ ├── ps_default_num_selector.xml │ ├── ps_dialog_loading_bg.xml │ ├── ps_dialog_shadow.xml │ ├── ps_gif_tag.xml │ ├── ps_image_placeholder.xml │ ├── ps_item_select_bg.xml │ ├── ps_layer_progress.xml │ ├── ps_num_oval.xml │ ├── ps_orange_oval.xml │ ├── ps_original_checkbox.xml │ ├── ps_original_wechat_normal.xml │ ├── ps_original_wechat_selected.xml │ ├── ps_preview_checkbox_selector.xml │ ├── ps_preview_gallery_bg.xml │ ├── ps_preview_gallery_frame.xml │ ├── ps_seek_bar_thumb_normal.xml │ ├── ps_seek_bar_thumb_pressed.xml │ ├── ps_select_complete_bg.xml │ ├── ps_select_complete_normal_bg.xml │ ├── ps_transparent_space.xml │ ├── ps_view_normal.xml │ └── ps_view_press.xml │ ├── layout │ ├── ps_activity_container.xml │ ├── ps_album_folder_item.xml │ ├── ps_alert_dialog.xml │ ├── ps_bottom_nav_bar.xml │ ├── ps_common_dialog.xml │ ├── ps_complete_selected_layout.xml │ ├── ps_custom_preview_image.xml │ ├── ps_dialog_camera_selected.xml │ ├── ps_empty.xml │ ├── ps_fragment_preview.xml │ ├── ps_fragment_selector.xml │ ├── ps_item_grid_audio.xml │ ├── ps_item_grid_camera.xml │ ├── ps_item_grid_image.xml │ ├── ps_item_grid_video.xml │ ├── ps_preview_audio.xml │ ├── ps_preview_gallery_item.xml │ ├── ps_preview_image.xml │ ├── ps_preview_video.xml │ ├── ps_remind_dialog.xml │ ├── ps_title_bar.xml │ └── ps_window_folder.xml │ ├── raw │ └── ps_click_music.wav │ ├── values-ar-rAE │ └── strings.xml │ ├── values-cs-rCZ │ └── string.xml │ ├── values-de-rDE │ └── strings.xml │ ├── values-en-rUS │ └── string.xml │ ├── values-es-rES │ └── strings.xml │ ├── values-fr-rFR │ └── strings.xml │ ├── values-ja-rJP │ └── strings.xml │ ├── values-kk-rKZ │ └── string.xml │ ├── values-ko-rKR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-ru-rRU │ └── strings.xml │ ├── values-vi-rVN │ └── string.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values │ ├── attrs.xml │ ├── colors.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── ps_file_paths.xml ├── settings.gradle └── ucrop ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java └── com │ └── yalantis │ └── ucrop │ ├── OkHttpClientStore.java │ ├── UCrop.java │ ├── UCropActivity.java │ ├── UCropDevelopConfig.java │ ├── UCropFragment.java │ ├── UCropFragmentCallback.java │ ├── UCropGalleryAdapter.java │ ├── UCropImageEngine.java │ ├── UCropMultipleActivity.java │ ├── callback │ ├── BitmapCropCallback.java │ ├── BitmapLoadCallback.java │ ├── CropBoundsChangeListener.java │ └── OverlayViewChangeListener.java │ ├── decoration │ └── GridSpacingItemDecoration.java │ ├── model │ ├── AspectRatio.java │ ├── CropParameters.java │ ├── CustomIntentKey.java │ ├── ExifInfo.java │ └── ImageState.java │ ├── statusbar │ ├── ImmersiveManager.java │ ├── LightStatusBarUtils.java │ └── RomUtils.java │ ├── task │ ├── BitmapCropTask.java │ └── BitmapLoadTask.java │ ├── util │ ├── BitmapLoadUtils.java │ ├── CubicEasing.java │ ├── DensityUtil.java │ ├── EglUtils.java │ ├── FastBitmapDrawable.java │ ├── FileUtils.java │ ├── ImageHeaderParser.java │ ├── RectUtils.java │ ├── RotationGestureDetector.java │ └── SelectedStateListDrawable.java │ └── view │ ├── CropImageView.java │ ├── GestureCropImageView.java │ ├── OverlayView.java │ ├── TransformImageView.java │ ├── UCropView.java │ └── widget │ ├── AspectRatioTextView.java │ └── HorizontalProgressWheelView.java └── res ├── anim ├── ucrop_item_animation_fall_down.xml ├── ucrop_layout_animation_fall_down.xml ├── ucrop_loader_circle_path.xml └── ucrop_loader_circle_scale.xml ├── color └── ucrop_scale_text_view_selector.xml ├── drawable-hdpi ├── ucrop_ic_angle.png └── ucrop_ic_done.png ├── drawable-ldpi ├── ucrop_ic_angle.png └── ucrop_ic_done.png ├── drawable-mdpi ├── ucrop_ic_angle.png └── ucrop_ic_done.png ├── drawable-xhdpi ├── ucrop_ic_angle.png └── ucrop_ic_done.png ├── drawable-xxhdpi ├── ucrop_ic_angle.png └── ucrop_ic_done.png ├── drawable-xxxhdpi ├── ucrop_ic_angle.png └── ucrop_ic_done.png ├── drawable ├── ucrop_crop.xml ├── ucrop_gallery_bg.xml ├── ucrop_gallery_current.xml ├── ucrop_ic_crop.xml ├── ucrop_ic_crop_unselected.xml ├── ucrop_ic_cross.xml ├── ucrop_ic_next.xml ├── ucrop_ic_reset.xml ├── ucrop_ic_rotate.xml ├── ucrop_ic_rotate_unselected.xml ├── ucrop_ic_scale.xml ├── ucrop_ic_scale_unselected.xml ├── ucrop_rotate.xml ├── ucrop_scale.xml ├── ucrop_shadow_upside.xml ├── ucrop_vector_ic_crop.xml ├── ucrop_vector_loader.xml ├── ucrop_vector_loader_animated.xml └── ucrop_wrapper_controls_shape.xml ├── layout ├── ucrop_activity_multiple.xml ├── ucrop_activity_photobox.xml ├── ucrop_aspect_ratio.xml ├── ucrop_controls.xml ├── ucrop_fragment_photobox.xml ├── ucrop_gallery_adapter_item.xml ├── ucrop_layout_rotate_wheel.xml ├── ucrop_layout_scale_wheel.xml └── ucrop_view.xml ├── menu └── ucrop_menu_activity.xml ├── values-ar-rAE └── strings.xml ├── values-de-rDE └── strings.xml ├── values-en-rUS └── string.xml ├── values-es-rES └── strings.xml ├── values-fr-rFR └── strings.xml ├── values-ja-rJP └── strings.xml ├── values-ko-rKR └── strings.xml ├── values-pt-rPT └── strings.xml ├── values-ru-rRU └── strings.xml ├── values-vi-rVN └── string.xml ├── values-zh-rCN └── strings.xml ├── values-zh-rTW └── strings.xml └── values ├── attrs.xml ├── colors.xml ├── dimens.xml ├── public.xml ├── strings.xml ├── styles.xml └── values.xml /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Current use version? 2 | #### 当前使用的版本是多少? 3 | 4 | ``` 5 | 6 | ``` 7 | 8 | ## Will this problem occur in demo? 9 | #### Demo能否复现这问题? 10 | 11 | ``` 12 | 13 | ``` 14 | 15 | ## Describe the problem or provide an error log? 16 | #### 描述问题或提供错误log? 17 | 18 | ``` 19 | 20 | ``` 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | /.idea/ 10 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/demo/demo_2023-12-17_060744_v3.11.2.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/demo/demo_2023-12-17_060744_v3.11.2.apk -------------------------------------------------------------------------------- /app/libs/arm64-v8a/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/arm64-v8a/libijkffmpeg.so -------------------------------------------------------------------------------- /app/libs/arm64-v8a/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/arm64-v8a/libijkplayer.so -------------------------------------------------------------------------------- /app/libs/arm64-v8a/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/arm64-v8a/libijksdl.so -------------------------------------------------------------------------------- /app/libs/armeabi/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/armeabi/libijkffmpeg.so -------------------------------------------------------------------------------- /app/libs/armeabi/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/armeabi/libijkplayer.so -------------------------------------------------------------------------------- /app/libs/armeabi/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/libs/armeabi/libijksdl.so -------------------------------------------------------------------------------- /app/signature/picture.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/signature/picture.jks -------------------------------------------------------------------------------- /app/src/main/java/com/luck/pictureselector/CustomBottomNavBar.java: -------------------------------------------------------------------------------- 1 | package com.luck.pictureselector; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | 7 | import com.luck.picture.lib.widget.BottomNavBar; 8 | 9 | /** 10 | * @author:luck 11 | * @date:2021/11/17 10:46 上午 12 | * @describe:CustomBottomNavBar 13 | */ 14 | public class CustomBottomNavBar extends BottomNavBar implements View.OnClickListener { 15 | 16 | public CustomBottomNavBar(Context context) { 17 | super(context); 18 | } 19 | 20 | public CustomBottomNavBar(Context context, AttributeSet attrs) { 21 | super(context, attrs); 22 | } 23 | 24 | public CustomBottomNavBar(Context context, AttributeSet attrs, int defStyleAttr) { 25 | super(context, attrs, defStyleAttr); 26 | } 27 | 28 | @Override 29 | protected void inflateLayout() { 30 | inflate(getContext(), R.layout.ps_custom_bottom_nav_bar, this); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/luck/pictureselector/CustomPreviewBottomNavBar.java: -------------------------------------------------------------------------------- 1 | package com.luck.pictureselector; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import com.luck.picture.lib.widget.PreviewBottomNavBar; 7 | 8 | /** 9 | * @author:luck 10 | * @date:2021/11/17 10:46 上午 11 | * @describe:CustomPreviewBottomNavBar 12 | */ 13 | public class CustomPreviewBottomNavBar extends PreviewBottomNavBar { 14 | 15 | public CustomPreviewBottomNavBar(Context context) { 16 | super(context); 17 | } 18 | 19 | public CustomPreviewBottomNavBar(Context context, AttributeSet attrs) { 20 | super(context, attrs); 21 | } 22 | 23 | public CustomPreviewBottomNavBar(Context context, AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/luck/pictureselector/CustomPreviewFragment.java: -------------------------------------------------------------------------------- 1 | package com.luck.pictureselector; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.luck.picture.lib.PictureSelectorPreviewFragment; 6 | import com.luck.picture.lib.adapter.PicturePreviewAdapter; 7 | 8 | /** 9 | * @author:luck 10 | * @date:2022/2/21 4:15 下午 11 | * @describe:CustomPreviewFragment 12 | */ 13 | public class CustomPreviewFragment extends PictureSelectorPreviewFragment { 14 | 15 | public static CustomPreviewFragment newInstance() { 16 | CustomPreviewFragment fragment = new CustomPreviewFragment(); 17 | fragment.setArguments(new Bundle()); 18 | return fragment; 19 | } 20 | 21 | @Override 22 | public String getFragmentTag() { 23 | return CustomPreviewFragment.class.getSimpleName(); 24 | } 25 | 26 | @Override 27 | protected PicturePreviewAdapter createAdapter() { 28 | return new CustomPreviewAdapter(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/luck/pictureselector/CustomPreviewTitleBar.java: -------------------------------------------------------------------------------- 1 | package com.luck.pictureselector; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import com.luck.picture.lib.widget.PreviewTitleBar; 7 | 8 | /** 9 | * @author:luck 10 | * @date:2021/11/19 4:38 下午 11 | * @describe:CustomPreviewTitleBar 12 | */ 13 | public class CustomPreviewTitleBar extends PreviewTitleBar { 14 | 15 | public CustomPreviewTitleBar(Context context) { 16 | super(context); 17 | } 18 | 19 | public CustomPreviewTitleBar(Context context, AttributeSet attrs) { 20 | super(context, attrs); 21 | } 22 | 23 | public CustomPreviewTitleBar(Context context, AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/luck/pictureselector/listener/DragListener.java: -------------------------------------------------------------------------------- 1 | package com.luck.pictureselector.listener; 2 | 3 | /** 4 | * @author:luck 5 | * @date:2020-01-13 17:00 6 | * @describe:拖拽监听事件 7 | */ 8 | public interface DragListener { 9 | /** 10 | * 是否将 item拖动到删除处,根据状态改变颜色 11 | * 12 | * @param isDelete 13 | */ 14 | void deleteState(boolean isDelete); 15 | 16 | /** 17 | * 是否于拖拽状态 18 | * 19 | * @param start 20 | */ 21 | void dragState(boolean isStart); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/luck/pictureselector/listener/OnItemLongClickListener.java: -------------------------------------------------------------------------------- 1 | package com.luck.pictureselector.listener; 2 | 3 | import android.view.View; 4 | 5 | import androidx.recyclerview.widget.RecyclerView; 6 | 7 | /** 8 | * @author:luck 9 | * @date:2020-01-13 17:58 10 | * @describe:长按事件 11 | */ 12 | public interface OnItemLongClickListener { 13 | void onItemLongClick(RecyclerView.ViewHolder holder, int position, View v); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_add_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_add_image.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_dump_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_dump_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_item_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_item_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_mark_win.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_mark_win.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_minus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_normal_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_normal_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_play.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xhdpi/ic_plus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ic_check.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ic_orange_arrow_down.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ps_select_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxhdpi/ps_select_check.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LuckSiege/PictureSelector/a880156bbd4df2ebe254858b9f5acec0a7ca54c3/app/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_blue_num_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_blue_num_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_blue_num_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_custom_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_only_album_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_permission_desc_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_preview_blue_num_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_preview_blue_num_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_preview_grey_oval_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_transparent_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ps_demo_white_preview_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_only_query_data.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_simp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_alert_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/ps_custom_preview_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #393a3e 4 | #000000 5 | #f6f6f6 6 | #fafafa 7 | #B6B6B6 8 | #f94c51 9 | #43c117 10 | #53575e 11 | #00000000 12 | #FFFFFF 13 | #E0DBDBDB 14 | #7D7DFF 15 | #9b9b9b 16 | #E0FF6100 17 | #FF0000 18 | #CCFF0000 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | PictureSelector 3 | 拖动到此处删除 4 | 松手即可删除 5 | 发送 6 | 发送(%1$d/%2$d) 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 |