Index: chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java |
index 17112cd3850f503adf31350f8d41870c80ee1737..eb6c5ef8a688ac8a972d51393c9f880f13511c2d 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarControlContainer.java |
@@ -6,9 +6,11 @@ |
import android.content.Context; |
import android.graphics.Canvas; |
-import android.graphics.Color; |
import android.graphics.PorterDuff; |
import android.graphics.Rect; |
+import android.graphics.drawable.Drawable; |
+import android.graphics.drawable.LayerDrawable; |
+import android.graphics.drawable.ScaleDrawable; |
import android.util.AttributeSet; |
import android.view.MotionEvent; |
import android.view.View; |
@@ -17,9 +19,9 @@ |
import org.chromium.chrome.R; |
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler; |
import org.chromium.chrome.browser.contextualsearch.SwipeRecognizer; |
-import org.chromium.chrome.browser.widget.ClipDrawableProgressBar.InvalidationListener; |
import org.chromium.chrome.browser.widget.ControlContainer; |
-import org.chromium.chrome.browser.widget.ToolbarProgressBar; |
+import org.chromium.chrome.browser.widget.SmoothProgressBar; |
+import org.chromium.chrome.browser.widget.SmoothProgressBar.ProgressChangeListener; |
import org.chromium.chrome.browser.widget.ViewResourceFrameLayout; |
import org.chromium.ui.UiUtils; |
import org.chromium.ui.resources.dynamics.ViewResourceAdapter; |
@@ -77,7 +79,7 @@ |
// TODO(yusufo): Get rid of the calls below and avoid casting to the layout without making |
// the interface bigger. |
- ToolbarProgressBar progressView = ((ToolbarLayout) mToolbar).getProgressBar(); |
+ SmoothProgressBar progressView = ((ToolbarLayout) mToolbar).getProgressBar(); |
if (progressView != null) { |
mProgressResourceAdapter = new ProgressViewResourceAdapter(progressView); |
} |
@@ -134,54 +136,94 @@ |
} |
private static class ProgressViewResourceAdapter extends ViewResourceAdapter |
- implements InvalidationListener { |
- |
- private final ToolbarProgressBar mProgressView; |
- private final Rect mAlphaDrawRegion = new Rect(); |
- |
- ProgressViewResourceAdapter(ToolbarProgressBar progressView) { |
+ implements ProgressChangeListener { |
+ |
+ private final SmoothProgressBar mProgressView; |
+ private final Rect mPreviousDrawBounds = new Rect(); |
+ private int mProgressVisibility; |
+ private int mProgress; |
+ |
+ ProgressViewResourceAdapter(SmoothProgressBar progressView) { |
super(progressView); |
mProgressView = progressView; |
- progressView.setInvalidationListener(this); |
+ mProgressVisibility = mProgressView.getVisibility(); |
+ progressView.addProgressChangeListener(this); |
+ } |
+ |
+ @Override |
+ public void onProgressChanged(int progress) { |
+ if (mProgressVisibility != View.VISIBLE) return; |
+ if (progress < mProgress) { |
+ mPreviousDrawBounds.setEmpty(); |
+ } |
+ mProgress = progress; |
+ invalidate(null); |
+ } |
+ |
+ @Override |
+ public void onProgressVisibilityChanged(int visibility) { |
+ if (mProgressVisibility == visibility) return; |
+ |
+ if (visibility == View.VISIBLE || mProgressVisibility == View.VISIBLE) { |
+ invalidate(null); |
+ mPreviousDrawBounds.setEmpty(); |
+ } |
+ mProgressVisibility = visibility; |
+ } |
+ |
+ @Override |
+ protected void onCaptureStart(Canvas canvas, Rect dirtyRect) { |
+ canvas.save(); |
+ canvas.clipRect( |
+ mPreviousDrawBounds.right, 0, |
+ mProgressView.getWidth(), mProgressView.getHeight()); |
+ canvas.drawColor(0, PorterDuff.Mode.CLEAR); |
+ canvas.restore(); |
+ |
+ super.onCaptureStart(canvas, dirtyRect); |
} |
@Override |
protected void capture(Canvas canvas) { |
- if (mProgressView.getVisibility() != View.VISIBLE) { |
+ if (mProgressVisibility != View.VISIBLE) { |
canvas.drawColor(0, PorterDuff.Mode.CLEAR); |
} else { |
- // If we're drawing alpha somewhere, we need to clear that part of the canvas to |
- // avoid undesired accumulation (getting darker). |
- canvas.save(); |
- mProgressView.getAlphaDrawRegion(mAlphaDrawRegion); |
- mAlphaDrawRegion.intersect(getDirtyRect()); |
- canvas.clipRect(mAlphaDrawRegion); |
- canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); |
- canvas.restore(); |
- |
super.capture(canvas); |
+ } |
+ } |
+ |
+ @Override |
+ protected void onCaptureEnd() { |
+ super.onCaptureEnd(); |
+ // If we are unable to get accurate draw bounds, then set the draw bounds to |
+ // ensure the entire view is cleared. |
+ mPreviousDrawBounds.setEmpty(); |
+ |
+ // The secondary drawable has an alpha component, so track the bounds of the |
+ // primary drawable. This will allow the subsequent draw call to clear the secondary |
+ // portion not overlapped by the primary to prevent the alpha components from |
+ // stacking and getting progressively darker. |
+ Drawable progressDrawable = mProgressView.getProgressDrawable(); |
+ if (progressDrawable instanceof LayerDrawable) { |
+ LayerDrawable progressLayerDrawable = (LayerDrawable) progressDrawable; |
+ for (int i = 0; i < progressLayerDrawable.getNumberOfLayers(); i++) { |
+ if (progressLayerDrawable.getId(i) != android.R.id.progress) continue; |
+ Drawable primaryProgressDrawable = progressLayerDrawable.getDrawable(i); |
+ if (!(primaryProgressDrawable instanceof ScaleDrawable)) continue; |
+ |
+ ((ScaleDrawable) primaryProgressDrawable).getDrawable().copyBounds( |
+ mPreviousDrawBounds); |
+ } |
} |
} |
@Override |
protected void computeContentPadding(Rect outContentPadding) { |
super.computeContentPadding(outContentPadding); |
- MarginLayoutParams layoutParams = (MarginLayoutParams) mProgressView.getLayoutParams(); |
+ MarginLayoutParams layoutParams = |
+ (MarginLayoutParams) mProgressView.getLayoutParams(); |
outContentPadding.offset(0, layoutParams.topMargin); |
- } |
- |
- @Override |
- public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, |
- int oldTop, int oldRight, int oldBottom) { |
- // Purposefully ignore as invalidation listener handles it. |
- } |
- |
- // InvalidationListener implementation. |
- |
- @Override |
- public void onInvalidation(Rect dirtyRect) { |
- invalidate(dirtyRect); |
} |
} |