Skip to content

Commit b7ee635

Browse files
author
fengpeng
committed
PickControl add PickCallback
1 parent b35186b commit b7ee635

5 files changed

Lines changed: 128 additions & 70 deletions

File tree

app/src/main/java/pizzk/media/picker/demo/MainActivity.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.os.Bundle
66
import androidx.appcompat.app.AppCompatActivity
77
import android.widget.ImageView
88
import android.widget.TextView
9+
import android.widget.Toast
910
import pizzk.media.picker.arch.CropParams
1011
import pizzk.media.picker.arch.MimeType
1112
import pizzk.media.picker.arch.PickControl
@@ -23,18 +24,33 @@ class MainActivity : AppCompatActivity() {
2324
val photoGroup: PhotoGroupView = findViewById(R.id.photoGroup)
2425
val size: Int = resources.getDimensionPixelSize(R.dimen.x110)
2526
val tvHint: TextView = findViewById(R.id.tvHint)
26-
val special: PhotoGroupView.Special = PhotoGroupView.Special(this@MainActivity, limit = 20, column = 4)
27-
photoGroup.setup(special, emptyList(), readOnly = false, appendText = "添加文件") { adapter, _ ->
27+
val special: PhotoGroupView.Special =
28+
PhotoGroupView.Special(this@MainActivity, limit = 20, column = 4)
29+
photoGroup.setup(
30+
special,
31+
emptyList(),
32+
readOnly = false,
33+
appendText = "添加文件"
34+
) { adapter, _ ->
2835
tvHint.text = "(${adapter.selectCount()}/${special.limit})"
2936
}
3037
//单张选择示例
3138
val ivSingle: ImageView = findViewById(R.id.ivSingle)
3239
val crop = CropParams(aspectX = 1, aspectY = 1)
3340
ivSingle.setOnClickListener {
34-
PickPhotoHelper.show(this@MainActivity, 1, crop, callback = { _, uris ->
35-
val uri: Uri = uris[0]
36-
PickControl.imageLoad().load(ivSingle, uri, MimeType.JPEG.mime)
37-
})
41+
val callback: PickControl.PickCallback = object : PickControl.PickCallback() {
42+
override fun onSuccess(action: Int, uris: List<Uri>) {
43+
val uri: Uri = uris[0]
44+
PickControl.imageLoad().load(ivSingle, uri, MimeType.JPEG.mime)
45+
}
46+
47+
override fun onFailure(cancel: Boolean, msg: String) {
48+
if (cancel) {
49+
Toast.makeText(baseContext, "用户取消", Toast.LENGTH_SHORT).show()
50+
}
51+
}
52+
}
53+
PickPhotoHelper.show(this@MainActivity, 1, crop, callback = callback)
3854
}
3955
}
4056
}

picker/src/main/java/pizzk/media/picker/arch/PickControl.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class PickControl private constructor() {
2929

3030
//默认函数块
3131
private val dFilter: (Uri?, String) -> Boolean = { _, _ -> true }
32-
private val dCallback: (action: Int, List<Uri>) -> Unit = { _, _ -> Unit }
32+
private val dCallback: PickCallback = PickCallback()
3333

3434
private val picker: PickControl = PickControl()
3535

@@ -47,7 +47,7 @@ class PickControl private constructor() {
4747
private var action: Int = ACTION_NONE
4848
private var filter: (Uri?, String) -> Boolean = dFilter
4949
private var limit: Int = 1
50-
private var callback: (action: Int, List<Uri>) -> Unit = dCallback
50+
private var callback: PickCallback = dCallback
5151

5252
//裁剪
5353
private var crop: CropParams? = null
@@ -76,6 +76,12 @@ class PickControl private constructor() {
7676
return this
7777
}
7878

79+
open class PickCallback {
80+
open fun onSuccess(action: Int, uris: List<Uri>) = Unit
81+
82+
open fun onFailure(cancel: Boolean, msg: String) = Unit
83+
}
84+
7985
/**
8086
* 设置操作意图码
8187
*/
@@ -127,8 +133,8 @@ class PickControl private constructor() {
127133
/**
128134
* 设置拾取回调
129135
*/
130-
fun callback(block: (action: Int, uris: List<Uri>) -> Unit): PickControl {
131-
this.callback = block
136+
fun callback(callback: PickCallback): PickControl {
137+
this.callback = callback
132138
return this
133139
}
134140

@@ -161,7 +167,7 @@ class PickControl private constructor() {
161167
/**
162168
* 获取回调函数
163169
*/
164-
internal fun callbacks(): (action: Int, uris: List<Uri>) -> Unit = callback
170+
internal fun callback(): PickCallback = callback
165171

166172
/**
167173
* 获预选择图片路径

picker/src/main/java/pizzk/media/picker/utils/PickPhotoHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import pizzk.media.picker.view.PickChoseActivity
1313
object PickPhotoHelper {
1414

1515
fun show(activity: Activity, limit: Int = 1, cropParams: CropParams? = null,
16-
callback: (action: Int, uris: List<Uri>) -> Unit) {
16+
callback: PickControl.PickCallback) {
1717
val choiceList: List<String> = listOf(
1818
activity.getString(R.string.pick_chose_camera),
1919
activity.getString(R.string.pick_chose_album)

picker/src/main/java/pizzk/media/picker/view/PickActivity.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ class PickActivity : AppCompatActivity() {
4040
}
4141
}
4242

43-
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
43+
override fun onRequestPermissionsResult(
44+
requestCode: Int,
45+
permissions: Array<out String>,
46+
grantResults: IntArray
47+
) {
4448
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
4549
if (!PickUtils.onRequestPermissionResult(this@PickActivity, permissions, grantResults)) {
4650
finish()
@@ -61,16 +65,18 @@ class PickActivity : AppCompatActivity() {
6165

6266
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
6367
super.onActivityResult(requestCode, resultCode, data)
68+
val picker: PickControl = PickControl.obtain(false)
6469
if (Activity.RESULT_CANCELED == resultCode) {
6570
Log.d(TAG, getString(R.string.pick_media_user_cancel))
71+
picker.callback().onFailure(true, "")
6672
finish()
6773
return
6874
}
6975
if (Activity.RESULT_OK != resultCode) {
76+
picker.callback().onFailure(false, "result is not ok")
7077
finish()
7178
return
7279
}
73-
val picker: PickControl = PickControl.obtain(false)
7480
when (requestCode) {
7581
PickUtils.REQUEST_CODE_CAMERA -> {
7682
val file: File? = PickControl.obtain(false).cameraFile()
@@ -81,7 +87,7 @@ class PickActivity : AppCompatActivity() {
8187
PickUtils.launchCrop(this@PickActivity)
8288
return
8389
} else {
84-
picker.callbacks().invoke(picker.action(), listOf(uri))
90+
picker.callback().onSuccess(picker.action(), listOf(uri))
8591
}
8692
}
8793
finish()
@@ -93,18 +99,21 @@ class PickActivity : AppCompatActivity() {
9399
PickUtils.launchCrop(this@PickActivity)
94100
return
95101
} else {
96-
picker.callbacks().invoke(picker.action(), uris)
102+
picker.callback().onSuccess(picker.action(), uris)
97103
}
98104
finish()
99105
}
100106
PickUtils.REQUEST_CODE_PREVIEW -> {
107+
picker.callback().onSuccess(picker.action(), emptyList())
101108
finish()
102109
}
103110
PickUtils.REQUEST_CODE_CROP -> {
104111
val file: File? = PickControl.obtain(false).cropFile()
105112
if (null != file) {
106113
val uri: Uri = PickUtils.saveToAlbum(baseContext, file)
107-
PickControl.obtain(false).callbacks().invoke(picker.action(), listOf(uri))
114+
PickControl.obtain(false).callback().onSuccess(picker.action(), listOf(uri))
115+
} else {
116+
picker.callback().onFailure(false, "request crop failed.")
108117
}
109118
finish()
110119
}

picker/src/main/java/pizzk/media/picker/widget/PhotoGroupView.kt

Lines changed: 80 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,18 @@ class PhotoGroupView : RecyclerView {
2727
private var spacing: Int = 0
2828

2929
constructor(context: Context) : this(context, null)
30-
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, androidx.recyclerview.R.attr.recyclerViewStyle)
30+
constructor(context: Context, attrs: AttributeSet?) : this(
31+
context,
32+
attrs,
33+
androidx.recyclerview.R.attr.recyclerViewStyle
34+
)
3135

3236
@SuppressLint("Recycle")
33-
constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {
37+
constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(
38+
context,
39+
attrs,
40+
defStyle
41+
) {
3442
isVerticalScrollBarEnabled = false
3543
isHorizontalScrollBarEnabled = false
3644
overScrollMode = OVER_SCROLL_NEVER
@@ -41,19 +49,22 @@ class PhotoGroupView : RecyclerView {
4149
}
4250

4351
private val choiceList: List<String> = listOf(
44-
context.getString(R.string.pick_chose_camera),
45-
context.getString(R.string.pick_chose_album)
52+
context.getString(R.string.pick_chose_camera),
53+
context.getString(R.string.pick_chose_album)
4654
)
4755

48-
fun setup(special: Special,
49-
exists: List<String>? = null,
50-
readOnly: Boolean,
51-
appendText: String = "",
52-
changed: (PhotoGroupAdapter, Int) -> Unit = { _, _ -> }) {
56+
fun setup(
57+
special: Special,
58+
exists: List<String>? = null,
59+
readOnly: Boolean,
60+
appendText: String = "",
61+
changed: (PhotoGroupAdapter, Int) -> Unit = { _, _ -> }
62+
) {
5363
post {
5464
val vWidth = measuredWidth - paddingStart - paddingEnd
5565
val minWidth = context.resources.getDimensionPixelOffset(R.dimen.pick_photo_min_size)
56-
val lp: ViewGroup.LayoutParams = ViewGroup.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT)
66+
val lp: ViewGroup.LayoutParams =
67+
ViewGroup.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT)
5768
do {
5869
lp.width = (vWidth - (special.column - 1) * spacing) / special.column
5970
if (lp.width >= minWidth || special.column <= 1) break
@@ -78,13 +89,23 @@ class PhotoGroupView : RecyclerView {
7889
if (el.path.isEmpty()) {
7990
if (pAdapter.isReadOnly()) return@setTapBlock
8091
//选择图片
81-
val selects: List<String> = if (pAdapter.isAppend) pAdapter.selectPaths() else emptyList()
92+
val selects: List<String> =
93+
if (pAdapter.isAppend) pAdapter.selectPaths() else emptyList()
8294
PickChoseActivity.show(special.activity, choiceList) { key ->
83-
showPickPhoto(special.activity, key, selects, special.limit, pAdapter, index, special.crop)
95+
showPickPhoto(
96+
special.activity,
97+
key,
98+
selects,
99+
special.limit,
100+
pAdapter,
101+
index,
102+
special.crop
103+
)
84104
}
85105
} else {
86106
//预览
87-
val selects: List<String> = if (pAdapter.isAppend) pAdapter.selectPaths() else arrayListOf(el.path)
107+
val selects: List<String> =
108+
if (pAdapter.isAppend) pAdapter.selectPaths() else arrayListOf(el.path)
88109
showPreview(special.activity, selects, if (pAdapter.isAppend) index else 0)
89110
}
90111
}
@@ -99,20 +120,22 @@ class PhotoGroupView : RecyclerView {
99120
//跳转至预览
100121
private fun showPreview(activity: Activity, selects: List<String>, index: Int) {
101122
PickControl.obtain(true)
102-
.action(PickControl.ACTION_PREVIEW)
103-
.selects(selects)
104-
.index(index)
105-
.done(activity)
123+
.action(PickControl.ACTION_PREVIEW)
124+
.selects(selects)
125+
.index(index)
126+
.done(activity)
106127
}
107128

108129
//跳转至选择图片
109-
private fun showPickPhoto(activity: Activity,
110-
key: String,
111-
selects: List<String>,
112-
limit: Int,
113-
adapter: PhotoGroupAdapter,
114-
index: Int,
115-
crop: CropParams?) {
130+
private fun showPickPhoto(
131+
activity: Activity,
132+
key: String,
133+
selects: List<String>,
134+
limit: Int,
135+
adapter: PhotoGroupAdapter,
136+
index: Int,
137+
crop: CropParams?
138+
) {
116139
val action: Int = when (key) {
117140
choiceList[0] -> {
118141
PickControl.ACTION_CAMERA
@@ -123,46 +146,50 @@ class PhotoGroupView : RecyclerView {
123146
else -> -1
124147
}
125148
if (action < 0) return
126-
val block: (Int, List<Uri>) -> Unit = { code, list ->
127-
if (code == PickControl.ACTION_CAMERA) {
128-
if (adapter.isAppend) {
129-
val allOf: MutableList<String> = ArrayList(adapter.selectCount() + 1)
130-
allOf.addAll(adapter.selectPaths())
131-
allOf.addAll(list.map(Uri::toString))
132-
adapter.update(allOf, limit, index)
133-
} else {
134-
adapter.update(list.map(Uri::toString), limit, index)
135-
}
136-
} else {
137-
if (adapter.isAppend) {
138-
val remotes: List<String> = selects.filter { null == PickUtils.path2Uri(it) }
139-
val allOf: MutableList<String> = ArrayList(limit)
140-
allOf.addAll(remotes)
141-
allOf.addAll(list.map(Uri::toString))
142-
adapter.update(allOf, limit, index)
149+
val block: PickControl.PickCallback = object : PickControl.PickCallback() {
150+
override fun onSuccess(action: Int, uris: List<Uri>) {
151+
if (action == PickControl.ACTION_CAMERA) {
152+
if (adapter.isAppend) {
153+
val allOf: MutableList<String> = ArrayList(adapter.selectCount() + 1)
154+
allOf.addAll(adapter.selectPaths())
155+
allOf.addAll(uris.map(Uri::toString))
156+
adapter.update(allOf, limit, index)
157+
} else {
158+
adapter.update(uris.map(Uri::toString), limit, index)
159+
}
143160
} else {
144-
adapter.update(list.map(Uri::toString), limit, index)
161+
if (adapter.isAppend) {
162+
val remotes: List<String> =
163+
selects.filter { null == PickUtils.path2Uri(it) }
164+
val allOf: MutableList<String> = ArrayList(limit)
165+
allOf.addAll(remotes)
166+
allOf.addAll(uris.map(Uri::toString))
167+
adapter.update(allOf, limit, index)
168+
} else {
169+
adapter.update(uris.map(Uri::toString), limit, index)
170+
}
145171
}
146172
}
147173
}
148174
PickControl.obtain(clean = true).action(action)
149-
.selects(selects)
150-
.limit(limit)
151-
.crop(crop)
152-
.callback(block)
153-
.done(activity)
175+
.selects(selects)
176+
.limit(limit)
177+
.crop(crop)
178+
.callback(block)
179+
.done(activity)
154180
}
155181

156182
//指定参数
157183
class Special(
158-
var activity: Activity,
159-
var limit: Int = 1,
160-
var column: Int = 4,
161-
var fixed: MutableList<PhotoItem>? = null,
162-
var crop: CropParams? = null
184+
var activity: Activity,
185+
var limit: Int = 1,
186+
var column: Int = 4,
187+
var fixed: MutableList<PhotoItem>? = null,
188+
var crop: CropParams? = null
163189
)
164190

165-
internal class GridSpacingItemDecoration(private val spanCount: Int, private val spacing: Int) : ItemDecoration() {
191+
internal class GridSpacingItemDecoration(private val spanCount: Int, private val spacing: Int) :
192+
ItemDecoration() {
166193

167194
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) {
168195
val position = parent.getChildAdapterPosition(view)

0 commit comments

Comments
 (0)