Index: chrome/android/java/src/org/chromium/chrome/browser/widget/SmoothProgressBar.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/SmoothProgressBar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/SmoothProgressBar.java |
index 1e7542724d2ed29accab5b5116be88da52908547..c084b619f7f28570e4a5321ba2185211fa5ab3a7 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/SmoothProgressBar.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/SmoothProgressBar.java |
@@ -9,6 +9,8 @@ import android.util.AttributeSet; |
import android.widget.ProgressBar; |
import org.chromium.base.ApiCompatibilityUtils; |
+import org.chromium.base.ObserverList; |
+import org.chromium.base.ObserverList.RewindableIterator; |
/** |
* A progress bar that smoothly animates incremental updates. |
@@ -18,11 +20,32 @@ import org.chromium.base.ApiCompatibilityUtils; |
* {@link #setProgress(int)}. |
*/ |
public class SmoothProgressBar extends ProgressBar { |
+ |
+ /** |
+ * Allows observation of visual changes to the progress bar. |
+ */ |
+ public interface ProgressChangeListener { |
+ /** |
+ * Triggered when the visible progress has changed. |
+ * @param progress The current progress value. |
+ */ |
+ void onProgressChanged(int progress); |
+ |
+ /** |
+ * Triggered when the visibility of the progress bar has changed. |
+ * @param visibility The visibility of the progress bar. |
+ */ |
+ void onProgressVisibilityChanged(int visibility); |
+ } |
+ |
private static final int MAX = 100; |
// The amount of time between subsequent progress updates. 16ms is chosen to make 60fps. |
private static final long PROGRESS_UPDATE_DELAY_MS = 16; |
+ private final ObserverList<ProgressChangeListener> mObservers; |
+ private final RewindableIterator<ProgressChangeListener> mObserversIterator; |
+ |
private boolean mIsAnimated = false; |
private int mTargetProgress; |
@@ -55,6 +78,26 @@ public class SmoothProgressBar extends ProgressBar { |
public SmoothProgressBar(Context context, AttributeSet attrs) { |
super(context, attrs); |
setMax(MAX * mResolutionMutiplier); |
+ |
+ mObservers = new ObserverList<ProgressChangeListener>(); |
+ mObserversIterator = mObservers.rewindableIterator(); |
+ |
+ } |
+ |
+ /** |
+ * Adds an observer to be notified of progress changes. |
+ * @param observer The observer to be added. |
+ */ |
+ public void addProgressChangeListener(ProgressChangeListener observer) { |
+ mObservers.addObserver(observer); |
+ } |
+ |
+ /** |
+ * Removes an observer to be notified of progress changes. |
+ * @param observer The observer to be removed. |
+ */ |
+ public void removeProgressChangeListener(ProgressChangeListener observer) { |
+ mObservers.removeObserver(observer); |
} |
@Override |
@@ -92,5 +135,22 @@ public class SmoothProgressBar extends ProgressBar { |
*/ |
protected void setProgressInternal(int progress) { |
super.setProgress(progress); |
+ |
+ if (mObserversIterator != null) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().onProgressChanged(progress); |
+ } |
+ } |
+ } |
+ |
+ @Override |
+ public void setVisibility(int visibility) { |
+ super.setVisibility(visibility); |
+ |
+ if (mObserversIterator != null) { |
+ for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
+ mObserversIterator.next().onProgressVisibilityChanged(visibility); |
+ } |
+ } |
} |
} |