diff --git a/multipicker/src/main/AndroidManifest.xml b/multipicker/src/main/AndroidManifest.xml index 6f714ab388..e1f12697e0 100644 --- a/multipicker/src/main/AndroidManifest.xml +++ b/multipicker/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/AudioPicker.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/AudioPicker.kt index 0f45f90d2b..752cd84e1e 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/AudioPicker.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/AudioPicker.kt @@ -27,14 +27,6 @@ import im.vector.riotx.multipicker.entity.MultiPickerAudioType class AudioPicker(override val requestCode: Int) : Picker(requestCode) { - override fun startWith(activity: Activity) { - activity.startActivityForResult(createIntent(), requestCode) - } - - override fun startWith(fragment: Fragment) { - fragment.startActivityForResult(createIntent(), requestCode) - } - override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { return emptyList() @@ -84,7 +76,7 @@ class AudioPicker(override val requestCode: Int) : Picker( return audioList } - private fun createIntent(): Intent { + override fun createIntent(): Intent { return Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_ALLOW_MULTIPLE, !single) diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/CameraPicker.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/CameraPicker.kt index 81e665a43f..d8c16279cc 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/CameraPicker.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/CameraPicker.kt @@ -28,6 +28,7 @@ import androidx.core.content.FileProvider import androidx.exifinterface.media.ExifInterface import androidx.fragment.app.Fragment import im.vector.riotx.multipicker.entity.MultiPickerImageType +import im.vector.riotx.multipicker.utils.ImageUtils import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -74,25 +75,8 @@ class CameraPicker(val requestCode: Int) { val name = cursor.getString(nameColumn) val size = cursor.getLong(sizeColumn) - var orientation = 0 - - val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, photoUri)) - } else { - context.contentResolver.openInputStream(photoUri)?.use { inputStream -> - BitmapFactory.decodeStream(inputStream) - } - } - - context.contentResolver.openInputStream(photoUri)?.use { inputStream -> - try { - ExifInterface(inputStream).let { - orientation = it.rotationDegrees - } - } catch (e: Exception) { - e.printStackTrace() - } - } + val bitmap = ImageUtils.getBitmap(context, photoUri) + val orientation = ImageUtils.getOrientation(context, photoUri) return MultiPickerImageType( name, diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/ContactPicker.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/ContactPicker.kt index aebde6f439..968c5623e5 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/ContactPicker.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/ContactPicker.kt @@ -26,14 +26,6 @@ import im.vector.riotx.multipicker.entity.MultiPickerContactType class ContactPicker(override val requestCode: Int) : Picker(requestCode) { - override fun startWith(activity: Activity) { - activity.startActivityForResult(createIntent(), requestCode) - } - - override fun startWith(fragment: Fragment) { - fragment.startActivityForResult(createIntent(), requestCode) - } - override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { return emptyList() @@ -126,7 +118,7 @@ class ContactPicker(override val requestCode: Int) : Picker(requestCode) { - override fun startWith(activity: Activity) { - activity.startActivityForResult(createIntent(), requestCode) - } - - override fun startWith(fragment: Fragment) { - fragment.startActivityForResult(createIntent(), requestCode) - } - override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { return emptyList() @@ -64,7 +54,7 @@ class FilePicker(override val requestCode: Int) : Picker(re return fileList } - private fun createIntent(): Intent { + override fun createIntent(): Intent { return Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_ALLOW_MULTIPLE, !single) diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/ImagePicker.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/ImagePicker.kt index bd27244ed5..452724f4c7 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/ImagePicker.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/ImagePicker.kt @@ -27,17 +27,10 @@ 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.utils.ImageUtils class ImagePicker(override val requestCode: Int) : Picker(requestCode) { - override fun startWith(activity: Activity) { - activity.startActivityForResult(createIntent(), requestCode) - } - - override fun startWith(fragment: Fragment) { - fragment.startActivityForResult(createIntent(), requestCode) - } - override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { return emptyList() @@ -65,25 +58,8 @@ class ImagePicker(override val requestCode: Int) : Picker( val name = cursor.getString(nameColumn) val size = cursor.getLong(sizeColumn) - var orientation = 0 - - val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, selectedUri)) - } else { - context.contentResolver.openInputStream(selectedUri)?.use { inputStream -> - BitmapFactory.decodeStream(inputStream) - } - } - - context.contentResolver.openInputStream(selectedUri)?.use { inputStream -> - try { - ExifInterface(inputStream).let { - orientation = it.rotationDegrees - } - } catch (e: Exception) { - e.printStackTrace() - } - } + val bitmap = ImageUtils.getBitmap(context, selectedUri) + val orientation = ImageUtils.getOrientation(context, selectedUri) imageList.add( MultiPickerImageType( @@ -102,7 +78,7 @@ class ImagePicker(override val requestCode: Int) : Picker( return imageList } - private fun createIntent(): Intent { + override fun createIntent(): Intent { return Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_ALLOW_MULTIPLE, !single) diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/Picker.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/Picker.kt index 58754cd74e..c1784ee054 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/Picker.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/Picker.kt @@ -26,10 +26,6 @@ abstract class Picker(open val requestCode: Int) { protected var single = false - abstract fun startWith(activity: Activity) - - abstract fun startWith(fragment: Fragment) - open fun startWithExpectingFile(activity: Activity): Uri? = null open fun startWithExpectingFile(fragment: Fragment): Uri? = null @@ -45,6 +41,16 @@ abstract class Picker(open val requestCode: Int) { return this } + abstract fun createIntent(): Intent + + fun startWith(activity: Activity) { + activity.startActivityForResult(createIntent(), requestCode) + } + + fun startWith(fragment: Fragment) { + fragment.startActivityForResult(createIntent(), requestCode) + } + protected fun getSelectedUriList(data: Intent?): List { val selectedUriList = mutableListOf() val dataUri = data?.data diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/VideoPicker.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/VideoPicker.kt index 739c24c6c7..c2a441c15a 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/VideoPicker.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/VideoPicker.kt @@ -27,14 +27,6 @@ import im.vector.riotx.multipicker.entity.MultiPickerVideoType class VideoPicker(override val requestCode: Int) : Picker(requestCode) { - override fun startWith(activity: Activity) { - activity.startActivityForResult(createIntent(), requestCode) - } - - override fun startWith(fragment: Fragment) { - fragment.startActivityForResult(createIntent(), requestCode) - } - override fun getSelectedFiles(context: Context, requestCode: Int, resultCode: Int, data: Intent?): List { if (requestCode != this.requestCode && resultCode != Activity.RESULT_OK) { return emptyList() @@ -93,7 +85,7 @@ class VideoPicker(override val requestCode: Int) : Picker( return videoList } - private fun createIntent(): Intent { + override fun createIntent(): Intent { return Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_ALLOW_MULTIPLE, !single) diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/MultiPickerFileProvider.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/provider/MultiPickerFileProvider.kt similarity index 93% rename from multipicker/src/main/java/im/vector/riotx/multipicker/MultiPickerFileProvider.kt rename to multipicker/src/main/java/im/vector/riotx/multipicker/provider/MultiPickerFileProvider.kt index 1549b43fd7..048b2ca199 100644 --- a/multipicker/src/main/java/im/vector/riotx/multipicker/MultiPickerFileProvider.kt +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/provider/MultiPickerFileProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.riotx.multipicker +package im.vector.riotx.multipicker.provider import androidx.core.content.FileProvider diff --git a/multipicker/src/main/java/im/vector/riotx/multipicker/utils/ImageUtils.kt b/multipicker/src/main/java/im/vector/riotx/multipicker/utils/ImageUtils.kt new file mode 100644 index 0000000000..76f4b677a0 --- /dev/null +++ b/multipicker/src/main/java/im/vector/riotx/multipicker/utils/ImageUtils.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.multipicker.utils + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.ImageDecoder +import android.net.Uri +import android.os.Build +import androidx.exifinterface.media.ExifInterface + +object ImageUtils { + + fun getBitmap(context: Context, uri: Uri): Bitmap? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, uri)) + } else { + context.contentResolver.openInputStream(uri)?.use { inputStream -> + BitmapFactory.decodeStream(inputStream) + } + } + } + + fun getOrientation(context: Context, uri: Uri): Int { + var orientation = 0 + context.contentResolver.openInputStream(uri)?.use { inputStream -> + try { + ExifInterface(inputStream).let { + orientation = it.rotationDegrees + } + } catch (e: Exception) { + e.printStackTrace() + } + } + return orientation + } +}