├── .gitignore ├── PhotoPicker ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── me │ │ └── iwf │ │ └── photopicker │ │ ├── PhotoPagerActivity.java │ │ ├── PhotoPicker.java │ │ ├── PhotoPickerActivity.java │ │ ├── PhotoPreview.java │ │ ├── adapter │ │ ├── PhotoGridAdapter.java │ │ ├── PhotoPagerAdapter.java │ │ ├── PopupDirectoryListAdapter.java │ │ └── SelectableAdapter.java │ │ ├── entity │ │ ├── Photo.java │ │ └── PhotoDirectory.java │ │ ├── event │ │ ├── OnItemCheckListener.java │ │ ├── OnPhotoClickListener.java │ │ └── Selectable.java │ │ ├── fragment │ │ ├── ImagePagerFragment.java │ │ └── PhotoPickerFragment.java │ │ ├── utils │ │ ├── AndroidLifecycleUtils.java │ │ ├── FileUtils.java │ │ ├── ImageCaptureManager.java │ │ ├── MediaStoreHelper.java │ │ ├── PermissionsConstant.java │ │ ├── PermissionsUtils.java │ │ ├── PhotoDirectoryLoader.java │ │ └── PhotoFileProvider.java │ │ └── widget │ │ ├── SquareItemLayout.java │ │ └── TouchImageView.java │ └── res │ ├── drawable-v21 │ └── __picker_bg_material_item.xml │ ├── drawable-xxhdpi │ ├── __picker_checkbox_marked.png │ ├── __picker_checkbox_n.png │ ├── __picker_ic_broken_image_black_48dp.png │ ├── __picker_ic_camera_n.png │ ├── __picker_ic_camera_p.png │ ├── __picker_ic_delete_black_24dp.png │ ├── __picker_ic_delete_n.png │ ├── __picker_ic_delete_p.png │ └── __picker_ic_photo_black_48dp.png │ ├── drawable │ ├── __picker_bg_material_item.xml │ ├── __picker_camera.xml │ ├── __picker_checkbox_bg.xml │ ├── __picker_delete.xml │ └── __picker_photo_bg.xml │ ├── layout │ ├── __picker_activity_photo_pager.xml │ ├── __picker_activity_photo_picker.xml │ ├── __picker_fragment_photo_picker.xml │ ├── __picker_item_directory.xml │ ├── __picker_item_photo.xml │ ├── __picker_picker_fragment_image_pager.xml │ ├── __picker_picker_item_pager.xml │ └── __picker_toolbar.xml │ ├── menu │ ├── __picker_menu_picker.xml │ └── __picker_menu_preview.xml │ ├── values-v21 │ └── colors.xml │ ├── values-zh │ └── strings.xml │ ├── values │ ├── colors.xml │ ├── dimen.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── __picker_provider_paths.xml ├── README.md ├── app ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── about.html │ └── icon_photo_add.png │ ├── java │ └── me │ │ └── cl │ │ └── lingxi │ │ ├── adapter │ │ ├── EvaluateAdapter.java │ │ ├── FeedAdapter.java │ │ ├── FeedPhotoAdapter.java │ │ ├── FutureAdapter.java │ │ ├── PhotoSelAdapter.java │ │ ├── PublicLicenseAdapter.java │ │ ├── RelevantAdapter.java │ │ ├── ReplyAdapter.java │ │ ├── TopicEitAdapter.java │ │ ├── UserInfoAdapter.java │ │ └── ViewPagerAdapter.java │ │ ├── common │ │ ├── config │ │ │ ├── Api.java │ │ │ └── Constants.java │ │ ├── glide │ │ │ ├── CustomGlideExtension.java │ │ │ ├── CustomGlideModule.java │ │ │ └── OkHttpLibraryGlideModule.java │ │ ├── okhttp │ │ │ ├── GetRequest.java │ │ │ ├── HttpLoggerInterceptor.java │ │ │ ├── OkUtil.java │ │ │ ├── PostRequest.java │ │ │ └── ResultCallback.java │ │ ├── result │ │ │ ├── Result.java │ │ │ └── ResultConstant.java │ │ ├── util │ │ │ ├── ContentUtil.java │ │ │ ├── DateUtil.java │ │ │ ├── FeedContentUtil.java │ │ │ ├── GsonUtil.java │ │ │ ├── ImageUtil.java │ │ │ ├── MD5Util.java │ │ │ ├── NetworkUtil.java │ │ │ ├── SPUtil.java │ │ │ └── Utils.java │ │ └── widget │ │ │ ├── AppBarStateChangeListener.java │ │ │ └── GridItemDecoration.java │ │ ├── dialog │ │ ├── EditTextDialog.java │ │ ├── FutureDialog.java │ │ └── LogoutDialog.java │ │ ├── entity │ │ ├── AppVersion.java │ │ ├── Comment.java │ │ ├── Feed.java │ │ ├── Future.java │ │ ├── Like.java │ │ ├── PageInfo.java │ │ ├── PublicLicense.java │ │ ├── Relevant.java │ │ ├── Reply.java │ │ ├── Topic.java │ │ ├── User.java │ │ ├── UserInfo.java │ │ └── UserToken.java │ │ ├── module │ │ ├── LxApplication.java │ │ ├── feed │ │ │ ├── FeedActivity.java │ │ │ ├── PublishActivity.java │ │ │ ├── ShareFeedActivity.java │ │ │ └── TopicEitActivity.java │ │ ├── future │ │ │ └── FutureActivity.java │ │ ├── main │ │ │ ├── FeedFragment.java │ │ │ ├── FutureFragment.java │ │ │ ├── HomeFragment.java │ │ │ ├── MainActivity.java │ │ │ ├── MessageChildFragment.java │ │ │ ├── MessageFragment.java │ │ │ └── MineFragment.java │ │ ├── member │ │ │ ├── LoginActivity.java │ │ │ ├── RegisterActivity.java │ │ │ ├── ResetPwdActivity.java │ │ │ └── UserActivity.java │ │ ├── mine │ │ │ ├── PersonalInfoActivity.java │ │ │ └── RelevantActivity.java │ │ ├── search │ │ │ └── SearchActivity.java │ │ ├── setting │ │ │ ├── AboutActivity.java │ │ │ ├── PublicLicenseActivity.java │ │ │ └── SettingsActivity.java │ │ ├── splash │ │ │ └── SplashActivity.java │ │ └── webview │ │ │ └── WebActivity.java │ │ ├── view │ │ ├── FlowRadioGroup.java │ │ ├── JellyScrollView.java │ │ ├── textview │ │ │ ├── ClickableImageSpan.java │ │ │ ├── ClickableMovementMethod.java │ │ │ └── NoLineClickableSpan.java │ │ └── webview │ │ │ ├── MoeChromeClient.java │ │ │ ├── MoeWebClient.java │ │ │ └── MoeWebView.java │ │ └── viewmodel │ │ ├── FeedViewModel.java │ │ ├── FutureViewModel.java │ │ ├── TopicViewModel.java │ │ ├── UploadViewModel.java │ │ └── UserViewModel.java │ └── res │ ├── color │ ├── bottom_navigation_selector.xml │ ├── future_selector.xml │ ├── inc_episode_selector.xml │ └── selector_text.xml │ ├── drawable │ ├── btn_publish_selector.xml │ ├── future_selector.xml │ ├── home_card_shape.xml │ ├── ic_accessory.xml │ ├── ic_browse.xml │ ├── ic_camera.xml │ ├── ic_camera_add.xml │ ├── ic_camera_fill.xml │ ├── ic_camera_selector.xml │ ├── ic_comment.xml │ ├── ic_delete.xml │ ├── ic_delete_fill.xml │ ├── ic_eit.xml │ ├── ic_favorite.xml │ ├── ic_home.xml │ ├── ic_homepage.xml │ ├── ic_homepage_fill.xml │ ├── ic_homepage_selector.xml │ ├── ic_interactive.xml │ ├── ic_interactive_fill.xml │ ├── ic_interactive_selector.xml │ ├── ic_like.xml │ ├── ic_like_fill.xml │ ├── ic_like_selector.xml │ ├── ic_message.xml │ ├── ic_mine.xml │ ├── ic_mine_fill.xml │ ├── ic_mine_selector.xml │ ├── ic_more.xml │ ├── ic_more_badge.xml │ ├── ic_ok.xml │ ├── ic_password.xml │ ├── ic_people.xml │ ├── ic_photo.xml │ ├── ic_postbox.png │ ├── ic_search.xml │ ├── ic_search_t.xml │ ├── ic_send.xml │ ├── ic_setup.xml │ ├── ic_skip.xml │ ├── ic_topic.xml │ ├── ic_user.xml │ ├── img_future_bg.9.png │ ├── img_lingxi.png │ ├── img_login.jpg │ ├── img_miaozi.png │ ├── img_mine_bc.9.png │ ├── img_user.png │ ├── inc_episode_selector.xml │ ├── more_entry_selector.xml │ ├── nav_bg.xml │ ├── nav_item_bg.xml │ ├── nav_item_bg_selector.xml │ ├── shape_badge.xml │ ├── shape_edit.xml │ └── shape_search.xml │ ├── layout │ ├── about_activity.xml │ ├── edit_dialog.xml │ ├── feed_action_include.xml │ ├── feed_activity.xml │ ├── feed_detail_recycle_item.xml │ ├── feed_evaluate_recycle_item.xml │ ├── feed_fragment.xml │ ├── feed_info_include.xml │ ├── feed_like_include.xml │ ├── feed_reply_recycle_item.xml │ ├── future_activity.xml │ ├── future_dialog.xml │ ├── future_fragment.xml │ ├── future_recycle_item.xml │ ├── home_fragment.xml │ ├── include_bottom_navigation.xml │ ├── include_recycler_view.xml │ ├── include_tab_layout.xml │ ├── include_toolbar.xml │ ├── login_activity.xml │ ├── main_menu_badge.xml │ ├── message_child_fragment.xml │ ├── message_fragment.xml │ ├── mian_activity.xml │ ├── mine_fragment.xml │ ├── mine_logout_dialog.xml │ ├── personal_info_activity.xml │ ├── public_license_activity.xml │ ├── public_license_recycle_item.xml │ ├── publish_activity.xml │ ├── publish_photo_recycle_item.xml │ ├── registe_activity.xml │ ├── relevant_activity.xml │ ├── relevant_recycle_item.xml │ ├── resetpwd_activity.xml │ ├── search_activity.xml │ ├── settings_activity.xml │ ├── splash_activity.xml │ ├── topic_eit_activity.xml │ ├── topic_eit_recycle_item.xml │ ├── user_activity.xml │ └── web_activity.xml │ ├── menu │ ├── future_menu.xml │ ├── navigation_menu.xml │ ├── publish_menu.xml │ ├── search_menu.xml │ ├── search_view_menu.xml │ └── send_menu.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-nodpi │ └── ic_launcher_background.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values-en │ └── strings.xml │ ├── values-v21 │ ├── colors.xml │ └── styles.xml │ ├── values-v23 │ └── colors.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ ├── network_security_config.xml │ ├── preference_setting.xml │ └── provider_paths.xml ├── build.gradle ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── com │ │ ├── bm │ │ │ └── library │ │ │ │ ├── Info.java │ │ │ │ ├── PhotoView.java │ │ │ │ └── RotateGestureDetector.java │ │ └── library │ │ │ └── flowlayout │ │ │ ├── FlowLayoutManager.java │ │ │ └── SpaceItemDecoration.java │ └── me │ │ └── cl │ │ └── library │ │ ├── base │ │ ├── BaseActivity.java │ │ └── BaseFragment.java │ │ ├── loadmore │ │ ├── LoadMord.java │ │ ├── LoadMoreAdapter.java │ │ ├── LoadMoreViewHolder.java │ │ └── OnLoadMoreListener.java │ │ ├── model │ │ └── TipMessage.java │ │ ├── photo │ │ ├── PhotoActivity.java │ │ ├── PhotoAdapter.java │ │ ├── PhotoBrowser.java │ │ ├── PhotoDownloadService.java │ │ ├── PhotoListener.java │ │ └── PhotoViewPager.java │ │ ├── recycle │ │ ├── ItemAnimator.java │ │ └── ItemDecoration.java │ │ ├── util │ │ ├── ColorPhrase.java │ │ ├── ToastUtil.java │ │ └── ToolbarUtil.java │ │ └── view │ │ ├── LoadingDialog.java │ │ └── MoeToast.java │ └── res │ ├── drawable │ ├── ic_navigate.xml │ ├── img_toast_bc.9.png │ ├── loading_frame.xml │ ├── loading_icon_1.png │ ├── loading_icon_2.png │ ├── loading_icon_3.png │ ├── loading_icon_4.png │ └── photo_text_shape.xml │ ├── layout │ ├── lib_dialog_progress.xml │ ├── lib_load_more.xml │ ├── photo_activity.xml │ └── photo_adapter_item.xml │ └── values │ └── value.xml ├── screenshot ├── Screenshot_about.jpg ├── Screenshot_feed.jpg ├── Screenshot_home.jpg ├── Screenshot_login.jpg ├── Screenshot_message.jpg ├── Screenshot_mine.jpg ├── Screenshot_publish.jpg ├── Screenshot_relevant.jpg ├── Screenshot_user.jpg └── Screenshot_welcome.jpg └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | /.gradle 2 | /.idea 3 | /alpha 4 | /app/build 5 | /app/app.iml 6 | /build 7 | /captures 8 | /library/build 9 | /library/library.iml 10 | /online 11 | /PhotoPicker/build 12 | /PhotoPicker/PhotoPicker.iml 13 | /lingcikey.jks 14 | /lingxi-android.iml 15 | /local.properties -------------------------------------------------------------------------------- /PhotoPicker/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | 5 | compileSdkVersion libs.versions.compileSdk.get() 6 | 7 | resourcePrefix "__picker_" 8 | 9 | dexOptions { 10 | javaMaxHeapSize "4g" 11 | } 12 | 13 | defaultConfig { 14 | minSdkVersion libs.versions.minSdk.get() 15 | targetSdkVersion libs.versions.targetSdk.get() 16 | } 17 | 18 | lintOptions { 19 | abortOnError false 20 | } 21 | 22 | } 23 | 24 | dependencies { 25 | api fileTree(dir: 'libs', include: ['*.jar']) 26 | api project(":library") 27 | } -------------------------------------------------------------------------------- /PhotoPicker/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/entity/Photo.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.entity; 2 | 3 | /** 4 | * Created by donglua on 15/6/30. 5 | */ 6 | public class Photo { 7 | 8 | private int id; 9 | private String path; 10 | 11 | public Photo(int id, String path) { 12 | this.id = id; 13 | this.path = path; 14 | } 15 | 16 | public Photo() { 17 | } 18 | 19 | @Override public boolean equals(Object o) { 20 | if (this == o) return true; 21 | if (!(o instanceof Photo)) return false; 22 | 23 | Photo photo = (Photo) o; 24 | 25 | return id == photo.id; 26 | } 27 | 28 | @Override public int hashCode() { 29 | return id; 30 | } 31 | 32 | public String getPath() { 33 | return path; 34 | } 35 | 36 | public void setPath(String path) { 37 | this.path = path; 38 | } 39 | 40 | public int getId() { 41 | return id; 42 | } 43 | 44 | public void setId(int id) { 45 | this.id = id; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/event/OnItemCheckListener.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.event; 2 | 3 | import me.iwf.photopicker.entity.Photo; 4 | 5 | /** 6 | * Created by donglua on 15/6/20. 7 | */ 8 | public interface OnItemCheckListener { 9 | 10 | /*** 11 | * 12 | * @param position 所选图片的位置 13 | * @param path 所选的图片 14 | * @param selectedItemCount 已选数量 15 | * @return enable check 16 | */ 17 | boolean onItemCheck(int position, Photo path, int selectedItemCount); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/event/OnPhotoClickListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2015. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 3 | * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. 4 | * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. 5 | * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. 6 | * Vestibulum commodo. Ut rhoncus gravida arcu. 7 | */ 8 | 9 | package me.iwf.photopicker.event; 10 | 11 | import android.view.View; 12 | 13 | /** 14 | * Created by donglua on 15/6/20. 15 | */ 16 | public interface OnPhotoClickListener { 17 | 18 | void onClick(View v, int position, boolean showCamera); 19 | } 20 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/event/Selectable.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.event; 2 | 3 | import me.iwf.photopicker.entity.Photo; 4 | 5 | /** 6 | * Created by donglua on 15/6/30. 7 | */ 8 | public interface Selectable { 9 | 10 | 11 | /** 12 | * Indicates if the item at position position is selected 13 | * 14 | * @param photo Photo of the item to check 15 | * @return true if the item is selected, false otherwise 16 | */ 17 | boolean isSelected(Photo photo); 18 | 19 | /** 20 | * Toggle the selection status of the item at a given position 21 | * 22 | * @param photo Photo of the item to toggle the selection status for 23 | */ 24 | void toggleSelection(Photo photo); 25 | 26 | /** 27 | * Clear the selection status for all items 28 | */ 29 | void clearSelection(); 30 | 31 | /** 32 | * Count the selected items 33 | * 34 | * @return Selected items count 35 | */ 36 | int getSelectedItemCount(); 37 | 38 | } 39 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/utils/AndroidLifecycleUtils.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.utils; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | 6 | import androidx.fragment.app.Fragment; 7 | import androidx.fragment.app.FragmentActivity; 8 | 9 | public class AndroidLifecycleUtils { 10 | public static boolean canLoadImage(Fragment fragment) { 11 | if (fragment == null) { 12 | return true; 13 | } 14 | 15 | FragmentActivity activity = fragment.getActivity(); 16 | 17 | return canLoadImage(activity); 18 | } 19 | 20 | public static boolean canLoadImage(Context context) { 21 | if (context == null) { 22 | return true; 23 | } 24 | 25 | if (!(context instanceof Activity)) { 26 | return true; 27 | } 28 | 29 | Activity activity = (Activity) context; 30 | return canLoadImage(activity); 31 | } 32 | 33 | public static boolean canLoadImage(Activity activity) { 34 | if (activity == null) { 35 | return true; 36 | } 37 | 38 | boolean destroyed = activity.isDestroyed(); 39 | 40 | return !destroyed && !activity.isFinishing(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/utils/FileUtils.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.utils; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by myc on 2016/12/14. 7 | * More Code on 1101255053@qq.com 8 | * Description: 9 | */ 10 | public class FileUtils { 11 | public static boolean fileIsExists(String path) { 12 | if (path == null || path.trim().length() <= 0) { 13 | return false; 14 | } 15 | try { 16 | File f = new File(path); 17 | if (!f.exists()) { 18 | return false; 19 | } 20 | } catch (Exception e) { 21 | return false; 22 | } 23 | return true; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/utils/PermissionsConstant.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.utils; 2 | 3 | import android.Manifest; 4 | 5 | /** 6 | * Created by donglua on 2016/10/19. 7 | */ 8 | 9 | public class PermissionsConstant { 10 | 11 | public static final int REQUEST_CAMERA = 1; 12 | public static final int REQUEST_EXTERNAL_READ = 2; 13 | public static final int REQUEST_EXTERNAL_WRITE = 3; 14 | 15 | public static final String[] PERMISSIONS_CAMERA = { 16 | Manifest.permission.CAMERA, 17 | Manifest.permission.WRITE_EXTERNAL_STORAGE 18 | }; 19 | public static final String[] PERMISSIONS_EXTERNAL_WRITE = { 20 | Manifest.permission.WRITE_EXTERNAL_STORAGE 21 | }; 22 | 23 | public static final String[] PERMISSIONS_EXTERNAL_READ = { 24 | Manifest.permission.READ_EXTERNAL_STORAGE 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/utils/PermissionsUtils.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.utils; 2 | 3 | import android.app.Activity; 4 | import android.content.pm.PackageManager; 5 | 6 | import androidx.core.app.ActivityCompat; 7 | import androidx.core.content.ContextCompat; 8 | import androidx.fragment.app.Fragment; 9 | 10 | import static android.Manifest.permission.CAMERA; 11 | import static android.Manifest.permission.READ_EXTERNAL_STORAGE; 12 | import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; 13 | 14 | /** 15 | * Created by donglua on 2016/10/19. 16 | */ 17 | 18 | public class PermissionsUtils { 19 | 20 | public static boolean checkReadStoragePermission(Activity activity) { 21 | if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { 22 | return true; 23 | } 24 | int readStoragePermissionState = 25 | ContextCompat.checkSelfPermission(activity, READ_EXTERNAL_STORAGE); 26 | 27 | boolean readStoragePermissionGranted = readStoragePermissionState == PackageManager.PERMISSION_GRANTED; 28 | 29 | if (!readStoragePermissionGranted) { 30 | ActivityCompat.requestPermissions(activity, 31 | PermissionsConstant.PERMISSIONS_EXTERNAL_READ, 32 | PermissionsConstant.REQUEST_EXTERNAL_READ); 33 | } 34 | return readStoragePermissionGranted; 35 | } 36 | 37 | public static boolean checkWriteStoragePermission(Fragment fragment) { 38 | 39 | int writeStoragePermissionState = 40 | ContextCompat.checkSelfPermission(fragment.getContext(), WRITE_EXTERNAL_STORAGE); 41 | 42 | boolean writeStoragePermissionGranted = writeStoragePermissionState == PackageManager.PERMISSION_GRANTED; 43 | 44 | if (!writeStoragePermissionGranted) { 45 | fragment.requestPermissions(PermissionsConstant.PERMISSIONS_EXTERNAL_WRITE, 46 | PermissionsConstant.REQUEST_EXTERNAL_WRITE); 47 | } 48 | return writeStoragePermissionGranted; 49 | } 50 | 51 | public static boolean checkCameraPermission(Fragment fragment) { 52 | int cameraPermissionState = ContextCompat.checkSelfPermission(fragment.getContext(), CAMERA); 53 | 54 | boolean cameraPermissionGranted = cameraPermissionState == PackageManager.PERMISSION_GRANTED; 55 | 56 | if (!cameraPermissionGranted) { 57 | fragment.requestPermissions(PermissionsConstant.PERMISSIONS_CAMERA, 58 | PermissionsConstant.REQUEST_CAMERA); 59 | } 60 | return cameraPermissionGranted; 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/utils/PhotoDirectoryLoader.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.utils; 2 | 3 | import android.content.Context; 4 | import android.net.Uri; 5 | import android.provider.MediaStore.Images.Media; 6 | 7 | import androidx.loader.content.CursorLoader; 8 | 9 | import static android.provider.MediaStore.MediaColumns.MIME_TYPE; 10 | 11 | /** 12 | * Created by 黄东鲁 on 15/6/28. 13 | */ 14 | public class PhotoDirectoryLoader extends CursorLoader { 15 | 16 | final String[] IMAGE_PROJECTION = { 17 | Media._ID, 18 | Media.DATA, 19 | Media.BUCKET_ID, 20 | Media.BUCKET_DISPLAY_NAME, 21 | Media.DATE_ADDED, 22 | Media.SIZE 23 | }; 24 | 25 | public PhotoDirectoryLoader(Context context, boolean showGif) { 26 | super(context); 27 | 28 | setProjection(IMAGE_PROJECTION); 29 | setUri(Media.EXTERNAL_CONTENT_URI); 30 | setSortOrder(Media.DATE_ADDED + " DESC"); 31 | 32 | setSelection( 33 | MIME_TYPE + "=? or " + MIME_TYPE + "=? or "+ MIME_TYPE + "=? " + (showGif ? ("or " + MIME_TYPE + "=?") : "")); 34 | String[] selectionArgs; 35 | if (showGif) { 36 | selectionArgs = new String[] { "image/jpeg", "image/png", "image/jpg","image/gif" }; 37 | } else { 38 | selectionArgs = new String[] { "image/jpeg", "image/png", "image/jpg" }; 39 | } 40 | setSelectionArgs(selectionArgs); 41 | } 42 | 43 | private PhotoDirectoryLoader(Context context, Uri uri, String[] projection, String selection, 44 | String[] selectionArgs, String sortOrder) { 45 | super(context, uri, projection, selection, selectionArgs, sortOrder); 46 | } 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/utils/PhotoFileProvider.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.utils; 2 | 3 | import androidx.core.content.FileProvider; 4 | 5 | /** 6 | * Created by Donglu on 2017/6/7. 7 | */ 8 | 9 | public class PhotoFileProvider extends FileProvider { 10 | } 11 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/java/me/iwf/photopicker/widget/SquareItemLayout.java: -------------------------------------------------------------------------------- 1 | package me.iwf.photopicker.widget; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.RelativeLayout; 6 | 7 | /** 8 | * Created by donglua on 15/6/21. 9 | */ 10 | public class SquareItemLayout extends RelativeLayout { 11 | public SquareItemLayout(Context context, AttributeSet attrs, int defStyle) { 12 | super(context, attrs, defStyle); 13 | } 14 | 15 | public SquareItemLayout(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | } 18 | 19 | public SquareItemLayout(Context context) { 20 | super(context); 21 | } 22 | 23 | @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 24 | setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec)); 25 | int childWidthSize = getMeasuredWidth(); 26 | heightMeasureSpec = 27 | widthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY); 28 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-v21/__picker_bg_material_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_checkbox_marked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_checkbox_marked.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_checkbox_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_checkbox_n.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_broken_image_black_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_broken_image_black_48dp.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_camera_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_camera_n.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_camera_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_camera_p.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_delete_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_delete_black_24dp.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_delete_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_delete_n.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_delete_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_delete_p.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_photo_black_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/happycao/lingxi-android/bc88d0074f1d97771f243e1dbf78bd03647ca141/PhotoPicker/src/main/res/drawable-xxhdpi/__picker_ic_photo_black_48dp.png -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable/__picker_bg_material_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable/__picker_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable/__picker_checkbox_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable/__picker_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/drawable/__picker_photo_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/layout/__picker_activity_photo_pager.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/layout/__picker_activity_photo_picker.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /PhotoPicker/src/main/res/layout/__picker_fragment_photo_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 17 | 22 |