Index: chrome/android/java/src/org/chromium/chrome/browser/widget/LoadingView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/LoadingView.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/LoadingView.java |
index 17a339123feba1e5ae2204844a22a9d6c4ce0fab..2da140e6d0e0447a94a4a2901dfba9b43ea493b9 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/LoadingView.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/LoadingView.java |
@@ -26,12 +26,20 @@ public class LoadingView extends ProgressBar { |
private final Runnable mDelayedShow = new Runnable() { |
@Override |
public void run() { |
+ if (!mShouldShow) return; |
mStartTime = SystemClock.elapsedRealtime(); |
setVisibility(View.VISIBLE); |
setAlpha(1.0f); |
} |
}; |
+ /** |
+ * Tracks whether the View should be displayed when {@link #mDelayedShow} is run. Android |
+ * doesn't always cancel a Runnable when requested, meaning that the View could be hidden before |
+ * it even has a chance to be shown. |
+ */ |
+ private boolean mShouldShow; |
+ |
// Material loading design spec requires us to show progress spinner at least 500ms, so we need |
// this delayed runnable to implement that. |
private final Runnable mDelayedHide = new Runnable() { |
@@ -67,6 +75,7 @@ public class LoadingView extends ProgressBar { |
public void showLoadingUI() { |
removeCallbacks(mDelayedShow); |
removeCallbacks(mDelayedHide); |
+ mShouldShow = true; |
setVisibility(GONE); |
postDelayed(mDelayedShow, LOADING_ANIMATION_DELAY_MS); |
@@ -79,6 +88,7 @@ public class LoadingView extends ProgressBar { |
public void hideLoadingUI() { |
removeCallbacks(mDelayedShow); |
removeCallbacks(mDelayedHide); |
+ mShouldShow = false; |
if (getVisibility() == VISIBLE) { |
postDelayed(mDelayedHide, Math.max(0, |