10
10
import android .graphics .drawable .Drawable ;
11
11
import android .os .Build ;
12
12
import android .support .annotation .NonNull ;
13
+ import android .support .v4 .widget .ContentLoadingProgressBar ;
13
14
import android .text .TextUtils ;
14
15
import android .util .AttributeSet ;
15
16
import android .util .Log ;
@@ -19,6 +20,39 @@ public class AVLoadingIndicatorView extends View {
19
20
20
21
private static final String TAG ="AVLoadingIndicatorView" ;
21
22
23
+ private static final int MIN_SHOW_TIME = 500 ; // ms
24
+ private static final int MIN_DELAY = 500 ; // ms
25
+
26
+ private long mStartTime = -1 ;
27
+
28
+ private boolean mPostedHide = false ;
29
+
30
+ private boolean mPostedShow = false ;
31
+
32
+ private boolean mDismissed = false ;
33
+
34
+ private final Runnable mDelayedHide = new Runnable () {
35
+
36
+ @ Override
37
+ public void run () {
38
+ mPostedHide = false ;
39
+ mStartTime = -1 ;
40
+ setVisibility (View .GONE );
41
+ }
42
+ };
43
+
44
+ private final Runnable mDelayedShow = new Runnable () {
45
+
46
+ @ Override
47
+ public void run () {
48
+ mPostedShow = false ;
49
+ if (!mDismissed ) {
50
+ mStartTime = System .currentTimeMillis ();
51
+ setVisibility (View .VISIBLE );
52
+ }
53
+ }
54
+ };
55
+
22
56
int mMinWidth ;
23
57
int mMaxWidth ;
24
58
int mMinHeight ;
@@ -127,6 +161,37 @@ public void setIndicator(@NonNull String indicatorName){
127
161
}
128
162
}
129
163
164
+ public void hide () {
165
+ mDismissed = true ;
166
+ removeCallbacks (mDelayedShow );
167
+ long diff = System .currentTimeMillis () - mStartTime ;
168
+ if (diff >= MIN_SHOW_TIME || mStartTime == -1 ) {
169
+ // The progress spinner has been shown long enough
170
+ // OR was not shown yet. If it wasn't shown yet,
171
+ // it will just never be shown.
172
+ setVisibility (View .GONE );
173
+ } else {
174
+ // The progress spinner is shown, but not long enough,
175
+ // so put a delayed message in to hide it when its been
176
+ // shown long enough.
177
+ if (!mPostedHide ) {
178
+ postDelayed (mDelayedHide , MIN_SHOW_TIME - diff );
179
+ mPostedHide = true ;
180
+ }
181
+ }
182
+ }
183
+
184
+ public void show () {
185
+ // Reset the start time.
186
+ mStartTime = -1 ;
187
+ mDismissed = false ;
188
+ removeCallbacks (mDelayedHide );
189
+ if (!mPostedShow ) {
190
+ postDelayed (mDelayedShow , MIN_DELAY );
191
+ mPostedShow = true ;
192
+ }
193
+ }
194
+
130
195
@ Override
131
196
protected boolean verifyDrawable (Drawable who ) {
132
197
return who == mIndicator
@@ -301,6 +366,7 @@ public void drawableHotspotChanged(float x, float y) {
301
366
protected void onAttachedToWindow () {
302
367
super .onAttachedToWindow ();
303
368
startAnimation ();
369
+ removeCallbacks ();
304
370
}
305
371
306
372
@ Override
@@ -309,6 +375,13 @@ protected void onDetachedFromWindow() {
309
375
// This should come after stopAnimation(), otherwise an invalidate message remains in the
310
376
// queue, which can prevent the entire view hierarchy from being GC'ed during a rotation
311
377
super .onDetachedFromWindow ();
378
+ removeCallbacks ();
312
379
}
313
380
381
+ private void removeCallbacks () {
382
+ removeCallbacks (mDelayedHide );
383
+ removeCallbacks (mDelayedShow );
384
+ }
385
+
386
+
314
387
}
0 commit comments