aboutsummaryrefslogtreecommitdiff
path: root/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-08-18 14:39:40 -0700
committerAllan Wang <me@allanwang.ca>2017-08-30 12:24:19 -0400
commita101b528efdee74fc1970b7f1fe68263f0b20269 (patch)
tree8fbd0fea544ec543cdf5ea2b74d81099d4ebd554 /mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt
parent9432652b03ae4d01e3dda4325984637d9523b9e2 (diff)
downloadkau-a101b528efdee74fc1970b7f1fe68263f0b20269.tar.gz
kau-a101b528efdee74fc1970b7f1fe68263f0b20269.tar.bz2
kau-a101b528efdee74fc1970b7f1fe68263f0b20269.zip
Create media picker action items (#40)
* Create action items * Increment version * Update camera action * Abstract camera action * Add and test * Refactor and add docs
Diffstat (limited to 'mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt')
-rw-r--r--mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt109
1 files changed, 104 insertions, 5 deletions
diff --git a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt
index 71449d3..6f0241c 100644
--- a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt
+++ b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt
@@ -2,12 +2,16 @@ package ca.allanwang.kau.mediapicker
import android.Manifest
import android.app.Activity
+import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.database.Cursor
import android.graphics.Color
import android.graphics.drawable.Drawable
+import android.net.Uri
import android.os.Bundle
+import android.provider.BaseColumns
+import android.provider.DocumentsContract
import android.provider.MediaStore
import android.support.v4.app.LoaderManager
import android.support.v4.content.CursorLoader
@@ -18,15 +22,19 @@ import ca.allanwang.kau.animators.FadeScaleAnimatorAdd
import ca.allanwang.kau.animators.KauAnimator
import ca.allanwang.kau.internal.KauBaseActivity
import ca.allanwang.kau.kotlin.lazyContext
+import ca.allanwang.kau.logging.KL
import ca.allanwang.kau.permissions.kauRequestPermissions
import ca.allanwang.kau.utils.dimenPixelSize
import ca.allanwang.kau.utils.toast
import com.bumptech.glide.Glide
import com.mikepenz.fastadapter.IItem
+import com.mikepenz.fastadapter.adapters.HeaderAdapter
import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter
import com.mikepenz.google_material_typeface_library.GoogleMaterial
import com.mikepenz.iconics.IconicsDrawable
+import com.mikepenz.iconics.typeface.IIcon
import org.jetbrains.anko.doAsync
+import java.io.File
import java.util.concurrent.ExecutionException
import java.util.concurrent.Future
@@ -35,7 +43,10 @@ import java.util.concurrent.Future
*
* Container for the main logic behind the both pickers
*/
-abstract class MediaPickerCore<T : IItem<*, *>>(val mediaType: MediaType) : KauBaseActivity(), LoaderManager.LoaderCallbacks<Cursor> {
+abstract class MediaPickerCore<T : IItem<*, *>>(
+ val mediaType: MediaType,
+ val mediaActions: List<MediaAction>
+) : KauBaseActivity(), LoaderManager.LoaderCallbacks<Cursor> {
companion object {
val viewSize = lazyContext { computeViewSize(it) }
@@ -62,11 +73,13 @@ abstract class MediaPickerCore<T : IItem<*, *>>(val mediaType: MediaType) : KauB
/**
* Create error tile for a given item
*/
- fun getErrorDrawable(context: Context): Drawable {
+ fun getErrorDrawable(context: Context) = getIconDrawable(context, GoogleMaterial.Icon.gmd_error, accentColor)
+
+ fun getIconDrawable(context: Context, iicon: IIcon, color: Int): Drawable {
val sizePx = MediaPickerCore.computeViewSize(context)
- return IconicsDrawable(context, GoogleMaterial.Icon.gmd_error)
+ return IconicsDrawable(context, iicon)
.sizePx(sizePx)
- .backgroundColor(accentColor)
+ .backgroundColor(color)
.paddingPx(sizePx / 3)
.color(Color.WHITE)
}
@@ -101,6 +114,9 @@ abstract class MediaPickerCore<T : IItem<*, *>>(val mediaType: MediaType) : KauB
val extraSpace: Int by lazy { resources.displayMetrics.heightPixels }
fun initializeRecycler(recycler: RecyclerView) {
+ val adapterWrapper = HeaderAdapter<MediaActionItem>()
+ adapterWrapper.wrap(adapter)
+ adapterWrapper.add(mediaActions.map { MediaActionItem(it, mediaType) })
recycler.apply {
val manager = object : GridLayoutManager(context, computeColumnCount(context)) {
override fun getExtraLayoutSpace(state: RecyclerView.State?): Int {
@@ -110,7 +126,7 @@ abstract class MediaPickerCore<T : IItem<*, *>>(val mediaType: MediaType) : KauB
setItemViewCacheSize(CACHE_SIZE)
isDrawingCacheEnabled = true
layoutManager = manager
- adapter = this@MediaPickerCore.adapter
+ adapter = adapterWrapper
setHasFixedSize(true)
itemAnimator = KauAnimator(FadeScaleAnimatorAdd(0.8f))
}
@@ -209,4 +225,87 @@ abstract class MediaPickerCore<T : IItem<*, *>>(val mediaType: MediaType) : KauB
prefetcher?.cancel(true)
super.onDestroy()
}
+
+ /**
+ * Method used to retrieve uri data for API 19+
+ * See <a href="http://hmkcode.com/android-display-selected-image-and-its-real-path/"></a>
+ */
+ private fun <R> ContentResolver.query(baseUri: Uri, uris: List<Uri>, block: (cursor: Cursor) -> R) {
+ val ids = uris.map {
+ DocumentsContract.getDocumentId(it).split(":").getOrNull(1)
+ }.filterNotNull().joinToString(prefix = "(", separator = ",", postfix = ")")
+ //? query replacements are done for one arg at a time
+ //since we potentially have a list of ids, we'll just format the WHERE clause ourself
+ query(baseUri, MediaModel.projection, "${BaseColumns._ID} IN $ids", null, sortQuery)?.use(block)
+ }
+
+ internal var tempPath: String? = null
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ if (resultCode != RESULT_OK) {
+ if (tempPath != null) {
+ val f = File(tempPath)
+ if (f.exists()) f.delete()
+ tempPath = null
+ }
+ return super.onActivityResult(requestCode, resultCode, data)
+ }
+ KL.d("Media result received")
+ if (data == null) {
+ KL.d("Media null intent")
+ return super.onActivityResult(requestCode, resultCode, data)
+ }
+ when (requestCode) {
+ MEDIA_ACTION_REQUEST_CAMERA -> onCameraResult(data)
+ MEDIA_ACTION_REQUEST_PICKER -> onPickerResult(data)
+ else -> super.onActivityResult(requestCode, resultCode, data)
+ }
+ }
+
+ private fun onCameraResult(data: Intent) {
+ val f: File
+ if (tempPath != null) {
+ f = File(tempPath)
+ tempPath = null
+ } else if (data.data != null) {
+ f = File(data.data.path)
+ } else {
+ KL.d("Media camera no file found")
+ return
+ }
+ if (f.exists()) {
+ KL.v("Media camera path found", f.absolutePath)
+ scanMedia(f)
+ finish(arrayListOf(MediaModel(f)))
+ } else {
+ KL.d("Media camera file not found")
+ }
+ }
+
+ private fun onPickerResult(data: Intent) {
+ val items = mutableListOf<Uri>()
+ if (data.data != null) {
+ KL.v("Media picker data uri", data.data.path)
+ items.add(data.data)
+ } else {
+ val clip = data.clipData
+ if (clip != null) {
+ items.addAll((0 until clip.itemCount).map {
+ clip.getItemAt(it).uri.apply {
+ KL.v("Media picker clip uri", path)
+ }
+ })
+ }
+ }
+ if (items.isEmpty()) return KL.d("Media picker empty intent")
+ contentResolver.query(mediaType.contentUri, items) {
+ if (it.moveToFirst()) {
+ val models = arrayListOf<MediaModel>()
+ do {
+ models.add(MediaModel(it))
+ } while (it.moveToNext())
+ finish(models)
+ }
+ }
+ }
} \ No newline at end of file