1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.chromium.android_webview;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.view.View;
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.view.View.MeasureSpec;
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Helper methods used to manage the layout of the View that contains AwContents.
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class AwLayoutSizer {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // These are used to prevent a re-layout if the content size changes within a dimension that is
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // fixed by the view system.
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private boolean mWidthMeasurementIsFixed;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private boolean mHeightMeasurementIsFixed;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Size of the rendered content, as reported by native.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private int mContentHeightCss;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private int mContentWidthCss;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Page scale factor. This is set to zero initially so that we don't attempt to do a layout if
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // we get the content size change notification first and a page scale change second.
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private float mPageScaleFactor = 0.0f;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Whether to postpone layout requests.
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private boolean mFreezeLayoutRequests;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Did we try to request a layout since the last time mPostponeLayoutRequests was set to true.
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private boolean mFrozenLayoutRequestPending;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private double mDIPScale;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Was our height larger than the AT_MOST constraint the last time onMeasure was called?
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    private boolean mHeightMeasurementLimited;
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // If mHeightMeasurementLimited is true then this contains the height limit.
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    private int mHeightMeasurementLimit;
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Callback object for interacting with the View.
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private Delegate mDelegate;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * Delegate interface through which the AwLayoutSizer communicates with the view it's sizing.
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public interface Delegate {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        void requestLayout();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        void setMeasuredDimension(int measuredWidth, int measuredHeight);
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        boolean isLayoutParamsHeightWrapContent();
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        void setForceZeroLayoutHeight(boolean forceZeroHeight);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Default constructor. Note: both setDelegate and setDIPScale must be called before the class
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * is ready for use.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public AwLayoutSizer() {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void setDelegate(Delegate delegate) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mDelegate = delegate;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void setDIPScale(double dipScale) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mDIPScale = dipScale;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Postpone requesting layouts till unfreezeLayoutRequests is called.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void freezeLayoutRequests() {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mFreezeLayoutRequests = true;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mFrozenLayoutRequestPending = false;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Stop postponing layout requests and request layout if such a request would have been made
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * had the freezeLayoutRequests method not been called before.
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void unfreezeLayoutRequests() {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mFreezeLayoutRequests = false;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (mFrozenLayoutRequestPending) {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mFrozenLayoutRequestPending = false;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mDelegate.requestLayout();
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Update the contents size.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * This should be called whenever the content size changes (due to DOM manipulation or page
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * load, for example).
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * The width and height should be in CSS pixels.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void onContentSizeChanged(int widthCss, int heightCss) {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        doUpdate(widthCss, heightCss, mPageScaleFactor);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Update the contents page scale.
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * This should be called whenever the content page scale factor changes (due to pinch zoom, for
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * example).
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void onPageScaleChanged(float pageScaleFactor) {
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        doUpdate(mContentWidthCss, mContentHeightCss, pageScaleFactor);
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private void doUpdate(int widthCss, int heightCss, float pageScaleFactor) {
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // We want to request layout only if the size or scale change, however if any of the
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // measurements are 'fixed', then changing the underlying size won't have any effect, so we
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // ignore changes to dimensions that are 'fixed'.
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        final int heightPix = (int) (heightCss * mPageScaleFactor * mDIPScale);
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        boolean pageScaleChanged = mPageScaleFactor != pageScaleFactor;
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        boolean contentHeightChangeMeaningful = !mHeightMeasurementIsFixed &&
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            (!mHeightMeasurementLimited || heightPix < mHeightMeasurementLimit);
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        boolean pageScaleChangeMeaningful =
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            !mWidthMeasurementIsFixed || contentHeightChangeMeaningful;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        boolean layoutNeeded = (mContentWidthCss != widthCss && !mWidthMeasurementIsFixed) ||
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            (mContentHeightCss != heightCss && contentHeightChangeMeaningful) ||
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            (pageScaleChanged && pageScaleChangeMeaningful);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mContentWidthCss = widthCss;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mContentHeightCss = heightCss;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mPageScaleFactor = pageScaleFactor;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (layoutNeeded) {
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            if (mFreezeLayoutRequests) {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mFrozenLayoutRequestPending = true;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            } else {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mDelegate.requestLayout();
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Calculate the size of the view.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * This is designed to be used to implement the android.view.View#onMeasure() method.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int contentHeightPix = (int) (mContentHeightCss * mPageScaleFactor * mDIPScale);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int contentWidthPix = (int) (mContentWidthCss * mPageScaleFactor * mDIPScale);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        int measuredHeight = contentHeightPix;
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        int measuredWidth = contentWidthPix;
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Always use the given size unless unspecified. This matches WebViewClassic behavior.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mWidthMeasurementIsFixed = (widthMode != MeasureSpec.UNSPECIFIED);
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        mHeightMeasurementIsFixed = (heightMode == MeasureSpec.EXACTLY);
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        mHeightMeasurementLimited =
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            (heightMode == MeasureSpec.AT_MOST) && (contentHeightPix > heightSize);
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        mHeightMeasurementLimit = heightSize;
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        if (mHeightMeasurementIsFixed || mHeightMeasurementLimited) {
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            measuredHeight = heightSize;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        if (mWidthMeasurementIsFixed) {
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            measuredWidth = widthSize;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (measuredHeight < contentHeightPix) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            measuredHeight |= View.MEASURED_STATE_TOO_SMALL;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (measuredWidth < contentWidthPix) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            measuredWidth |= View.MEASURED_STATE_TOO_SMALL;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mDelegate.setMeasuredDimension(measuredWidth, measuredHeight);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /**
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * Notify the AwLayoutSizer that the size of the view has changed.
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * This should be called by the Android view system after onMeasure if the view's size has
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * changed.
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void onSizeChanged(int w, int h, int ow, int oh) {
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        updateLayoutSettings();
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /**
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * Notify the AwLayoutSizer that the layout pass requested via Delegate.requestLayout has
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * completed.
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * This should be called after onSizeChanged regardless of whether the size has changed or not.
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void onLayoutChange() {
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        updateLayoutSettings();
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // This needs to be called every time either the physical size of the view is changed or layout
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // params are updated.
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private void updateLayoutSettings() {
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        mDelegate.setForceZeroLayoutHeight(mDelegate.isLayoutParamsHeightWrapContent());
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
199