Chromium Code Reviews| Index: ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java |
| diff --git a/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java b/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java |
| index 38888dd17f86d6ad7edfffb3ef59670a0daf5bfa..c0414d3d2b737ba50fea0ebabdfb97dc36062d19 100644 |
| --- a/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java |
| +++ b/ui/android/java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java |
| @@ -120,38 +120,20 @@ public class ViewResourceInflater { |
| // Allow subclasses to access/modify the View before it's attached |
| // to the hierarchy (if allowed) or snapshots are captured. |
| onFinishInflate(); |
| - |
| - registerResource(); |
| } |
| /** |
| * Invalidate the inflated View, causing a snapshot of the View to be captured. |
| */ |
| public void invalidate() { |
| - // View must be inflated at this point. If it's not, do it now. |
| - if (mView == null) { |
| - inflate(); |
| - } |
| - |
| - mIsInvalidated = true; |
| + invalidate(false); |
| + } |
| - // If the View is already attached, we don't need to do anything because the |
| - // snapshot will be captured automatically when the View is drawn. |
| - if (!mIsAttached) { |
| - if (shouldAttachView()) { |
| - // TODO(pedrosimonetti): investigate if complex views can be rendered offline. |
| - // NOTE(pedrosimonetti): it seems that complex views don't get rendered |
| - // properly if not attached to the hierarchy. The problem seem to be related |
| - // to the use of the property "layout_gravity: end", possibly in combination |
| - // of other things like elastic views (layout_weight: 1) and/or fading edges. |
| - attachView(); |
| - } else { |
| - // When the View is not attached, we need to manually layout the View |
| - // and invalidate the resource in order to capture a new snapshot. |
| - layout(); |
| - invalidateResource(); |
| - } |
| - } |
| + /** |
| + * Request a layout update, causing the {@link ViewResourceInflater} to be invalidated. |
| + */ |
| + public void requestLayout() { |
| + invalidate(true); |
| } |
| /** |
| @@ -282,13 +264,68 @@ public class ViewResourceInflater { |
| } |
| } |
| + private void invalidate(boolean requestLayout) { |
| + // View must be inflated at this point. If it's not, do it now. |
| + if (mView == null) { |
| + inflate(); |
| + } |
| + |
| + // Layout the View if necessary, updating its size. |
| + if (requestLayout) { |
| + layout(true); |
| + } |
| + |
| + // Register the resource, if not registered yet. |
| + if (mResourceAdapter == null) { |
| + registerResource(); |
| + } |
| + |
| + mIsInvalidated = true; |
| + |
| + if (!mIsAttached && shouldAttachView()) { |
| + // TODO(pedrosimonetti): investigate if complex views can be rendered offline. |
| + // NOTE(pedrosimonetti): it seems that complex views don't get rendered |
| + // properly if not attached to the hierarchy. The problem seem to be related |
| + // to the use of the property "layout_gravity: end", possibly in combination |
| + // of other things like elastic views (layout_weight: 1) and/or fading edges. |
| + attachView(); |
| + } |
| + |
| + if (!mIsAttached) { |
| + // When the View is not attached, we need to manually layout the View and |
| + // invalidate the resource in order to capture a new snapshot. |
| + layout(false); |
| + invalidateResource(); |
| + } |
| + } |
| + |
| /** |
| - * Layout the View. This is to be used when the View is not attached to the hierarchy. |
| + * Lays out the view according to the current width and height measure specs. |
| */ |
| - private void layout() { |
| + private void layout(boolean updateLayoutParams) { |
| // View must be inflated at this point. |
| assert mView != null; |
| + // Update LayoutParams according to the current measure spec. |
| + if (updateLayoutParams) { |
| + final int widthMeasureSpec = getWidthMeasureSpec(); |
| + int width = ViewGroup.LayoutParams.WRAP_CONTENT; |
| + if (View.MeasureSpec.getMode(widthMeasureSpec) == View.MeasureSpec.EXACTLY) { |
| + width = View.MeasureSpec.getSize(widthMeasureSpec); |
| + } |
| + |
| + final int heightMeasureSpec = getHeightMeasureSpec(); |
| + int height = ViewGroup.LayoutParams.WRAP_CONTENT; |
| + if (View.MeasureSpec.getMode(heightMeasureSpec) == View.MeasureSpec.EXACTLY) { |
| + height = View.MeasureSpec.getSize(heightMeasureSpec); |
| + } |
| + |
| + ViewGroup.LayoutParams params = mView.getLayoutParams(); |
| + params.width = width; |
| + params.height = height; |
| + mView.setLayoutParams(params); |
| + } |
| + |
| mView.measure(getWidthMeasureSpec(), getHeightMeasureSpec()); |
|
newt (away)
2016/03/24 22:31:36
If you're going to attach this view to the view hi
pedro (no code reviews)
2016/03/25 00:37:47
Made changes based on our offline discussion.
|
| mView.layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); |
| } |