1c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huangpackage com.android.mail.browse; 2c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 3c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huangimport android.content.Context; 4c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huangimport android.util.AttributeSet; 5c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huangimport android.webkit.WebView; 6c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 7c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huangpublic class MailWebView extends WebView { 8c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 9c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang // NARROW_COLUMNS reflow can trigger the document to change size, so notify interested parties. 10c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang // This is also a good trigger to know when to alter scroll position. 11c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public interface ContentSizeChangeListener { 12c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang void onHeightChange(int h); 13c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 14c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 15c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang private int mCachedContentHeight; 16c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 17c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang private ContentSizeChangeListener mSizeChangeListener; 18c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 19c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public MailWebView(Context c) { 20c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang this(c, null); 21c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 22c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 23c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public MailWebView(Context c, AttributeSet attrs) { 24c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang super(c, attrs); 25c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 26c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 27c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 28c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public int computeVerticalScrollRange() { 29c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return super.computeVerticalScrollRange(); 30c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 31c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 32c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 33c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public int computeVerticalScrollOffset() { 34c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return super.computeVerticalScrollOffset(); 35c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 36c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 37c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 38c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public int computeVerticalScrollExtent() { 39c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return super.computeVerticalScrollExtent(); 40c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 41c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 42c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 43c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public int computeHorizontalScrollRange() { 44c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return super.computeHorizontalScrollRange(); 45c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 46c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 47c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 48c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public int computeHorizontalScrollOffset() { 49c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return super.computeHorizontalScrollOffset(); 50c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 51c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 52c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 53c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public int computeHorizontalScrollExtent() { 54c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang return super.computeHorizontalScrollExtent(); 55c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 56c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 57c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public void setContentSizeChangeListener(ContentSizeChangeListener l) { 58c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang mSizeChangeListener = l; 59c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 60c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 61c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang @Override 62c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public void invalidate() { 63c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang super.invalidate(); 64c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 65c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang if (mSizeChangeListener != null) { 66c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang final int contentHeight = getContentHeight(); 67c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang if (contentHeight != mCachedContentHeight) { 68c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang mCachedContentHeight = contentHeight; 69c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang mSizeChangeListener.onHeightChange(contentHeight); 70c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 71c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 72c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang } 73c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang 74c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang} 75