Add documentation.

This commit is contained in:
onurays 2020-03-24 12:15:14 +03:00
parent 727d86236b
commit d20b1cb64a
8 changed files with 79 additions and 20 deletions

View File

@ -20,9 +20,7 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.media.MediaMetadataRetriever import android.media.MediaMetadataRetriever
import android.net.Uri
import android.provider.MediaStore import android.provider.MediaStore
import androidx.fragment.app.Fragment
import im.vector.riotx.multipicker.entity.MultiPickerAudioType import im.vector.riotx.multipicker.entity.MultiPickerAudioType
class AudioPicker(override val requestCode: Int) : Picker<MultiPickerAudioType>(requestCode) { class AudioPicker(override val requestCode: Int) : Picker<MultiPickerAudioType>(requestCode) {

View File

@ -19,13 +19,9 @@ package im.vector.riotx.multipicker
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.BitmapFactory
import android.graphics.ImageDecoder
import android.net.Uri import android.net.Uri
import android.os.Build
import android.provider.MediaStore import android.provider.MediaStore
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.exifinterface.media.ExifInterface
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import im.vector.riotx.multipicker.entity.MultiPickerImageType import im.vector.riotx.multipicker.entity.MultiPickerImageType
import im.vector.riotx.multipicker.utils.ImageUtils import im.vector.riotx.multipicker.utils.ImageUtils
@ -34,8 +30,16 @@ import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
/**
* Implementation of taking a photo with Camera
*/
class CameraPicker(val requestCode: Int) { class CameraPicker(val requestCode: Int) {
/**
* Start camera by using an Activity
* @param activity Activity to handle onActivityResult().
* @return Uri of taken photo or null if the operation is cancelled.
*/
fun startWithExpectingFile(activity: Activity): Uri? { fun startWithExpectingFile(activity: Activity): Uri? {
val photoUri = createPhotoUri(activity) val photoUri = createPhotoUri(activity)
val intent = createIntent().apply { val intent = createIntent().apply {
@ -45,6 +49,11 @@ class CameraPicker(val requestCode: Int) {
return photoUri return photoUri
} }
/**
* Start camera by using a Fragment
* @param fragment Fragment to handle onActivityResult().
* @return Uri of taken photo or null if the operation is cancelled.
*/
fun startWithExpectingFile(fragment: Fragment): Uri? { fun startWithExpectingFile(fragment: Fragment): Uri? {
val photoUri = createPhotoUri(fragment.requireContext()) val photoUri = createPhotoUri(fragment.requireContext())
val intent = createIntent().apply { val intent = createIntent().apply {
@ -54,6 +63,12 @@ class CameraPicker(val requestCode: Int) {
return photoUri return photoUri
} }
/**
* Call this function from onActivityResult(int, int, Intent).
* @return Taken photo or null if request code is wrong
* or result code is not Activity.RESULT_OK
* or user cancelled the operation.
*/
fun getTakenPhoto(context: Context, requestCode: Int, resultCode: Int, photoUri: Uri): MultiPickerImageType? { fun getTakenPhoto(context: Context, requestCode: Int, resultCode: Int, photoUri: Uri): MultiPickerImageType? {
if (requestCode == this.requestCode && resultCode == Activity.RESULT_OK) { if (requestCode == this.requestCode && resultCode == Activity.RESULT_OK) {
val projection = arrayOf( val projection = arrayOf(

View File

@ -21,11 +21,19 @@ import android.content.ContentResolver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.provider.ContactsContract import android.provider.ContactsContract
import androidx.fragment.app.Fragment
import im.vector.riotx.multipicker.entity.MultiPickerContactType import im.vector.riotx.multipicker.entity.MultiPickerContactType
/**
* Contact Picker implementation
*/
class ContactPicker(override val requestCode: Int) : Picker<MultiPickerContactType>(requestCode) { class ContactPicker(override val requestCode: Int) : Picker<MultiPickerContactType>(requestCode) {
/**
* Call this function from onActivityResult(int, int, Intent).
* Returns selected contact or empty list if request code is wrong
* or result code is not Activity.RESULT_OK
* or user did not select any files.
*/
override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerContactType> { override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerContactType> {
if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) {
return emptyList() return emptyList()

View File

@ -22,8 +22,17 @@ import android.content.Intent
import android.provider.OpenableColumns import android.provider.OpenableColumns
import im.vector.riotx.multipicker.entity.MultiPickerFileType import im.vector.riotx.multipicker.entity.MultiPickerFileType
/**
* Implementation of selecting any type of files
*/
class FilePicker(override val requestCode: Int) : Picker<MultiPickerFileType>(requestCode) { class FilePicker(override val requestCode: Int) : Picker<MultiPickerFileType>(requestCode) {
/**
* Call this function from onActivityResult(int, int, Intent).
* Returns selected files or empty list if request code is wrong
* or result code is not Activity.RESULT_OK
* or user did not select any files.
*/
override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerFileType> { override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerFileType> {
if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) {
return emptyList() return emptyList()

View File

@ -19,18 +19,21 @@ package im.vector.riotx.multipicker
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.BitmapFactory
import android.graphics.ImageDecoder
import android.net.Uri
import android.os.Build
import android.provider.MediaStore import android.provider.MediaStore
import androidx.exifinterface.media.ExifInterface
import androidx.fragment.app.Fragment
import im.vector.riotx.multipicker.entity.MultiPickerImageType import im.vector.riotx.multipicker.entity.MultiPickerImageType
import im.vector.riotx.multipicker.utils.ImageUtils import im.vector.riotx.multipicker.utils.ImageUtils
/**
* Image Picker implementation
*/
class ImagePicker(override val requestCode: Int) : Picker<MultiPickerImageType>(requestCode) { class ImagePicker(override val requestCode: Int) : Picker<MultiPickerImageType>(requestCode) {
/**
* Call this function from onActivityResult(int, int, Intent).
* Returns selected image files or empty list if request code is wrong
* or result code is not Activity.RESULT_OK
* or user did not select any files.
*/
override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerImageType> { override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerImageType> {
if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) {
return emptyList() return emptyList()

View File

@ -22,20 +22,32 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
/**
* Abstract class to provide all types of Pickers
*/
abstract class Picker<T>(open val requestCode: Int) { abstract class Picker<T>(open val requestCode: Int) {
protected var single = false protected var single = false
open fun startWithExpectingFile(activity: Activity): Uri? = null /**
* Call this function from onActivityResult(int, int, Intent).
open fun startWithExpectingFile(fragment: Fragment): Uri? = null * @return selected files or empty list if request code is wrong
* or result code is not Activity.RESULT_OK
* or user did not select any files.
*/
abstract fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<T> abstract fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<T>
/**
* Use this function to retrieve files which are shared from another application or internally
* by using android.intent.action.SEND or android.intent.action.SEND_MULTIPLE actions.
*/
fun getIncomingFiles(context: Context, data: Intent?): List<T> { fun getIncomingFiles(context: Context, data: Intent?): List<T> {
return getSelectedFiles(context, requestCode, Activity.RESULT_OK, data) return getSelectedFiles(context, requestCode, Activity.RESULT_OK, data)
} }
/**
* Call this function to disable multiple selection of files.
*/
fun single(): Picker<T> { fun single(): Picker<T> {
single = true single = true
return this return this
@ -43,10 +55,18 @@ abstract class Picker<T>(open val requestCode: Int) {
abstract fun createIntent(): Intent abstract fun createIntent(): Intent
/**
* Start Storage Access Framework UI by using an Activity.
* @param activity Activity to handle onActivityResult().
*/
fun startWith(activity: Activity) { fun startWith(activity: Activity) {
activity.startActivityForResult(createIntent(), requestCode) activity.startActivityForResult(createIntent(), requestCode)
} }
/**
* Start Storage Access Framework UI by using a Fragment.
* @param fragment Fragment to handle onActivityResult().
*/
fun startWith(fragment: Fragment) { fun startWith(fragment: Fragment) {
fragment.startActivityForResult(createIntent(), requestCode) fragment.startActivityForResult(createIntent(), requestCode)
} }

View File

@ -20,13 +20,20 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.media.MediaMetadataRetriever import android.media.MediaMetadataRetriever
import android.net.Uri
import android.provider.MediaStore import android.provider.MediaStore
import androidx.fragment.app.Fragment
import im.vector.riotx.multipicker.entity.MultiPickerVideoType import im.vector.riotx.multipicker.entity.MultiPickerVideoType
/**
* Video Picker implementation
*/
class VideoPicker(override val requestCode: Int) : Picker<MultiPickerVideoType>(requestCode) { class VideoPicker(override val requestCode: Int) : Picker<MultiPickerVideoType>(requestCode) {
/**
* Call this function from onActivityResult(int, int, Intent).
* Returns selected video files or empty list if request code is wrong
* or result code is not Activity.RESULT_OK
* or user did not select any files.
*/
override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerVideoType> { override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List<MultiPickerVideoType> {
if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) {
return emptyList() return emptyList()

View File

@ -156,7 +156,6 @@ import im.vector.riotx.features.reactions.EmojiReactionPickerActivity
import im.vector.riotx.features.settings.VectorPreferences import im.vector.riotx.features.settings.VectorPreferences
import im.vector.riotx.features.share.SharedData import im.vector.riotx.features.share.SharedData
import im.vector.riotx.features.themes.ThemeUtils import im.vector.riotx.features.themes.ThemeUtils
import im.vector.riotx.multipicker.MultiPicker
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize