/
SketchImageView.kt
95 lines (82 loc) · 3.89 KB
/
SketchImageView.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
* Copyright (C) 2022 panpf <panpfpanpf@outlook.com>
*
* 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 com.github.panpf.sketch
import android.content.Context
import android.util.AttributeSet
import com.github.panpf.sketch.internal.parseImageXmlAttributes
import com.github.panpf.sketch.request.DisplayRequest
import com.github.panpf.sketch.request.DisplayRequestState
import com.github.panpf.sketch.request.DisplayResult.Error
import com.github.panpf.sketch.request.DisplayResult.Success
import com.github.panpf.sketch.request.ImageOptions
import com.github.panpf.sketch.request.ImageOptionsProvider
import com.github.panpf.sketch.request.Listener
import com.github.panpf.sketch.request.ProgressListener
import com.github.panpf.sketch.request.internal.Listeners
import com.github.panpf.sketch.request.internal.ProgressListeners
import com.github.panpf.sketch.viewability.AbsAbilityImageView
open class SketchImageView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyle: Int = 0
) : AbsAbilityImageView(context, attrs, defStyle), ImageOptionsProvider {
override var displayImageOptions: ImageOptions? = null
private var displayListenerList: MutableList<Listener<DisplayRequest, Success, Error>>? = null
private var displayProgressListenerList: MutableList<ProgressListener<DisplayRequest>>? = null
val requestState = DisplayRequestState()
init {
@Suppress("LeakingThis")
displayImageOptions = parseImageXmlAttributes(context, attrs)
registerDisplayListener(requestState)
}
override fun getDisplayListener(): Listener<DisplayRequest, Success, Error>? {
val myListeners = displayListenerList?.takeIf { it.isNotEmpty() }
val superListener = super.getDisplayListener()
if (myListeners == null && superListener == null) {
return null
}
val listenerList = (myListeners?.toMutableList() ?: mutableListOf()).apply {
if (superListener != null) add(superListener)
}.toList()
return Listeners(listenerList)
}
override fun getDisplayProgressListener(): ProgressListener<DisplayRequest>? {
val myProgressListeners = displayProgressListenerList?.takeIf { it.isNotEmpty() }
val superProgressListener = super.getDisplayProgressListener()
if (myProgressListeners == null && superProgressListener == null) {
return null
}
val progressListenerList = (myProgressListeners?.toMutableList() ?: mutableListOf()).apply {
if (superProgressListener != null) add(superProgressListener)
}.toList()
return ProgressListeners(progressListenerList)
}
fun registerDisplayListener(listener: Listener<DisplayRequest, Success, Error>) {
this.displayListenerList = (this.displayListenerList ?: mutableListOf()).apply {
add(listener)
}
}
fun unregisterDisplayListener(listener: Listener<DisplayRequest, Success, Error>) {
this.displayListenerList?.remove(listener)
}
fun registerDisplayProgressListener(listener: ProgressListener<DisplayRequest>) {
this.displayProgressListenerList =
(this.displayProgressListenerList ?: mutableListOf()).apply {
add(listener)
}
}
fun unregisterDisplayProgressListener(listener: ProgressListener<DisplayRequest>) {
this.displayProgressListenerList?.remove(listener)
}
}