-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added a contentLoadingSmoothProgressBar
- Loading branch information
1 parent
e784e6e
commit e6ce517
Showing
3 changed files
with
116 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
110 changes: 110 additions & 0 deletions
110
...rc/main/java/fr/castorflex/android/smoothprogressbar/ContentLoadingSmoothProgressBar.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
package fr.castorflex.android.smoothprogressbar; | ||
|
||
import android.content.Context; | ||
import android.util.AttributeSet; | ||
import android.view.View; | ||
|
||
/** | ||
* This is a copy of the ContentLoadingProgressBar from the support library, but extends | ||
* SmoothProgressBar. | ||
*/ | ||
public class ContentLoadingSmoothProgressBar extends SmoothProgressBar { | ||
|
||
private static final int MIN_SHOW_TIME = 500; // ms | ||
private static final int MIN_DELAY = 500; // ms | ||
|
||
private long mStartTime = -1; | ||
|
||
private boolean mPostedHide = false; | ||
|
||
private boolean mPostedShow = false; | ||
|
||
private boolean mDismissed = false; | ||
|
||
private final Runnable mDelayedHide = new Runnable() { | ||
|
||
@Override | ||
public void run() { | ||
mPostedHide = false; | ||
mStartTime = -1; | ||
setVisibility(View.GONE); | ||
} | ||
}; | ||
|
||
private final Runnable mDelayedShow = new Runnable() { | ||
|
||
@Override | ||
public void run() { | ||
mPostedShow = false; | ||
if (!mDismissed) { | ||
mStartTime = System.currentTimeMillis(); | ||
setVisibility(View.VISIBLE); | ||
} | ||
} | ||
}; | ||
|
||
public ContentLoadingSmoothProgressBar(Context context) { | ||
this(context, null); | ||
} | ||
|
||
public ContentLoadingSmoothProgressBar(Context context, AttributeSet attrs) { | ||
super(context, attrs, 0); | ||
} | ||
|
||
@Override | ||
public void onAttachedToWindow() { | ||
super.onAttachedToWindow(); | ||
removeCallbacks(); | ||
} | ||
|
||
@Override | ||
public void onDetachedFromWindow() { | ||
super.onDetachedFromWindow(); | ||
removeCallbacks(); | ||
} | ||
|
||
private void removeCallbacks() { | ||
removeCallbacks(mDelayedHide); | ||
removeCallbacks(mDelayedShow); | ||
} | ||
|
||
/** | ||
* Hide the progress view if it is visible. The progress view will not be | ||
* hidden until it has been shown for at least a minimum show time. If the | ||
* progress view was not yet visible, cancels showing the progress view. | ||
*/ | ||
public void hide() { | ||
mDismissed = true; | ||
removeCallbacks(mDelayedShow); | ||
long diff = System.currentTimeMillis() - mStartTime; | ||
if (diff >= MIN_SHOW_TIME || mStartTime == -1) { | ||
// The progress spinner has been shown long enough | ||
// OR was not shown yet. If it wasn't shown yet, | ||
// it will just never be shown. | ||
setVisibility(View.GONE); | ||
} else { | ||
// The progress spinner is shown, but not long enough, | ||
// so put a delayed message in to hide it when its been | ||
// shown long enough. | ||
if (!mPostedHide) { | ||
postDelayed(mDelayedHide, MIN_SHOW_TIME - diff); | ||
mPostedHide = true; | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* Show the progress view after waiting for a minimum delay. If | ||
* during that time, hide() is called, the view is never made visible. | ||
*/ | ||
public void show() { | ||
// Reset the start time. | ||
mStartTime = -1; | ||
mDismissed = false; | ||
removeCallbacks(mDelayedHide); | ||
if (!mPostedShow) { | ||
postDelayed(mDelayedShow, MIN_DELAY); | ||
mPostedShow = true; | ||
} | ||
} | ||
} |