├── mediapicker
├── .gitignore
├── .settings
│ └── org.eclipse.buildship.core.prefs
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── styles_app.xml
│ │ │ │ ├── styles_item.xml
│ │ │ │ ├── styles.xml
│ │ │ │ ├── styles_text.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── dimens.xml
│ │ │ ├── xml
│ │ │ │ └── paths.xml
│ │ │ ├── drawable
│ │ │ │ ├── tb_media_picker_dr_rect_round_accent.xml
│ │ │ │ ├── tb_media_picker_dr_rect_round_light_grey.xml
│ │ │ │ ├── tb_media_picker_ic_arrow_back_white_24dp.xml
│ │ │ │ ├── tb_media_picker_dr_rect_gradient_black.xml
│ │ │ │ ├── tb_media_picker_dr_rect_gradient_light_to_black.xml
│ │ │ │ ├── tb_media_picker_ic_arrow_back_black_24dp.xml
│ │ │ │ ├── tb_media_picker_ic_folder_48px_352374.xml
│ │ │ │ ├── tb_media_picker_ic_close_black_24dp.xml
│ │ │ │ ├── tb_media_picker_sc_button_round_accent.xml
│ │ │ │ ├── tb_media_picker_ic_person_black_24dp.xml
│ │ │ │ ├── tb_media_picker_ic_more_vert_white_24dp.xml
│ │ │ │ ├── tb_media_picker_sc_check_file.xml
│ │ │ │ ├── tb_media_picker_ic_checked.xml
│ │ │ │ ├── tb_media_picker_ic_audio_wav.xml
│ │ │ │ ├── tb_media_picker_ic_audio_m4a.xml
│ │ │ │ ├── tb_media_picker_ic_uncheck.xml
│ │ │ │ ├── tb_media_picker_ic_audio_aac.xml
│ │ │ │ ├── tb_media_picker_ic_audio_box.xml
│ │ │ │ ├── tb_media_picker_ic_audio_aud.xml
│ │ │ │ ├── tb_media_picker_ic_audio_mp3.xml
│ │ │ │ ├── tb_media_picker_ic_video_camera.xml
│ │ │ │ └── tb_media_picker_ic_music_folder.xml
│ │ │ ├── menu
│ │ │ │ └── tb_media_picker_activity_main.xml
│ │ │ └── layout
│ │ │ │ ├── tb_media_picker_frame_progress.xml
│ │ │ │ ├── tb_media_picker_folder_fragment.xml
│ │ │ │ ├── tb_media_picker_item_image.xml
│ │ │ │ ├── tb_media_picker_activity_lib_main.xml
│ │ │ │ ├── tb_media_picker_item_folder.xml
│ │ │ │ ├── tb_media_picker_item_audio.xml
│ │ │ │ ├── tb_media_picker_item_video.xml
│ │ │ │ └── tb_media_picker_file_fragment.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── greentoad
│ │ │ │ └── turtlebody
│ │ │ │ └── mediapicker
│ │ │ │ ├── ui
│ │ │ │ ├── component
│ │ │ │ │ ├── folder
│ │ │ │ │ │ ├── audio
│ │ │ │ │ │ │ ├── AudioFolder.kt
│ │ │ │ │ │ │ ├── AudioFolderAdapter.kt
│ │ │ │ │ │ │ └── AudioFolderFragment.kt
│ │ │ │ │ │ └── image_video
│ │ │ │ │ │ │ ├── ImageVideoFolder.kt
│ │ │ │ │ │ │ ├── ImageVideoFolderAdapter.kt
│ │ │ │ │ │ │ └── ImageVideoFolderFragment.kt
│ │ │ │ │ └── media
│ │ │ │ │ │ ├── audio
│ │ │ │ │ │ ├── AudioModel.kt
│ │ │ │ │ │ ├── AudioAdapter.kt
│ │ │ │ │ │ └── AudioListFragment.kt
│ │ │ │ │ │ ├── image
│ │ │ │ │ │ ├── ImageModel.kt
│ │ │ │ │ │ ├── ImageAdapter.kt
│ │ │ │ │ │ └── ImageListFragment.kt
│ │ │ │ │ │ └── video
│ │ │ │ │ │ ├── VideoModel.kt
│ │ │ │ │ │ ├── VideoAdapter.kt
│ │ │ │ │ │ └── VideoListFragment.kt
│ │ │ │ ├── base
│ │ │ │ │ ├── FragmentBase.kt
│ │ │ │ │ └── ActivityBase.kt
│ │ │ │ └── common
│ │ │ │ │ └── MediaListFragment.kt
│ │ │ │ ├── util
│ │ │ │ ├── UtilMime.kt
│ │ │ │ └── UtilTime.kt
│ │ │ │ ├── core
│ │ │ │ ├── AlertMessage.kt
│ │ │ │ ├── FileHelper.kt
│ │ │ │ ├── MediaPickerConfig.kt
│ │ │ │ ├── CursorHelper.kt
│ │ │ │ └── MediaConstants.kt
│ │ │ │ └── widget
│ │ │ │ ├── SquareImage.kt
│ │ │ │ ├── inner
│ │ │ │ └── CheckedSavedState.kt
│ │ │ │ └── ImageViewCheckable.kt
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── greentoad
│ │ │ └── turtlebody
│ │ │ └── mediapicker
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── greentoad
│ │ └── turtlebody
│ │ └── mediapicker
│ │ └── ExampleInstrumentedTest.java
├── .classpath
├── .project
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── app
├── .gitignore
├── .settings
│ └── org.eclipse.buildship.core.prefs
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ ├── styles.xml
│ │ │ │ └── colors.xml
│ │ │ ├── drawable
│ │ │ │ ├── mp3_icon.png
│ │ │ │ ├── dr_rect_round_blue.xml
│ │ │ │ ├── dr_rect_round_white.xml
│ │ │ │ ├── dr_rect_border_colored.xml
│ │ │ │ ├── sc_button_blue.xml
│ │ │ │ ├── sc_text_color_toggle.xml
│ │ │ │ ├── ic_video.xml
│ │ │ │ └── ic_launcher_background.xml
│ │ │ ├── drawable-hdpi
│ │ │ │ ├── pic_image.png
│ │ │ │ └── ic_media_picker_logo.png
│ │ │ ├── drawable-ldpi
│ │ │ │ ├── pic_image.png
│ │ │ │ └── ic_media_picker_logo.png
│ │ │ ├── drawable-mdpi
│ │ │ │ ├── pic_image.png
│ │ │ │ └── ic_media_picker_logo.png
│ │ │ ├── drawable-xhdpi
│ │ │ │ ├── pic_image.png
│ │ │ │ └── ic_media_picker_logo.png
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_round.png
│ │ │ │ └── ic_launcher_foreground.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_round.png
│ │ │ │ └── ic_launcher_foreground.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_round.png
│ │ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-xxhdpi
│ │ │ │ ├── pic_image.png
│ │ │ │ └── ic_media_picker_logo.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ │ ├── pic_image.png
│ │ │ │ └── ic_media_picker_logo.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_round.png
│ │ │ │ └── ic_launcher_foreground.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ ├── ic_launcher_round.png
│ │ │ │ └── ic_launcher_foreground.png
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ └── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ └── layout
│ │ │ │ ├── activity_test_picker.xml
│ │ │ │ ├── toolbar.xml
│ │ │ │ ├── item_result.xml
│ │ │ │ ├── activity_results.xml
│ │ │ │ ├── dialog_view.xml
│ │ │ │ ├── activity_launcher.xml
│ │ │ │ └── activity_home.xml
│ │ ├── ic_launcher-web.png
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── greentoad
│ │ │ │ └── turtlebody
│ │ │ │ └── mediapicker
│ │ │ │ └── sample
│ │ │ │ ├── utils
│ │ │ │ └── UtilTheme.kt
│ │ │ │ ├── ActivityLauncher.kt
│ │ │ │ ├── ActivityBase.kt
│ │ │ │ ├── show_results
│ │ │ │ ├── ActivityResults.kt
│ │ │ │ └── ResultsAdapter.kt
│ │ │ │ ├── test
│ │ │ │ └── TestActivityPicker.java
│ │ │ │ └── ActivityHome.kt
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── greentoad
│ │ │ └── turtlebody
│ │ │ └── mediapicker
│ │ │ └── ExampleUnitTest.kt
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── greentoad
│ │ └── turtlebody
│ │ └── mediapicker
│ │ └── ExampleInstrumentedTest.kt
├── .classpath
├── .project
├── proguard-rules.pro
└── build.gradle
├── .settings
└── org.eclipse.buildship.core.prefs
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── Example.md
├── .gitignore
├── .project
├── gradle.properties
├── LICENSE
├── CHANGELOG.md
├── gradlew.bat
└── gradlew
/mediapicker/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':mediapicker'
2 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /google-services.json
3 | signing.properties
--------------------------------------------------------------------------------
/.settings/org.eclipse.buildship.core.prefs:
--------------------------------------------------------------------------------
1 | connection.project.dir=
2 | eclipse.preferences.version=1
3 |
--------------------------------------------------------------------------------
/app/.settings/org.eclipse.buildship.core.prefs:
--------------------------------------------------------------------------------
1 | connection.project.dir=..
2 | eclipse.preferences.version=1
3 |
--------------------------------------------------------------------------------
/mediapicker/.settings/org.eclipse.buildship.core.prefs:
--------------------------------------------------------------------------------
1 | connection.project.dir=..
2 | eclipse.preferences.version=1
3 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Media Picker
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/ic_launcher-web.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/drawable/mp3_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable/mp3_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/pic_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-hdpi/pic_image.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-ldpi/pic_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-ldpi/pic_image.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/pic_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-mdpi/pic_image.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/pic_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-xhdpi/pic_image.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/pic_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-xxhdpi/pic_image.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/pic_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-xxxhdpi/pic_image.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_media_picker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-hdpi/ic_media_picker_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-ldpi/ic_media_picker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-ldpi/ic_media_picker_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_media_picker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-mdpi/ic_media_picker_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_media_picker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-xhdpi/ic_media_picker_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_media_picker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-xxhdpi/ic_media_picker_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_media_picker_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/drawable-xxxhdpi/ic_media_picker_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Turtlebody/android-media-picker/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFFFFF
4 |
--------------------------------------------------------------------------------
/Example.md:
--------------------------------------------------------------------------------
1 | ### Demo-1(Image):
2 | 
3 |
4 |
5 | ### Demo-2(Video):
6 | 
7 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Hello blank fragment
4 | Media Picker
5 |
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches/build_file_checksums.ser
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | .DS_Store
9 | /build
10 | /captures
11 | .externalNativeBuild
12 | /.idea/*
13 | *.apk
14 | signing.properties
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dr_rect_round_blue.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Sep 30 20:45:46 IST 2019
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dr_rect_round_white.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/xml/paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_dr_rect_round_accent.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_dr_rect_round_light_grey.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/mediapicker/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/menu/tb_media_picker_activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dr_rect_border_colored.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
8 |
11 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_arrow_back_white_24dp.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/folder/audio/AudioFolder.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.folder.audio
2 |
3 | /**
4 | * Created by WANGSUN on 02-Apr-19.
5 | */
6 | data class AudioFolder(var id: String = "",
7 | var name: String = "",
8 | var path: String = "",
9 | var contentCount: Int = 0) {
10 |
11 |
12 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_dr_rect_gradient_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
11 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_dr_rect_gradient_light_to_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
11 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_arrow_back_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_folder_48px_352374.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sc_button_blue.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
8 |
9 |
11 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_close_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_sc_button_round_accent.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/test/java/com/greentoad/turtlebody/mediapicker/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_person_black_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_more_vert_white_24dp.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/test/java/com/greentoad/turtlebody/mediapicker/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | turtlebody-android-imagepicker
4 | Project turtlebody-android-imagepicker created by Buildship.
5 |
6 |
7 |
8 |
9 | org.eclipse.buildship.core.gradleprojectbuilder
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.buildship.core.gradleprojectnature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sc_text_color_toggle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/folder/image_video/ImageVideoFolder.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.folder.image_video
2 |
3 | /**
4 | * Created by WANGSUN on 26-Mar-19.
5 | */
6 | data class ImageVideoFolder(var id: String = "",
7 | var name: String = "",
8 | var coverImageFilePath: String = "",
9 | var contentCount: Int = 0) {
10 |
11 | companion object {
12 | val FOLDER_ID = "folderId"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_sc_check_file.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_checked.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | app
4 | Project app created by Buildship.
5 |
6 |
7 |
8 |
9 | org.eclipse.jdt.core.javabuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.buildship.core.gradleprojectbuilder
15 |
16 |
17 |
18 |
19 |
20 | org.eclipse.jdt.core.javanature
21 | org.eclipse.buildship.core.gradleprojectnature
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_test_picker.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
17 |
18 |
--------------------------------------------------------------------------------
/mediapicker/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | mediapicker
4 | Project mediapicker created by Buildship.
5 |
6 |
7 |
8 |
9 | org.eclipse.jdt.core.javabuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.buildship.core.gradleprojectbuilder
15 |
16 |
17 |
18 |
19 |
20 | org.eclipse.jdt.core.javanature
21 | org.eclipse.buildship.core.gradleprojectnature
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/utils/UtilTheme.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample.utils
2 |
3 | import android.app.Activity
4 | import android.graphics.Color
5 | import android.os.Build
6 | import android.view.View
7 |
8 | /**
9 | * Created by niraj on 12-04-2019.
10 | */
11 | object UtilTheme {
12 |
13 | @JvmStatic fun setLightStatusBar(view: View, activity: Activity) {
14 |
15 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
16 | var flags = view.systemUiVisibility
17 | flags = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
18 | view.systemUiVisibility = flags
19 | activity.window.statusBarColor = Color.WHITE
20 | }
21 | }
22 |
23 |
24 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/util/UtilMime.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.util
2 |
3 | /**
4 | * Created by WANGSUN on 14-Mar-19.
5 | */
6 | class UtilMime {
7 |
8 | /**********************************************
9 | * File types: to set type for intent
10 | ********************************************/
11 | object FileType {
12 | val VIDEO = "video/*"
13 | val AUDIO = "audio/*"
14 | val IMAGE = "image/*"
15 | }
16 |
17 | /************************************
18 | * MIME types
19 | ***********************************/
20 | object MimeType {
21 | val VIDEO = arrayOf("video/*")
22 | val AUDIO = arrayOf("audio/*")
23 | val IMAGE = arrayOf("image/*")
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_audio_wav.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/greentoad/turtlebody/mediapicker/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker
2 |
3 | import androidx.test.InstrumentationRegistry
4 | import androidx.test.runner.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getTargetContext()
22 | assertEquals("com.turtleody.imagepicker", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | android.enableJetifier=true
10 | android.useAndroidX=true
11 | org.gradle.jvmargs=-Xmx1536m
12 | # When configured, Gradle will run in incubating parallel mode.
13 | # This option should only be used with decoupled projects. More details, visit
14 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
15 | # org.gradle.parallel=true
16 |
17 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_audio_m4a.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_frame_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/ActivityLauncher.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample
2 |
3 | import android.os.Bundle
4 | import android.os.Handler
5 | import android.view.WindowManager
6 | import org.jetbrains.anko.startActivity
7 |
8 | class ActivityLauncher : ActivityBase() {
9 |
10 | override fun onCreate(savedInstanceState: Bundle?) {
11 | super.onCreate(savedInstanceState)
12 | window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
13 |
14 | setContentView(R.layout.activity_launcher)
15 | }
16 |
17 | override fun onPostCreate(savedInstanceState: Bundle?) {
18 | super.onPostCreate(savedInstanceState)
19 | delayedStartApp()
20 | }
21 |
22 | private fun delayedStartApp() {
23 | Handler().postDelayed({startActivity()
24 | finish()}, 1000)
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
20 |
--------------------------------------------------------------------------------
/mediapicker/src/androidTest/java/com/greentoad/turtlebody/mediapicker/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.greentoad.turtlebody.mediapicker.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_folder_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/mediapicker/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
10 |
11 |
16 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/media/audio/AudioModel.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.media.audio
2 |
3 | import java.io.Serializable
4 |
5 | /**
6 | * Created by WANGSUN on 26-Mar-19.
7 | */
8 | data class AudioModel(var id: String = "",
9 | var name: String = "",
10 | var size: Int=0,
11 | var filePath: String = "",
12 | var mimeType:String? ="",
13 | //TODo var artist: String = "",
14 | var isSelected: Boolean = false ): Serializable {
15 |
16 |
17 |
18 | override fun equals(other: Any?): Boolean {
19 | if (this === other) {
20 | return true
21 | }
22 |
23 | if (other == null) {
24 | return false
25 | }
26 |
27 | if (!(other is AudioModel)) {
28 | return false
29 | }
30 |
31 | return id == other.id
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/mediapicker/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 | # Recommended flags for Firebase Auth
23 | #-keepattributes Signature
24 | #-keepattributes *Annotation*
25 | #
26 | ## Retrofit configMedia
27 | #-keepattributes Exceptions
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_uncheck.xml:
--------------------------------------------------------------------------------
1 |
3 |
5 |
8 |
9 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/core/AlertMessage.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.core
2 |
3 | import android.content.Context
4 | import android.view.View
5 | import android.widget.Toast
6 | import androidx.appcompat.app.AlertDialog
7 | import androidx.fragment.app.FragmentActivity
8 | import com.google.android.material.snackbar.Snackbar
9 |
10 | /**
11 | * Created by WANGSUN on 17-Apr-19.
12 | */
13 | class AlertMessage() {
14 |
15 | companion object {
16 | val MESSAGE = "Some file is missing."
17 | }
18 |
19 | fun showToast(context: Context) {
20 | Toast.makeText(context, MESSAGE, Toast.LENGTH_LONG).show()
21 | }
22 |
23 | fun showDialog(context: Context) {
24 | AlertDialog.Builder(context)
25 | .setMessage(MESSAGE)
26 | .setPositiveButton("OK") { dialog, which ->
27 | dialog.dismiss()
28 | }.show()
29 |
30 | }
31 |
32 | fun showSnackBar(view: View) {
33 | Snackbar.make(view, MESSAGE, Snackbar.LENGTH_LONG).show()
34 | }
35 |
36 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/media/image/ImageModel.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.media.image
2 |
3 | import java.io.Serializable
4 |
5 | /**
6 | * Created by WANGSUN on 26-Mar-19.
7 | */
8 | data class ImageModel(var id: String = "",
9 | var name: String = "",
10 | var size: Int=0,
11 | var filePath: String = "",
12 | var thumbnailPath: String = "",
13 | var isSelected: Boolean = false ): Serializable {
14 |
15 | companion object {
16 | val ARG_BUNDLE = javaClass.canonicalName + ".bundle_arg"
17 | val ARG_LIST = javaClass.canonicalName + ".list_arg"
18 | }
19 |
20 | override fun equals(o: Any?): Boolean {
21 | if (this === o) {
22 | return true
23 | }
24 |
25 | if (o == null) {
26 | return false
27 | }
28 |
29 | if (!(o is ImageModel)) {
30 | return false
31 | }
32 |
33 | return id == o.id
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/util/UtilTime.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.util
2 |
3 | import java.util.concurrent.TimeUnit
4 |
5 |
6 | /**
7 | * Created by niraj on 15-10-2018.
8 | */
9 | object UtilTime {
10 |
11 | @JvmStatic fun timeFormatted(millis: Long): String {
12 | if(millis> 3600000L) {
13 | return String.format("%02d:%02d:%02d",
14 | TimeUnit.MILLISECONDS.toHours(millis),
15 | TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line
16 | TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)))
17 | }else{
18 | return String.format("%02d:%02d"
19 | , TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
20 | , TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)))
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_item_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
17 |
24 |
25 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/base/FragmentBase.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.base
2 |
3 | import android.view.MenuItem
4 | import androidx.appcompat.widget.Toolbar
5 | import androidx.fragment.app.Fragment
6 | import org.jetbrains.anko.AnkoLogger
7 |
8 | abstract class FragmentBase : Fragment(),AnkoLogger, Toolbar.OnMenuItemClickListener {
9 | private var toolbar: Toolbar? = null
10 |
11 |
12 | var toolbarTitle: String = ""
13 | set(value) {
14 | toolbar?.title = value
15 | field = value
16 | }
17 |
18 | fun initToolbar(toolbar: Toolbar?, navigationDrawable: Int, isBackNavigationEnable: Boolean) {
19 |
20 | this.toolbar = toolbar
21 | toolbar?.setNavigationIcon(navigationDrawable)
22 | toolbar?.setOnMenuItemClickListener(this)
23 | if (isBackNavigationEnable) {
24 | toolbar?.setNavigationOnClickListener {
25 | activity?.onBackPressed()
26 | }
27 | }
28 | }
29 |
30 | override fun onMenuItemClick(item: MenuItem): Boolean {
31 | return false
32 | }
33 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_result.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
16 |
17 |
23 |
24 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/media/video/VideoModel.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.media.video
2 |
3 | import java.io.Serializable
4 |
5 | /**
6 | * Created by WANGSUN on 26-Mar-19.
7 | */
8 | data class VideoModel(var id: String = "",
9 | var name: String = "",
10 | var size: Int = 0,
11 | var filePath: String = "",
12 | var thumbnailPath: String = "",
13 | var duration: String = "",
14 | var isSelected: Boolean = false ): Serializable {
15 |
16 | companion object {
17 | val ARG_BUNDLE = javaClass.canonicalName + ".bundle_arg"
18 | val ARG_LIST = javaClass.canonicalName + ".list_arg"
19 | }
20 |
21 | override fun equals(o: Any?): Boolean {
22 | if (this === o) {
23 | return true
24 | }
25 |
26 | if (o == null) {
27 | return false
28 | }
29 |
30 | if (!(o is VideoModel)) {
31 | return false
32 | }
33 |
34 | return id == o.id
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/widget/SquareImage.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.widget
2 |
3 | import android.annotation.TargetApi
4 | import android.content.Context
5 | import android.os.Build
6 | import android.util.AttributeSet
7 | import android.widget.ImageView
8 |
9 | /**
10 | * Created by WANGSUN on 28-Mar-19.
11 | */
12 | class SquareImage: ImageView {
13 |
14 | constructor(context: Context) : super(context) {}
15 |
16 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
17 |
18 |
19 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
20 |
21 | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
22 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
23 |
24 |
25 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
26 | super.onMeasure(widthMeasureSpec, heightMeasureSpec)
27 |
28 | val width = measuredWidth
29 | setMeasuredDimension(width, width)
30 | }
31 |
32 |
33 |
34 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_results.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
13 |
17 |
18 |
22 |
23 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_audio_aac.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Green Toad Technologies Pvt. Ltd.
4 | Copyright (c) 2019 The Green Toad Core Developers.
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_audio_box.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
16 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/core/FileHelper.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.core
2 |
3 | import android.content.Context
4 | import android.net.Uri
5 | import android.text.TextUtils
6 | import com.greentoad.turtlebody.mediapicker.util.UtilsFile
7 | import org.jetbrains.anko.AnkoLogger
8 | import org.jetbrains.anko.info
9 | import java.io.FileNotFoundException
10 |
11 | /**
12 | * Created by WANGSUN on 17-Apr-19.
13 | */
14 | object FileHelper : AnkoLogger{
15 |
16 | fun isFileExist(context: Context, uri: Uri?): Boolean {
17 | if(uri==null)return false
18 | val path = UtilsFile.getFilePath(context, uri)
19 |
20 | if (TextUtils.isEmpty(path)) {
21 | info { "path is empty" }
22 | return false
23 | }
24 | //return true
25 |
26 | return try {
27 | var inputStream = context.contentResolver.openInputStream(uri)
28 | true
29 | } catch (e: FileNotFoundException) {
30 | info { "file not found" }
31 | false
32 | }
33 | catch (e: Exception) {
34 | info { "error: ${e.printStackTrace()}" }
35 | false
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_audio_aud.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/widget/inner/CheckedSavedState.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.widget.inner
2 |
3 | import android.os.Parcel
4 | import android.os.Parcelable
5 | import android.view.View
6 |
7 | /**
8 | * Created by niraj on 30-08-2018.
9 | */
10 | class CheckedSavedState : View.BaseSavedState {
11 |
12 | var mIsChecked: Boolean = false
13 |
14 | constructor(source: Parcel?) :super(source){
15 | mIsChecked= source?.readInt() == 1
16 | }
17 |
18 | constructor(parcelable: Parcelable) : super(parcelable){
19 | }
20 |
21 | override fun writeToParcel(parcel: Parcel, flags: Int) {
22 | super.writeToParcel(parcel, flags)
23 | parcel.writeByte(if (mIsChecked) 1 else 0)
24 | }
25 |
26 | override fun describeContents(): Int {
27 | return 0
28 | }
29 |
30 | companion object CREATOR : Parcelable.Creator {
31 | override fun createFromParcel(parcel: Parcel): CheckedSavedState {
32 | return CheckedSavedState(parcel)
33 | }
34 |
35 | override fun newArray(size: Int): Array {
36 | return arrayOfNulls(size)
37 | }
38 | }
39 |
40 | }
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # [1.0.7](2019-05-21)
2 |
3 |
4 | ### Bug Fixes
5 |
6 | ### Features
7 |
8 | ### Changes
9 | * upgraded dependencies/android api level
10 |
11 | # [1.0.7](2019-05-21)
12 |
13 |
14 | ### Bug Fixes
15 |
16 | ### Features
17 | * You can set screen orientation for picker ui in ImagePickerConfiguration.
18 |
19 | ### Changes
20 |
21 |
22 | # [1.0.6](2019-05-3)
23 |
24 |
25 | ### Bug Fixes
26 |
27 | ### Features
28 |
29 | ### Changes
30 |
31 | * We have changed naming of some xml elements for more clearity and to avoid duplicacy. Note: this change do not affect end-developer.
32 |
33 | # [1.0.5](2019-05-1)
34 |
35 |
36 | ### Bug Fixes
37 |
38 | ### Features
39 |
40 | * **core:** implement temporary/permanent uri grant while using android default intent
41 |
42 | ### Changes
43 |
44 | * some file names have been changed for better and clear, naming convention.
45 |
46 |
47 | # [1.0.2](2019-04-18)
48 |
49 |
50 | ### Bug Fixes
51 |
52 | * **core:** crashes while picking missing file/files
53 | * **core:** crashes while picking file from external storage
54 |
55 |
56 |
57 | ### Features
58 |
59 | * **core:** implement image picker functionality
60 | * **core:** implement video picker functionality
61 | * **core:** implement audio picker functionality
--------------------------------------------------------------------------------
/mediapicker/src/main/res/values/styles_app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
12 |
13 |
18 |
19 |
20 |
24 |
25 |
28 |
29 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/core/MediaPickerConfig.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.core
2 |
3 | import java.io.Serializable
4 |
5 | /**
6 | * Created by WANGSUN on 29-Mar-19.
7 | */
8 | class MediaPickerConfig: Serializable {
9 | var mShowConfirmationDialog: Boolean = false
10 | private set
11 | var mAllowMultiSelection: Boolean = false
12 | private set
13 | var mUriPermanentAccess: Boolean = false
14 | private set
15 | var mScreenOrientation: Int? = null
16 | private set
17 |
18 |
19 | companion object {
20 | val ARG_BUNDLE = javaClass.canonicalName + ".bundle_arg"
21 | }
22 |
23 | /**
24 | * Show confirmation dialog after selecting file (works only for single file selection)
25 | */
26 | fun setShowConfirmationDialog(value: Boolean): MediaPickerConfig {
27 | mShowConfirmationDialog = value
28 | return this
29 | }
30 |
31 | /**
32 | * Allow multiple selection
33 | */
34 | fun setAllowMultiSelection(value: Boolean): MediaPickerConfig {
35 | mAllowMultiSelection = value
36 | return this
37 | }
38 |
39 | /**
40 | * Allow multiple selection
41 | */
42 | fun setUriPermanentAccess(value: Boolean): MediaPickerConfig {
43 | mUriPermanentAccess = value
44 | return this
45 | }
46 |
47 |
48 | /**
49 | * set screen rotation
50 | */
51 | fun setScreenOrientation(value: Int): MediaPickerConfig {
52 | mScreenOrientation = value
53 | return this
54 | }
55 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_audio_mp3.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_video_camera.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/ActivityBase.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample
2 |
3 | import android.os.Build
4 | import androidx.appcompat.app.AppCompatActivity
5 | import androidx.appcompat.app.AppCompatDelegate
6 | import androidx.appcompat.widget.Toolbar
7 | import androidx.core.content.ContextCompat
8 | import com.greentoad.turtlebody.mediapicker.sample.utils.UtilTheme
9 | import org.jetbrains.anko.AnkoLogger
10 |
11 |
12 | abstract class ActivityBase : AppCompatActivity(), AnkoLogger {
13 | init {
14 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
15 | }
16 |
17 | var toolbarTitle: String
18 | get() = supportActionBar?.title.toString()
19 | set(value) {
20 | val actionBar = supportActionBar
21 | actionBar?.title = value
22 | // toolbar.title = value
23 | }
24 |
25 | fun initToolbar(toolbar: Toolbar) {
26 | setSupportActionBar(toolbar)
27 | }
28 |
29 |
30 | fun initToolbar(resId: Int, toolbar: Toolbar) {
31 | setSupportActionBar(toolbar)
32 | setToolbarNavigationIcon(resId, toolbar)
33 | }
34 |
35 |
36 | fun setToolbarNavigationIcon(resId: Int, toolbar: Toolbar) {
37 | toolbar.setNavigationIcon(resId)
38 | }
39 |
40 | override fun setContentView(layoutResID: Int) {
41 | super.setContentView(layoutResID)
42 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
43 | window.statusBarColor = ContextCompat.getColor(applicationContext, R.color.md_white_1000)
44 | }
45 |
46 | UtilTheme.setLightStatusBar(window.decorView, this)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
17 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
27 |
29 |
30 |
31 |
32 |
33 |
34 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/show_results/ActivityResults.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample.show_results
2 |
3 | import android.net.Uri
4 | import android.os.Bundle
5 | import android.view.MenuItem
6 | import androidx.recyclerview.widget.LinearLayoutManager
7 | import com.greentoad.turtlebody.mediapicker.sample.ActivityBase
8 | import com.greentoad.turtlebody.mediapicker.sample.R
9 | import com.greentoad.turtlebody.mediapicker.ui.ActivityLibMain
10 | import kotlinx.android.synthetic.main.activity_results.*
11 | import org.jetbrains.anko.find
12 |
13 | class ActivityResults : ActivityBase() {
14 |
15 | private var mList: MutableList = arrayListOf()
16 | private var mAdapter: ResultsAdapter = ResultsAdapter()
17 |
18 | override fun onCreate(savedInstanceState: Bundle?) {
19 | super.onCreate(savedInstanceState)
20 | setContentView(R.layout.activity_results)
21 |
22 | initToolbar(R.drawable.tb_media_picker_ic_arrow_back_black_24dp,find(R.id.toolbar))
23 | toolbarTitle = "Selected Files"
24 |
25 |
26 | if(intent.extras!=null){
27 | mList = intent.getSerializableExtra(ActivityLibMain.B_ARG_URI_LIST) as MutableList
28 | }
29 |
30 | initAdapter()
31 | }
32 |
33 | override fun onOptionsItemSelected(item: MenuItem?): Boolean {
34 | when (item?.itemId) {
35 | android.R.id.home -> {
36 | onBackPressed()
37 | return true
38 | }
39 | else -> return super.onOptionsItemSelected(item)
40 | }
41 | }
42 |
43 | private fun initAdapter() {
44 | mAdapter.setData(mList)
45 | recycler_view.layoutManager = LinearLayoutManager(this)
46 | recycler_view.adapter = mAdapter
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/values/styles_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
17 |
21 |
22 |
25 |
26 |
30 |
38 |
39 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/drawable/tb_media_picker_ic_music_folder.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
16 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/base/ActivityBase.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.base
2 |
3 | import android.app.Activity
4 | import android.graphics.Color
5 | import android.os.Build
6 | import android.view.View
7 | import androidx.appcompat.app.AppCompatActivity
8 | import androidx.appcompat.app.AppCompatDelegate
9 | import androidx.appcompat.widget.Toolbar
10 | import androidx.core.content.ContextCompat
11 | import com.greentoad.turtlebody.mediapicker.R
12 | import org.jetbrains.anko.AnkoLogger
13 |
14 |
15 | abstract class ActivityBase : AppCompatActivity(), AnkoLogger {
16 | init {
17 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
18 | }
19 |
20 | var toolbarTitle: String
21 | get() = supportActionBar?.title.toString()
22 | set(value) {
23 | val actionBar = supportActionBar
24 | actionBar?.title = value
25 | }
26 |
27 | fun initToolbar(toolbar: Toolbar) {
28 | setSupportActionBar(toolbar)
29 | }
30 |
31 |
32 | fun initToolbar(resId: Int, toolbar: Toolbar) {
33 | setSupportActionBar(toolbar)
34 | setToolbarNavigationIcon(resId, toolbar)
35 | }
36 |
37 |
38 | private fun setToolbarNavigationIcon(resId: Int, toolbar: Toolbar) {
39 | toolbar.setNavigationIcon(resId)
40 | }
41 |
42 | override fun setContentView(layoutResID: Int) {
43 | super.setContentView(layoutResID)
44 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
45 | window.statusBarColor = ContextCompat.getColor(applicationContext, R.color.md_white_1000)
46 | }
47 | setLightStatusBar(window.decorView, this)
48 |
49 | }
50 |
51 | private fun setLightStatusBar(view: View, activity: Activity) {
52 |
53 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
54 |
55 | var flags = view.systemUiVisibility
56 | flags = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
57 | view.systemUiVisibility = flags
58 | activity.window.statusBarColor = Color.WHITE
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
14 |
21 |
22 |
28 |
29 |
40 |
41 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_activity_lib_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
23 |
24 |
37 |
38 |
42 |
43 |
47 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_item_folder.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
16 |
17 |
22 |
23 |
29 |
30 |
37 |
38 |
39 |
40 |
41 |
42 |
46 |
47 |
51 |
52 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_video.xml:
--------------------------------------------------------------------------------
1 |
4 |
6 |
7 |
8 |
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_item_audio.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
21 |
28 |
29 |
30 |
31 |
32 |
38 |
39 |
43 |
44 |
49 |
50 |
51 |
52 |
58 |
59 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_item_video.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
17 |
24 |
25 |
31 |
32 |
39 |
40 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
15 |
20 |
28 |
29 |
30 |
31 |
37 |
38 |
43 |
44 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/show_results/ResultsAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample.show_results
2 |
3 | import android.content.Context
4 | import android.net.Uri
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import androidx.recyclerview.widget.RecyclerView
9 | import com.bumptech.glide.Glide
10 | import com.greentoad.turtlebody.mediapicker.sample.R
11 | import kotlinx.android.synthetic.main.item_result.view.*
12 | import org.jetbrains.anko.AnkoLogger
13 | import org.jetbrains.anko.info
14 | import java.io.File
15 |
16 | /**
17 | * Created by WANGSUN on 26-Mar-19.
18 | */
19 | class ResultsAdapter : RecyclerView.Adapter(),AnkoLogger {
20 | private var mData: MutableList = arrayListOf()
21 | private lateinit var mContext: Context
22 |
23 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderVewHolder {
24 | mContext = parent.context
25 | val view = LayoutInflater.from(parent.context).inflate(R.layout.item_result, parent, false)
26 | return FolderVewHolder(view)
27 | }
28 |
29 | override fun getItemCount(): Int {
30 | return mData.size
31 | }
32 |
33 | override fun onBindViewHolder(holder: FolderVewHolder, position: Int) {
34 | holder.bind(mData[position])
35 | }
36 |
37 | fun setData(pData: MutableList) {
38 | mData = pData
39 | notifyDataSetChanged()
40 | }
41 |
42 | inner class FolderVewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
43 | fun bind(pData: Uri) {
44 |
45 | val file = File(pData.path)
46 |
47 | itemView.item_result_file_name.text = file.name
48 | val mimeType = mContext.contentResolver.getType(pData)!!
49 |
50 | when {
51 | mimeType.contains("audio") -> {
52 | Glide.with(itemView)
53 | .load(R.drawable.mp3_icon)
54 | .into(itemView.item_result_icon)
55 | }
56 | mimeType.contains("ogg") -> {
57 | Glide.with(itemView)
58 | .load(R.drawable.mp3_icon)
59 | .into(itemView.item_result_icon)
60 | }
61 | else->{
62 | Glide.with(itemView)
63 | .load(pData)
64 | .into(itemView.item_result_icon)
65 | }
66 | }
67 | }
68 | }
69 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/folder/audio/AudioFolderAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.folder.audio
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import androidx.recyclerview.widget.RecyclerView
7 | import com.bumptech.glide.Glide
8 | import com.greentoad.turtlebody.mediapicker.R
9 | import kotlinx.android.synthetic.main.tb_media_picker_item_folder.view.*
10 |
11 | /**
12 | * Created by WANGSUN on 26-Mar-19.
13 | */
14 | class AudioFolderAdapter: RecyclerView.Adapter() {
15 | private var mData: MutableList = arrayListOf()
16 | private var mOnAudioFolderClickListener: OnAudioFolderClickListener? = null
17 |
18 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderVewHolder {
19 | val view = LayoutInflater.from(parent.context).inflate(R.layout.tb_media_picker_item_folder, parent, false)
20 | return FolderVewHolder(view)
21 | }
22 |
23 | override fun getItemCount(): Int {
24 | return mData.size
25 | }
26 |
27 | override fun onBindViewHolder(holder: FolderVewHolder, position: Int) {
28 | holder.bind(mData[position])
29 | }
30 |
31 |
32 | /**
33 | * Register a callback to be invoked when folder view is clicked.
34 | * @param listener The callback that will run
35 | */
36 | fun setListener(listenerAudio : OnAudioFolderClickListener){
37 | mOnAudioFolderClickListener = listenerAudio
38 | }
39 |
40 | /**
41 | * @param pData mutable-list-of AudioFolder
42 | */
43 | fun setData(pData: MutableList){
44 | mData = pData
45 | notifyDataSetChanged()
46 | }
47 |
48 | inner class FolderVewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
49 | fun bind(pData: AudioFolder){
50 |
51 | itemView.item_folder_txt_folder_name.text = pData.name
52 | itemView.item_folder_txt_total_items.text = "${pData.contentCount} items"
53 |
54 | itemView.item_folder_fl.visibility = View.GONE
55 |
56 | Glide.with(itemView)
57 | .load(R.drawable.tb_media_picker_ic_music_folder)
58 | .into(itemView.item_folder_icon)
59 |
60 | itemView.setOnClickListener {
61 | mOnAudioFolderClickListener?.onFolderClick(pData)
62 | }
63 | }
64 | }
65 |
66 |
67 | interface OnAudioFolderClickListener {
68 | fun onFolderClick(pData: AudioFolder)
69 | }
70 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/folder/image_video/ImageVideoFolderAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.folder.image_video
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import androidx.recyclerview.widget.RecyclerView
7 | import com.bumptech.glide.Glide
8 | import com.greentoad.turtlebody.mediapicker.R
9 | import kotlinx.android.synthetic.main.tb_media_picker_item_folder.view.*
10 | import java.io.File
11 |
12 | /**
13 | * Created by WANGSUN on 26-Mar-19.
14 | */
15 | class ImageVideoFolderAdapter: RecyclerView.Adapter() {
16 |
17 |
18 | private var mData: MutableList = arrayListOf()
19 | private var mOnFolderClickListener: OnFolderClickListener? = null
20 |
21 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderVewHolder {
22 | val view = LayoutInflater.from(parent.context).inflate(R.layout.tb_media_picker_item_folder, parent, false)
23 | return FolderVewHolder(view)
24 | }
25 |
26 | override fun getItemCount(): Int {
27 | return mData.size
28 | }
29 |
30 |
31 | override fun onBindViewHolder(holder: FolderVewHolder, position: Int) {
32 | holder.bind(mData[position])
33 | }
34 |
35 |
36 | /**
37 | * Register a callback to be invoked when folder view is clicked.
38 | * @param listener The callback that will run
39 | */
40 | fun setListener(listener : OnFolderClickListener){
41 | mOnFolderClickListener = listener
42 | }
43 |
44 | /**
45 | * @param pData mutable-list-of ImageVideoFolder
46 | */
47 | fun setData(pData: MutableList){
48 | mData = pData
49 | notifyDataSetChanged()
50 | }
51 |
52 | inner class FolderVewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
53 | fun bind(pData: ImageVideoFolder){
54 |
55 | itemView.item_folder_txt_folder_name.text = pData.name
56 | itemView.item_folder_txt_total_items.text = "${pData.contentCount} items"
57 |
58 | itemView.item_folder_small_icon.visibility = View.VISIBLE
59 |
60 | Glide.with(itemView)
61 | .load(File( pData.coverImageFilePath))
62 | .into(itemView.item_folder_icon)
63 |
64 | itemView.setOnClickListener {
65 | mOnFolderClickListener?.onFolderClick(pData)
66 | }
67 |
68 | }
69 | }
70 |
71 |
72 | interface OnFolderClickListener {
73 | fun onFolderClick(pData: ImageVideoFolder)
74 | }
75 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/media/image/ImageAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.media.image
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import androidx.recyclerview.widget.RecyclerView
7 | import com.bumptech.glide.Glide
8 | import com.greentoad.turtlebody.mediapicker.R
9 | import kotlinx.android.synthetic.main.tb_media_picker_item_image.view.*
10 | import java.io.File
11 |
12 | /**
13 | * Created by WANGSUN on 26-Mar-19.
14 | */
15 | class ImageAdapter: RecyclerView.Adapter() {
16 | private var mData: MutableList = arrayListOf()
17 | private var mOnImageClickListener: OnImageClickListener? = null
18 | var mShowCheckBox: Boolean = false
19 |
20 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageVewHolder {
21 | val view = LayoutInflater.from(parent.context).inflate(R.layout.tb_media_picker_item_image, parent, false)
22 | return ImageVewHolder(view)
23 | }
24 |
25 | override fun getItemCount(): Int {
26 | return mData.size
27 | }
28 |
29 | override fun onBindViewHolder(holder: ImageVewHolder, position: Int) {
30 | holder.bind(mData[position])
31 | }
32 |
33 |
34 | fun setListener(listener : OnImageClickListener){
35 | mOnImageClickListener = listener
36 | }
37 |
38 | fun setData(pData: MutableList){
39 | mData = pData
40 | notifyDataSetChanged()
41 | }
42 |
43 | fun updateIsSelected(pData: ImageModel){
44 | val pos = mData.indexOf(pData)
45 | if(pos>=0){
46 | mData[pos] = pData
47 | notifyItemChanged(pos)
48 | }
49 | }
50 |
51 | inner class ImageVewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
52 | fun bind(pData: ImageModel){
53 |
54 | Glide.with(itemView)
55 | .load(File(pData.thumbnailPath))
56 | .into(itemView.item_image_cover_image)
57 |
58 | itemView.item_image_checkbox.isChecked = pData.isSelected
59 |
60 | itemView.setOnClickListener {
61 | mOnImageClickListener?.onImageCheck(pData)
62 | }
63 |
64 | if(!mShowCheckBox){
65 | itemView.item_image_checkbox.visibility = View.GONE
66 | }
67 | else{
68 | itemView.item_image_checkbox.visibility = View.VISIBLE
69 | }
70 | }
71 | }
72 |
73 |
74 | interface OnImageClickListener {
75 | fun onImageCheck(pData: ImageModel)
76 | }
77 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/widget/ImageViewCheckable.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.widget
2 |
3 | import android.annotation.TargetApi
4 | import android.content.Context
5 | import android.os.Build
6 | import android.os.Parcelable
7 | import android.util.AttributeSet
8 | import android.view.View
9 | import android.widget.Checkable
10 | import android.widget.ImageView
11 | import com.greentoad.turtlebody.mediapicker.widget.inner.CheckedSavedState
12 |
13 | /**
14 | * Created by niraj on 31-08-2018.
15 | */
16 | class ImageViewCheckable : ImageView, Checkable {
17 |
18 | private val CHECKED_STATE_SET = intArrayOf(android.R.attr.state_activated, android.R.attr.state_checked)
19 | internal var mIsChecked = false
20 |
21 | constructor(context: Context): this(context, null)
22 |
23 | constructor(context: Context, attrs: AttributeSet?):this(context, attrs, 0)
24 |
25 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int):
26 | super(context, attrs, defStyleAttr)
27 |
28 | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
29 | constructor(
30 | context: Context,
31 | attrs: AttributeSet?,
32 | defStyleAttr: Int,
33 | defStyleRes: Int)
34 | : super(context, attrs, defStyleAttr, defStyleRes)
35 |
36 |
37 | override fun onCreateDrawableState(extraSpace: Int): IntArray {
38 | val drawableState = super.onCreateDrawableState(extraSpace + 2)
39 |
40 | if (mIsChecked) {
41 | View.mergeDrawableStates(drawableState, CHECKED_STATE_SET)
42 | }
43 |
44 | return drawableState
45 | }
46 |
47 | override fun setChecked(checked: Boolean) {
48 | if (mIsChecked != checked) {
49 | mIsChecked = checked
50 | invalidate()
51 | refreshDrawableState()
52 | }
53 | }
54 |
55 | override fun isChecked(): Boolean {
56 |
57 | return mIsChecked
58 | }
59 |
60 | override fun toggle() {
61 | setChecked(!mIsChecked)
62 | }
63 |
64 |
65 | override fun performClick(): Boolean {
66 | toggle()
67 | return super.performClick()
68 | }
69 |
70 | override fun onSaveInstanceState(): Parcelable? {
71 |
72 | val savedStateChecked = CheckedSavedState(super.onSaveInstanceState()!!)
73 | savedStateChecked.mIsChecked = mIsChecked
74 | return savedStateChecked
75 | }
76 |
77 | override fun onRestoreInstanceState(state: Parcelable) {
78 |
79 | if (state !is CheckedSavedState) {
80 | super.onRestoreInstanceState(state)
81 | return
82 |
83 | }
84 |
85 | super.onRestoreInstanceState(state.superState)
86 | isChecked = state.mIsChecked
87 |
88 |
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/media/video/VideoAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.media.video
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import androidx.recyclerview.widget.RecyclerView
7 | import com.bumptech.glide.Glide
8 | import com.bumptech.glide.util.Util
9 | import com.greentoad.turtlebody.mediapicker.R
10 | import com.greentoad.turtlebody.mediapicker.util.UtilTime
11 | import kotlinx.android.synthetic.main.tb_media_picker_item_video.view.*
12 | import java.io.File
13 |
14 | /**
15 | * Created by WANGSUN on 26-Mar-19.
16 | */
17 | class VideoAdapter: RecyclerView.Adapter() {
18 | private var mData: MutableList = arrayListOf()
19 | private var mOnVideoClickListener: OnVideoClickListener? = null
20 | var mShowCheckBox: Boolean = false
21 |
22 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideoVewHolder {
23 | val view = LayoutInflater.from(parent.context).inflate(R.layout.tb_media_picker_item_video, parent, false)
24 | return VideoVewHolder(view)
25 | }
26 |
27 | override fun getItemCount(): Int {
28 | return mData.size
29 | }
30 |
31 | override fun onBindViewHolder(holder: VideoVewHolder, position: Int) {
32 | holder.bind(mData[position])
33 | }
34 |
35 |
36 | fun setListener(listener : OnVideoClickListener){
37 | mOnVideoClickListener = listener
38 | }
39 |
40 | fun setData(pData: MutableList){
41 | mData = pData
42 | notifyDataSetChanged()
43 | }
44 |
45 | fun updateIsSelected(pData: VideoModel){
46 | val pos = mData.indexOf(pData)
47 | if(pos>=0){
48 | mData[pos] = pData
49 | notifyItemChanged(pos)
50 | }
51 | }
52 |
53 | inner class VideoVewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
54 | fun bind(pData: VideoModel){
55 |
56 | Glide.with(itemView)
57 | .load(File(pData.thumbnailPath))
58 | .into(itemView.tb_media_picker_item_video_image)
59 |
60 | itemView.tb_media_picker_item_video_checkbox.isChecked = pData.isSelected
61 |
62 | itemView.setOnClickListener {
63 | mOnVideoClickListener?.onVideoCheck(pData)
64 | }
65 |
66 | itemView.tb_media_picker_item_video_duration.text = UtilTime.timeFormatted(pData.duration.toLong())
67 |
68 | if(!mShowCheckBox){
69 | itemView.tb_media_picker_item_video_checkbox.visibility = View.GONE
70 | }
71 | else{
72 | itemView.tb_media_picker_item_video_checkbox.visibility = View.VISIBLE
73 | }
74 | }
75 | }
76 |
77 |
78 | interface OnVideoClickListener {
79 | fun onVideoCheck(pData: VideoModel)
80 | }
81 | }
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/core/CursorHelper.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.core
2 |
3 | import android.annotation.SuppressLint
4 | import android.content.Context
5 | import android.database.Cursor
6 | import android.provider.MediaStore
7 | import com.greentoad.turtlebody.mediapicker.MediaPicker
8 |
9 |
10 | /**
11 | * Created by WANGSUN on 27-Mar-19.
12 | */
13 | object CursorHelper {
14 |
15 |
16 | /**
17 | * cursor for images and videos
18 | */
19 | @SuppressLint("Recycle")
20 | fun getImageVideoFolderCursor(context: Context, fileType: Int): Cursor? {
21 | return if(fileType == MediaPicker.MediaTypes.IMAGE){
22 | context.contentResolver.query(MediaConstants.Queries.imageQueryUri, MediaConstants.Projection.IMAGE_FOLDER,
23 | null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC")
24 | }
25 | else
26 | context.contentResolver.query(MediaConstants.Queries.videoQueryUri, MediaConstants.Projection.VIDEO_FOLDER,
27 | null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC")
28 | }
29 |
30 | @SuppressLint("Recycle")
31 | fun getImageVideoFileCursor(context: Context, folderId: String, fileType: Int): Cursor?{
32 | return if(fileType == MediaPicker.MediaTypes.IMAGE){
33 | context.contentResolver.query(MediaConstants.Queries.imageQueryUri, MediaConstants.Projection.IMAGE_FILE,
34 | MediaConstants.Projection.IMAGE_FILE[4] + " = '" + folderId + "'", null,
35 | MediaStore.MediaColumns.DATE_ADDED + " DESC")
36 | }
37 | else
38 | context.contentResolver.query(MediaConstants.Queries.videoQueryUri, MediaConstants.Projection.VIDEO_FILE,
39 | MediaConstants.Projection.VIDEO_FILE[4] + " = '" + folderId + "'", null,
40 | MediaStore.MediaColumns.DATE_ADDED + " DESC")
41 | }
42 |
43 |
44 | /**
45 | * cursor for audio
46 | */
47 | fun getAudioFolderCursor(context: Context): Cursor? {
48 | return context.contentResolver.query(MediaConstants.Queries.audioQueryUri, MediaConstants.Projection.AUDIO_FOLDER,
49 | MediaConstants.Selection.AUDIO_FOLDER, null, MediaStore.MediaColumns.DATE_ADDED + " DESC")//arrayOf("%.ogg")
50 | }
51 |
52 | fun getAudioFilesInFolderCursor(context: Context, folderPath: String): Cursor?{
53 | val path = "$folderPath/"
54 | return context.contentResolver.query(MediaConstants.Queries.audioQueryUri, MediaConstants.Projection.AUDIO_FILE,
55 | MediaStore.Audio.Media.DATA + " LIKE ? AND " + MediaStore.Audio.Media.DATA + " NOT LIKE ? "
56 | +" AND ("+ MediaStore.Audio.Media.MIME_TYPE +" LIKE ?"
57 | +" OR "+ MediaStore.Audio.Media.MIME_TYPE +" LIKE ?)",
58 | arrayOf("$path%", "$path%/%","audio%","application/ogg"),//"audio%"
59 | MediaStore.MediaColumns.DATE_ADDED + " DESC")
60 | }
61 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/test/TestActivityPicker.java:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample.test;
2 |
3 | import android.content.pm.ActivityInfo;
4 | import android.net.Uri;
5 | import android.os.Bundle;
6 | import android.util.Log;
7 | import android.view.View;
8 | import android.widget.Button;
9 |
10 | import androidx.appcompat.app.AppCompatActivity;
11 |
12 | import com.greentoad.turtlebody.mediapicker.MediaPicker;
13 | import com.greentoad.turtlebody.mediapicker.core.MediaPickerConfig;
14 | import com.greentoad.turtlebody.mediapicker.sample.R;
15 |
16 | import java.io.File;
17 | import java.util.ArrayList;
18 |
19 | import io.reactivex.Observer;
20 | import io.reactivex.disposables.Disposable;
21 |
22 | public class TestActivityPicker extends AppCompatActivity {
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_test_picker);
28 |
29 |
30 | Button picker = (Button) findViewById(R.id.id_picker);
31 |
32 | picker.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | startPick();
36 | }
37 | });
38 | }
39 |
40 | private void startPick() {
41 | MediaPickerConfig mediaPickerConfig = new MediaPickerConfig()
42 | .setAllowMultiSelection(false)
43 | .setUriPermanentAccess(true)
44 | .setShowConfirmationDialog(true)
45 | .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
46 |
47 | MediaPicker.with(this, MediaPicker.MediaTypes.IMAGE)
48 | .setConfig(mediaPickerConfig)
49 | .setFileMissingListener(new MediaPicker.MediaPickerImpl.OnMediaListener() {
50 | @Override
51 | public void onMissingFileWarning() {
52 | //trigger when some file are missing
53 | }
54 | })
55 | .onResult()
56 | .subscribe(new Observer>() {
57 | @Override
58 | public void onSubscribe(Disposable d) { }
59 |
60 | @Override
61 | public void onNext(ArrayList uris) {
62 | Log.i("tag", "next: " + uris.toString());
63 | }
64 |
65 | @Override
66 | public void onError(Throwable e) {
67 | Log.i("tag", "error: " + e.getMessage());
68 | }
69 |
70 | @Override
71 | public void onComplete() {
72 | Log.i("tag", "complete");
73 | }
74 | });
75 |
76 |
77 | Uri uri = Uri.parse("");
78 | File file = new File(uri.getPath());
79 |
80 | String mimeType = getContentResolver().getType(uri);
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/common/MediaListFragment.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.common
2 |
3 | import android.net.Uri
4 | import android.os.Bundle
5 | import android.util.TypedValue
6 | import android.view.LayoutInflater
7 | import android.view.View
8 | import android.view.ViewGroup
9 | import androidx.coordinatorlayout.widget.CoordinatorLayout
10 | import com.greentoad.turtlebody.mediapicker.core.MediaPickerConfig
11 | import com.greentoad.turtlebody.mediapicker.ui.ActivityLibMain
12 | import com.greentoad.turtlebody.mediapicker.ui.base.FragmentBase
13 | import kotlinx.android.synthetic.main.tb_media_picker_file_fragment.*
14 |
15 |
16 | /**
17 | * Created by niraj on 12-04-2019.
18 | */
19 | abstract class MediaListFragment : FragmentBase() {
20 | companion object {
21 |
22 | const val B_ARG_PICKER_CONFIG = "media_list_fragment.args.pickerConfig"
23 | }
24 |
25 | var mMediaPickerConfig: MediaPickerConfig = MediaPickerConfig()
26 | var mFolderId: String = ""
27 | var mUriList: ArrayList = arrayListOf()
28 |
29 | abstract fun onRestoreState(savedInstanceState: Bundle?, args: Bundle?)
30 | override fun onCreate(savedInstanceState: Bundle?) {
31 |
32 | super.onCreate(savedInstanceState)
33 |
34 | arguments?.let {
35 | mMediaPickerConfig = it.getSerializable(B_ARG_PICKER_CONFIG) as MediaPickerConfig
36 | }
37 | onRestoreState(savedInstanceState, arguments)
38 | }
39 |
40 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
41 | // Inflate the layout for this fragment
42 | return inflater.inflate(com.greentoad.turtlebody.mediapicker.R.layout.tb_media_picker_file_fragment, container, false)
43 | }
44 |
45 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
46 | super.onViewCreated(view, savedInstanceState)
47 | initButton()
48 |
49 |
50 | /*******************************************************
51 | * Dynamically change marginBottom for recyclerView
52 | *******************************************************/
53 | if(mMediaPickerConfig.mAllowMultiSelection){
54 | val params = CoordinatorLayout.LayoutParams(
55 | CoordinatorLayout.LayoutParams.MATCH_PARENT,
56 | CoordinatorLayout.LayoutParams.MATCH_PARENT)
57 |
58 | val r = context!!.resources
59 | val px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 56f, r.displayMetrics).toInt()
60 |
61 | params.setMargins(0, 0, 0, px)
62 | file_fragment_recycler_view.layoutParams = params
63 | }
64 | }
65 |
66 | private fun initButton() {
67 | file_fragment_btn_cancel.setOnClickListener {
68 | (activity as ActivityLibMain).onBackPressed()
69 | }
70 | file_fragment_btn_done.setOnClickListener {
71 | getAllUris()
72 | }
73 |
74 | if (!mMediaPickerConfig.mAllowMultiSelection) {
75 | file_fragment_bottom_ll.visibility = View.GONE
76 | }
77 | }
78 |
79 | abstract fun getAllUris()
80 | }
--------------------------------------------------------------------------------
/mediapicker/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | apply plugin: 'kotlin-android'
4 | apply plugin: 'kotlin-android-extensions'
5 |
6 | apply plugin: 'com.jfrog.bintray'
7 | apply plugin: 'com.github.dcendents.android-maven'
8 |
9 |
10 | buildscript {
11 | repositories {
12 | jcenter()
13 | }
14 | dependencies {
15 | classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
16 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
17 | }
18 | }
19 |
20 |
21 | ext {
22 | bintrayRepo = 'android-media-picker'
23 | bintrayName = 'com.greentoad.turtlebody.mediapicker'
24 |
25 | publishedGroupId = 'com.greentoad.turtlebody'
26 | libraryName = 'Android Mediapicker'
27 | artifact = 'media-picker'
28 |
29 | libraryDescription = 'Android Library for selecting media files from local storage'
30 |
31 | siteUrl = 'https://github.com/Turtlebody/android-media-picker'
32 | gitUrl = 'https://github.com/Turtlebody/android-media-picker.git'
33 |
34 | libraryVersionCode = 9
35 | libraryVersion = '1.0.8'
36 |
37 | developerId = 'greentoad'
38 | developerName = 'Green Toad'
39 | developerEmail = 'greentoad312@gmail.com'
40 |
41 | licenseName = 'MIT License'
42 | licenseUrl = 'https://github.com/Turtlebody/android-media-picker/blob/master/LICENSE'
43 | allLicenses = ["MIT"]
44 | }
45 |
46 |
47 | android {
48 | compileSdkVersion 29
49 |
50 | defaultConfig {
51 | minSdkVersion 16
52 | targetSdkVersion 29
53 | versionCode libraryVersionCode
54 | versionName libraryVersion
55 | vectorDrawables.useSupportLibrary = true
56 |
57 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
58 | }
59 |
60 | buildTypes {
61 | release {
62 | minifyEnabled false
63 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
64 | }
65 | }
66 |
67 |
68 | }
69 |
70 | dependencies {
71 | implementation fileTree(dir: 'libs', include: ['*.jar'])
72 |
73 | implementation 'androidx.appcompat:appcompat:1.1.0'
74 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
75 |
76 | implementation 'com.google.android.material:material:1.1.0-alpha10'
77 | implementation 'androidx.recyclerview:recyclerview:1.0.0'
78 |
79 | //Anko
80 | implementation "org.jetbrains.anko:anko:0.10.8"
81 |
82 | //rxjava
83 | implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
84 | implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
85 |
86 | //image
87 | implementation 'com.github.bumptech.glide:glide:4.9.0'
88 |
89 | //Permission
90 | implementation 'com.karumi:dexter:5.0.0'
91 |
92 | testImplementation 'junit:junit:4.12'
93 | androidTestImplementation 'androidx.test:runner:1.3.0-alpha02'
94 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0-alpha02'
95 | }
96 |
97 | repositories {
98 | mavenCentral()
99 | }
100 |
101 | apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
102 | apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
103 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/layout/tb_media_picker_file_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
15 |
16 |
22 |
23 |
29 |
30 |
34 |
35 |
42 |
43 |
53 |
54 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/core/MediaConstants.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.core
2 |
3 | import android.provider.MediaStore
4 |
5 | /**
6 | * Created by WANGSUN on 27-Mar-19.
7 | */
8 | object MediaConstants {
9 |
10 | object Queries{
11 | val imageQueryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
12 | val videoQueryUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
13 | val audioQueryUri = MediaStore.Files.getContentUri("external")
14 | }
15 |
16 | object Projection{
17 | /**
18 | * ImageModel projections
19 | */
20 | val IMAGE_FOLDER = arrayOf(
21 | MediaStore.Images.Media.BUCKET_ID,
22 | MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
23 | MediaStore.Images.Media.DATA)
24 |
25 | val IMAGE_FILE = arrayOf(
26 | MediaStore.Images.Media._ID,
27 | MediaStore.Images.Media.DISPLAY_NAME,
28 | MediaStore.Images.Media.SIZE,
29 | MediaStore.Images.Media.DATA,
30 | MediaStore.Images.Media.BUCKET_ID,
31 | MediaStore.Images.Thumbnails.DATA)
32 |
33 | /**
34 | * VideoModel projections
35 | */
36 | val VIDEO_FOLDER = arrayOf(
37 | MediaStore.Video.Media.BUCKET_ID,
38 | MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
39 | MediaStore.Video.Media.DATA)
40 |
41 | val VIDEO_FILE = arrayOf(
42 | MediaStore.Video.Media._ID,
43 | MediaStore.Video.Media.DISPLAY_NAME,
44 | MediaStore.Video.Media.SIZE,
45 | MediaStore.Video.Media.DATA,
46 | MediaStore.Video.Media.BUCKET_ID,
47 | MediaStore.Video.Thumbnails.DATA,
48 | MediaStore.Video.Media.DURATION)
49 | /**
50 | * AudioModel projections
51 | */
52 | @Deprecated("This only works for album")
53 | val ALBUM_FOLDER = arrayOf(
54 | MediaStore.Audio.Media.ALBUM_ID,
55 | MediaStore.Audio.Media.ALBUM,
56 | MediaStore.Audio.Media.DATA)
57 |
58 | val AUDIO_FOLDER = arrayOf(
59 | MediaStore.Files.FileColumns._ID,
60 | MediaStore.Files.FileColumns.PARENT,
61 | MediaStore.Files.FileColumns.DATA,
62 | MediaStore.Files.FileColumns.DISPLAY_NAME,
63 | "COUNT(" + MediaStore.Files.FileColumns.DATA + ") AS dataCount")
64 |
65 | val AUDIO_FILE = arrayOf(
66 | MediaStore.Audio.Media._ID,
67 | MediaStore.Audio.Media.TITLE,
68 | MediaStore.Audio.Media.DISPLAY_NAME,
69 | MediaStore.Audio.Media.SIZE,
70 | MediaStore.Audio.Media.DATA,
71 | MediaStore.Audio.Media.MIME_TYPE,
72 | MediaStore.Audio.Media.DURATION
73 | )
74 | }
75 |
76 | object Selection{
77 | val AUDIO_FOLDER = MediaStore.Files.FileColumns.MEDIA_TYPE+" = "+MediaStore.Files.FileColumns.MEDIA_TYPE_AUDIO+
78 | //" AND "+ MediaStore.Files.FileColumns.DATA +" NOT LIKE ?"+
79 | ") GROUP BY (" + MediaStore.Files.FileColumns.PARENT
80 | }
81 |
82 | object Intent{
83 | const val ACTIVITY_LIB_MAIN = 201
84 |
85 | }
86 |
87 | object Fragment{
88 | const val IMAGE_VIDEO_FOLDER = 101
89 | const val AUDIO_FOLDER = 102
90 |
91 | const val IMAGE_LIST = 103
92 | const val VIDEO_LIST = 104
93 | const val AUDIO_LIST = 105
94 | }
95 | }
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 |
5 | android {
6 | compileSdkVersion 29
7 | defaultConfig {
8 | applicationId "com.greentoad.turtlebody.mediapicker.sample"
9 | minSdkVersion 16
10 | targetSdkVersion 29
11 | versionCode 5
12 | versionName "1.0.4"
13 | multiDexEnabled true
14 | vectorDrawables.useSupportLibrary = true
15 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
16 | }
17 | signingConfigs {
18 | release
19 | /*config {
20 |
21 | }*/
22 | }
23 | buildTypes {
24 | release {
25 | minifyEnabled false
26 | signingConfig signingConfigs.release
27 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
28 | }
29 | }
30 | }
31 |
32 | dependencies {
33 | implementation fileTree(dir: 'libs', include: ['*.jar'])
34 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
35 | implementation 'androidx.appcompat:appcompat:1.1.0'
36 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
37 |
38 |
39 | implementation 'com.google.android.material:material:1.1.0-alpha10'
40 | implementation 'androidx.recyclerview:recyclerview:1.0.0'
41 | implementation 'androidx.cardview:cardview:1.0.0'
42 |
43 |
44 | implementation 'androidx.multidex:multidex:2.0.1'
45 |
46 | /*Anko*/
47 | implementation "org.jetbrains.anko:anko:0.10.8"
48 |
49 | /* rxjava */
50 | implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
51 | implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
52 |
53 | //module
54 | implementation project(':mediapicker')
55 |
56 | /* image */
57 | implementation 'com.github.bumptech.glide:glide:4.9.0'
58 |
59 | /* Firebase */
60 | // implementation 'com.google.firebase:firebase-core:16.0.8'
61 | // implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9'
62 |
63 | /*Material Dialog*/
64 | implementation 'com.afollestad.material-dialogs:core:2.7.0'
65 |
66 |
67 | testImplementation 'junit:junit:4.12'
68 | androidTestImplementation 'androidx.test:runner:1.3.0-alpha02'
69 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0-alpha02'
70 | }
71 |
72 | def Properties props = new Properties()
73 | def propFile = rootProject.file('app/signing.properties')
74 |
75 | if (propFile.canRead()) {
76 | props.load(new FileInputStream(propFile))
77 |
78 | println 'signing.properties'
79 | if (props != null &&
80 | props.containsKey('STORE_FILE') &&
81 | props.containsKey('STORE_PASSWORD') &&
82 | props.containsKey('KEY_ALIAS') &&
83 | props.containsKey('KEY_PASSWORD')) {
84 | android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
85 | android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
86 | android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
87 | android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
88 | android.signingConfigs.release.v1SigningEnabled = true
89 | android.signingConfigs.release.v2SigningEnabled = true
90 | } else {
91 | println 'signing.properties found but some entries are missing'
92 | android.buildTypes.release.signingConfig = null
93 | }
94 | } else {
95 | println 'signing.properties not found'
96 | android.buildTypes.release.signingConfig = null
97 | }
98 |
99 |
100 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/folder/audio/AudioFolderFragment.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.folder.audio
2 |
3 |
4 | import android.os.Bundle
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import androidx.fragment.app.Fragment
9 | import androidx.recyclerview.widget.LinearLayoutManager
10 | import com.greentoad.turtlebody.mediapicker.R
11 | import com.greentoad.turtlebody.mediapicker.core.FileManager
12 | import com.greentoad.turtlebody.mediapicker.ui.ActivityLibMain
13 | import com.greentoad.turtlebody.mediapicker.ui.base.FragmentBase
14 | import io.reactivex.Single
15 | import io.reactivex.SingleObserver
16 | import io.reactivex.android.schedulers.AndroidSchedulers
17 | import io.reactivex.annotations.NonNull
18 | import io.reactivex.disposables.Disposable
19 | import io.reactivex.schedulers.Schedulers
20 | import kotlinx.android.synthetic.main.tb_media_picker_folder_fragment.*
21 | import kotlinx.android.synthetic.main.tb_media_picker_frame_progress.*
22 | import org.jetbrains.anko.info
23 |
24 |
25 | class AudioFolderFragment : FragmentBase() {
26 |
27 | companion object {
28 |
29 | @JvmStatic
30 | fun newInstance(key: Int, b: Bundle?): Fragment {
31 | val bf: Bundle = b ?: Bundle()
32 | bf.putInt("fragment.key", key);
33 | val fragment = AudioFolderFragment()
34 | fragment.arguments = bf
35 | return fragment
36 | }
37 |
38 | }
39 |
40 | private var mAudioFolderAdapter: AudioFolderAdapter = AudioFolderAdapter()
41 | private var mAudioFolderList: MutableList = arrayListOf()
42 |
43 |
44 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
45 | savedInstanceState: Bundle?): View? {
46 | // Inflate the layout for this fragment
47 | return inflater.inflate(R.layout.tb_media_picker_folder_fragment, container, false)
48 | }
49 |
50 | override fun onActivityCreated(savedInstanceState: Bundle?) {
51 | super.onActivityCreated(savedInstanceState)
52 |
53 | initAdapter()
54 | }
55 |
56 | private fun initAdapter() {
57 | mAudioFolderAdapter.setListener(object : AudioFolderAdapter.OnAudioFolderClickListener {
58 | override fun onFolderClick(pData: AudioFolder) {
59 | info { "folderPath: ${pData.path}" }
60 | (activity as ActivityLibMain).startMediaListFragment(pData.path)
61 | }
62 | })
63 |
64 | folder_fragment_recycler_view.layoutManager = LinearLayoutManager(context)
65 | folder_fragment_recycler_view.adapter = mAudioFolderAdapter
66 | fetchAudioFolders()
67 | }
68 |
69 |
70 | private fun fetchAudioFolders() {
71 | val bucketFetch = Single.fromCallable> {
72 | FileManager.fetchAudioFolderList(context!!) }
73 | bucketFetch
74 | .subscribeOn(Schedulers.io())
75 | .observeOn(AndroidSchedulers.mainThread())
76 | .subscribe(object : SingleObserver> {
77 | override fun onSubscribe(@NonNull d: Disposable) {
78 | frame_progress.visibility = View.VISIBLE
79 | }
80 |
81 | override fun onSuccess(@NonNull audioFolders: ArrayList) {
82 | mAudioFolderList = audioFolders
83 | info { "folders: $audioFolders" }
84 | mAudioFolderAdapter.setData(mAudioFolderList)
85 | frame_progress.visibility = View.GONE
86 | }
87 |
88 | override fun onError(@NonNull e: Throwable) {
89 | frame_progress.visibility = View.GONE
90 | e.printStackTrace()
91 | info { "error: ${e.message}" }
92 | }
93 | })
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/mediapicker/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
14 |
15 |
23 |
24 |
27 |
28 |
32 |
33 |
34 |
39 |
40 |
45 |
46 |
47 |
55 |
56 |
66 |
67 |
68 |
69 |
82 |
83 |
84 |
85 |
91 |
92 |
--------------------------------------------------------------------------------
/mediapicker/src/main/java/com/greentoad/turtlebody/mediapicker/ui/component/media/audio/AudioAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.ui.component.media.audio
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import android.webkit.MimeTypeMap
7 | import androidx.recyclerview.widget.RecyclerView
8 | import com.bumptech.glide.Glide
9 | import com.greentoad.turtlebody.mediapicker.R
10 | import kotlinx.android.synthetic.main.tb_media_picker_item_audio.view.*
11 | import org.jetbrains.anko.AnkoLogger
12 |
13 |
14 | /**
15 | * Created by WANGSUN on 26-Mar-19.
16 | */
17 | class AudioAdapter: RecyclerView.Adapter(), AnkoLogger {
18 | private var mData: MutableList = arrayListOf()
19 | private var mOnAudioClickListener: OnAudioClickListener? = null
20 | var mShowCheckBox: Boolean = false
21 |
22 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioVewHolder {
23 | val view = LayoutInflater.from(parent.context)
24 | .inflate(R.layout.tb_media_picker_item_audio, parent, false)
25 | return AudioVewHolder(view)
26 | }
27 |
28 | override fun getItemCount(): Int {
29 | return mData.size
30 | }
31 |
32 | override fun onBindViewHolder(holder: AudioVewHolder, position: Int) {
33 | holder.bind(mData[position])
34 | }
35 |
36 |
37 | fun setListener(listener : OnAudioClickListener){
38 | mOnAudioClickListener = listener
39 | }
40 |
41 | fun setData(pData: MutableList){
42 | mData = pData
43 | notifyDataSetChanged()
44 | }
45 |
46 | fun updateIsSelected(pData: AudioModel){
47 | val pos = mData.indexOf(pData)
48 | if(pos>=0){
49 | mData[pos] = pData
50 | notifyItemChanged(pos)
51 | }
52 | }
53 |
54 | inner class AudioVewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
55 | fun bind(pData: AudioModel){
56 |
57 | Glide.with(itemView)
58 | .load(getDrawableForMime(pData.mimeType, pData.filePath))
59 | .into(itemView.item_audio_mimetype_icon)
60 |
61 | itemView.item_audio_checkbox.isChecked = pData.isSelected
62 | val size = (pData.size/1000).toString()
63 |
64 | itemView.item_audio_name.text = pData.name
65 | itemView.item_audio_size.text = "$size KB"
66 |
67 | itemView.setOnClickListener {
68 | mOnAudioClickListener?.onAudioCheck(pData)
69 | }
70 |
71 | itemView.item_audio_checkbox.setOnClickListener {
72 | mOnAudioClickListener?.onAudioCheck(pData)
73 | }
74 |
75 | if(!mShowCheckBox){
76 | itemView.item_audio_checkbox.visibility = View.GONE
77 | }
78 | else{
79 | itemView.item_audio_checkbox.visibility = View.VISIBLE
80 | }
81 | }
82 |
83 | private fun getDrawableForMime(mimeType: String?, filePath: String): Int {
84 | //info { "mimeType: "+ mimeType }
85 | var extType = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType)
86 | //info { "extType: "+ extType }
87 |
88 | if(extType==null){
89 | val i = filePath.lastIndexOf('.')
90 | if (i > 0 && i< filePath.length-1) {
91 | extType = filePath.substring(i + 1)
92 | }
93 | }
94 | return when(extType){
95 | "mp3"-> R.drawable.tb_media_picker_ic_audio_mp3
96 | "m4a"-> R.drawable.tb_media_picker_ic_audio_m4a
97 | "mp4"-> R.drawable.tb_media_picker_ic_audio_m4a
98 | "aac" -> R.drawable.tb_media_picker_ic_audio_aac
99 | "wav" -> R.drawable.tb_media_picker_ic_audio_wav
100 | else -> R.drawable.tb_media_picker_ic_audio_aud
101 | }
102 | }
103 | }
104 |
105 |
106 | interface OnAudioClickListener {
107 | fun onAudioCheck(pData: AudioModel)
108 | }
109 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_home.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
13 |
17 |
18 |
24 |
25 |
32 |
33 |
38 |
39 |
48 |
49 |
50 |
51 |
55 |
56 |
63 |
64 |
69 |
70 |
76 |
77 |
78 |
79 |
83 |
84 |
91 |
92 |
97 |
98 |
104 |
105 |
106 |
107 |
108 |
--------------------------------------------------------------------------------
/app/src/main/java/com/greentoad/turtlebody/mediapicker/sample/ActivityHome.kt:
--------------------------------------------------------------------------------
1 | package com.greentoad.turtlebody.mediapicker.sample
2 |
3 |
4 | import android.annotation.SuppressLint
5 | import android.content.Intent
6 | import android.content.pm.ActivityInfo
7 | import android.graphics.Color
8 | import android.graphics.drawable.ColorDrawable
9 | import android.net.Uri
10 | import android.os.Bundle
11 | import android.widget.Button
12 | import android.widget.Toast
13 | import com.afollestad.materialdialogs.MaterialDialog
14 | import com.afollestad.materialdialogs.customview.customView
15 | import com.afollestad.materialdialogs.customview.getCustomView
16 | import com.bumptech.glide.Glide
17 | import com.greentoad.turtlebody.mediapicker.MediaPicker
18 | import com.greentoad.turtlebody.mediapicker.core.MediaPickerConfig
19 | import com.greentoad.turtlebody.mediapicker.sample.show_results.ActivityResults
20 | import com.greentoad.turtlebody.mediapicker.ui.ActivityLibMain
21 | import kotlinx.android.synthetic.main.activity_home.*
22 | import kotlinx.android.synthetic.main.toolbar.*
23 | import org.jetbrains.anko.info
24 | import java.io.Serializable
25 |
26 |
27 |
28 | class ActivityHome : ActivityBase() {
29 |
30 | override fun onCreate(savedInstanceState: Bundle?) {
31 | super.onCreate(savedInstanceState)
32 | setContentView(R.layout.activity_home)
33 |
34 | initToolbar(toolbar)
35 | toolbar.title = "Select Option"
36 | initButton()
37 |
38 | info { "change" }
39 | }
40 |
41 | private fun initButton() {
42 | home_ll_btn_images.setOnClickListener {
43 | showAlert(MediaPicker.MediaTypes.IMAGE)
44 | }
45 |
46 | home_ll_btn_videos.setOnClickListener {
47 | showAlert(MediaPicker.MediaTypes.VIDEO)
48 | }
49 |
50 | home_ll_btn_sounds.setOnClickListener {
51 | showAlert(MediaPicker.MediaTypes.AUDIO)
52 | }
53 |
54 | Glide.with(this)
55 | .load(R.drawable.pic_image)
56 | .into(home_iv_select_images)
57 | }
58 |
59 | private fun showAlert(fileType: Int){
60 | MaterialDialog(this).show {
61 | customView(R.layout.dialog_view,scrollable = true)
62 | this.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
63 |
64 | val view = this.getCustomView()
65 | val singleBtn = view.findViewById