down with experiments

Bug: 8600277
Change-Id: I5b3aa7a897d3c2d780f07e1817e26128bf95a929
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index b2e5540..05f76ca 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -18,16 +18,12 @@
 package com.android.mail.ui;
 
 
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Loader;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.DataSetObserver;
-import android.graphics.Picture;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
@@ -39,8 +35,6 @@
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
 import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
 import android.webkit.ConsoleMessage;
 import android.webkit.CookieManager;
 import android.webkit.CookieSyncManager;
@@ -66,7 +60,6 @@
 import com.android.mail.browse.MessageCursor;
 import com.android.mail.browse.MessageCursor.ConversationMessage;
 import com.android.mail.browse.MessageHeaderView;
-import com.android.mail.browse.MessageView;
 import com.android.mail.browse.ScrollIndicatorsView;
 import com.android.mail.browse.SuperCollapsedBlock;
 import com.android.mail.browse.WebViewContextMenu;
@@ -77,8 +70,6 @@
 import com.android.mail.providers.Message;
 import com.android.mail.providers.UIProvider;
 import com.android.mail.ui.ConversationViewState.ExpansionState;
-import com.android.mail.ui.UpOrBackController.UpOrBackHandler;
-import com.android.mail.utils.HardwareLayerEnabler;
 import com.android.mail.utils.LogTag;
 import com.android.mail.utils.LogUtils;
 import com.android.mail.utils.Utils;
@@ -97,7 +88,7 @@
  */
 public final class ConversationViewFragment extends AbstractConversationViewFragment implements
         SuperCollapsedBlock.OnClickListener,
-        OnLayoutChangeListener, UpOrBackHandler {
+        OnLayoutChangeListener {
 
     private static final String LOG_TAG = LogTag.getLogTag();
     public static final String LAYOUT_TAG = "ConvLayout";
@@ -128,8 +119,6 @@
      */
     private final int LOAD_WAIT_UNTIL_VISIBLE = 2;
 
-    private final float WHOOSH_SCALE_MINIMUM = 0.1f;
-
     private ConversationContainer mConversationContainer;
 
     private ConversationWebView mWebView;
@@ -138,18 +127,6 @@
 
     private View mNewMessageBar;
 
-    private View mMessageGroup;
-    private View mMessageInnerGroup;
-    private MessageView mMessageView;
-    private MessageHeaderView mWhooshHeader;
-    private Runnable mOnMessageLoadComplete;
-    private boolean mMessageViewIsLoading;
-    private float mMessageScrollXFraction;
-    private float mMessageScrollYFraction;
-    private boolean mIgnoreOnScaleCalls = false;
-    private long mMessageViewLoadStartMs;
-    private final MessageJsBridge mMessageJsBridge = new MessageJsBridge();
-
     private HtmlConversationTemplates mTemplates;
 
     private final MailJsBridge mJsBridge = new MailJsBridge();
@@ -294,11 +271,6 @@
         final MessageHeaderView snapHeader = mConversationContainer.getSnapHeader();
         initHeaderView(snapHeader, dateBuilder);
 
-        mWhooshHeader = (MessageHeaderView) mMessageGroup.findViewById(R.id.whoosh_header);
-        initHeaderView(mWhooshHeader, dateBuilder);
-        mWhooshHeader.setSnappy(true);
-        mWhooshHeader.setExpandable(false);
-
         mMaxAutoLoadMessages = getResources().getInteger(R.integer.max_auto_load_messages);
 
         mSideMarginPx = getResources().getDimensionPixelOffset(
@@ -418,45 +390,6 @@
         textZoom = (int) (textZoom * fontScale);
         settings.setTextZoom(textZoom);
 
-        mMessageGroup = rootView.findViewById(R.id.message_group);
-        mMessageInnerGroup = mMessageGroup.findViewById(R.id.message_inner_group);
-        mMessageView = (MessageView) mMessageGroup.findViewById(R.id.message_view);
-        mMessageGroup.findViewById(R.id.message_view_close).setOnClickListener(
-                new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                dismissWhooshMode();
-            }
-        });
-        mMessageView.setWebChromeClient(wcc);
-        mMessageView.setContentSizeChangeListener(new ContentSizeChangeListener() {
-            @Override
-            public void onHeightChange(final int h) {
-                if (h == 0 || !mMessageViewIsLoading) {
-                    return;
-                }
-                mMessageViewIsLoading = false;
-                getHandler().post(new FragmentRunnable("MessageView.onHeightChange") {
-                    @Override
-                    public void go() {
-                        LogUtils.i(LOG_TAG, "message view content height=%d initialScrollX/Y=%s/%s",
-                                h, mMessageScrollXFraction, mMessageScrollYFraction);
-
-                        // restore scroll position within the message in conversation view
-                        final int hSlack = mMessageView.computeHorizontalScrollRange()
-                                - mMessageView.computeHorizontalScrollExtent();
-                        final int vSlack = mMessageView.computeVerticalScrollRange()
-                                - mMessageView.computeVerticalScrollExtent();
-                        final int x = Math.round(hSlack * mMessageScrollXFraction);
-                        final int y = Math.round(vSlack * mMessageScrollYFraction);
-                        mMessageView.scrollTo(x, y);
-                    }
-                });
-            }
-        });
-        mMessageView.getSettings().setJavaScriptEnabled(true);
-        mMessageView.addJavascriptInterface(mMessageJsBridge, "mail");
-
         mViewsCreated = true;
         mWebViewLoadedData = false;
 
@@ -464,40 +397,6 @@
     }
 
     @Override
-    public void onStart() {
-        super.onStart();
-
-        final ControllableActivity activity = (ControllableActivity) getActivity();
-        if (activity != null) {
-            activity.getUpOrBackController().addUpOrBackHandler(this);
-        }
-    }
-
-    @Override
-    public boolean onBackPressed() {
-        if (mMessageGroup.getVisibility() == View.VISIBLE) {
-            dismissWhooshMode();
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onUpPressed() {
-        return false;
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-
-        final ControllableActivity activity = (ControllableActivity) getActivity();
-        if (activity != null) {
-            activity.getUpOrBackController().removeUpOrBackHandler(this);
-        }
-    }
-
-    @Override
     public void onDestroyView() {
         super.onDestroyView();
         mConversationContainer.setOverlayAdapter(null);
@@ -789,11 +688,13 @@
 
         mWebView.getSettings().setBlockNetworkImage(!allowNetworkImages);
 
+        final boolean applyTransforms = true;
+
         final MailPrefs prefs = MailPrefs.get(getContext());
         // If the conversation has specified a base uri, use it here, otherwise use mBaseUri
         return mTemplates.endConversation(mBaseUri, mConversation.getBaseUri(mBaseUri), 320,
                 mWebView.getViewportWidth(), enableContentReadySignal, isOverviewMode(mAccount),
-                prefs.shouldMungeTables(), prefs.shouldMungeImages());
+                applyTransforms, applyTransforms);
     }
 
     private void renderSuperCollapsedBlock(int start, int end) {
@@ -1054,32 +955,14 @@
 
         final OnScaleGestureListener listener;
 
-        if (MailPrefs.get(getContext()).isWhooshZoomEnabled()) {
-            listener = new WhooshScaleInterceptor();
-        } else {
-            settings.setSupportZoom(overviewMode);
-            settings.setBuiltInZoomControls(overviewMode);
-            if (overviewMode) {
-                settings.setDisplayZoomControls(false);
-            }
-            listener = ENABLE_CSS_ZOOM && !overviewMode ? new CssScaleInterceptor() : null;
+        settings.setSupportZoom(overviewMode);
+        settings.setBuiltInZoomControls(overviewMode);
+        if (overviewMode) {
+            settings.setDisplayZoomControls(false);
         }
-        mWebView.setOnScaleGestureListener(listener);
-    }
+        listener = ENABLE_CSS_ZOOM && !overviewMode ? new CssScaleInterceptor() : null;
 
-    private void dismissWhooshMode() {
-        mMessageGroup.animate().alpha(0f).scaleX(0.8f).scaleY(0.8f).setDuration(200)
-            .setListener(new HardwareLayerEnabler(mMessageGroup) {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    super.onAnimationEnd(animation);
-                    mMessageGroup.setVisibility(View.GONE);
-                    mMessageView.clearView();
-                    mMessageGroup.setAlpha(1f);
-                    mMessageGroup.setScaleX(1f);
-                    mMessageGroup.setScaleY(1f);
-                }
-            });
+        mWebView.setOnScaleGestureListener(listener);
     }
 
     private class ConversationWebViewClient extends AbstractConversationWebViewClient {
@@ -1241,46 +1124,6 @@
         }
     }
 
-    /**
-     * This is a minimal version of {@link MailJsBridge}, above, that enables the single-message
-     * WebView to use the same JavaScript code.
-     *
-     * NOTE: all public methods must be listed in the proguard flags so that they can be accessed
-     * via reflection and not stripped.
-     *
-     */
-    private class MessageJsBridge {
-        @SuppressWarnings("unused")
-        @JavascriptInterface
-        public void onContentReady() {
-            getHandler().post(new FragmentRunnable("onMessageContentReady") {
-                @Override
-                public void go() {
-                    if (mMessageViewLoadStartMs != 0) {
-                        LogUtils.i(LOG_TAG, "IN MESSAGEVIEW.onContentReady, f=%s vis=%s t=%sms",
-                                ConversationViewFragment.this,
-                                isUserVisible(),
-                                (SystemClock.uptimeMillis() - mMessageViewLoadStartMs));
-                    }
-                    // TODO: remove me if PictureListener works well enough on ICS
-                }
-            });
-        }
-
-        @SuppressWarnings("unused")
-        @JavascriptInterface
-        public float getScrollYPercent() {
-            return 0f;
-        }
-
-        @SuppressWarnings("unused")
-        @JavascriptInterface
-        public void onWebContentGeometryChange(final String[] overlayTopStrs,
-                final String[] overlayBottomStrs) {
-            // no-op
-        }
-    }
-
     private class NewMessagesInfo {
         int count;
         int countFromSelf;
@@ -1576,206 +1419,4 @@
 
     }
 
-    private class WhooshScaleInterceptor implements OnScaleGestureListener {
-        @Override
-        public boolean onScale(ScaleGestureDetector detector) {
-            final float scale = detector.getScaleFactor();
-            if (mIgnoreOnScaleCalls || Math.abs(scale - 1.0f) < WHOOSH_SCALE_MINIMUM) {
-                return false;
-            }
-
-            loadSingleMessageView(scale > 1, (int) detector.getFocusX(),
-                    (int) detector.getFocusY());
-
-            // Ignore subsequent onScale() calls
-            mIgnoreOnScaleCalls = true;
-            return false;
-        }
-
-        @Override
-        public boolean onScaleBegin(ScaleGestureDetector detector) {
-            return true;
-        }
-
-        @Override
-        public void onScaleEnd(ScaleGestureDetector detector) {
-            mIgnoreOnScaleCalls = false;
-        }
-
-        private void loadSingleMessageView(boolean isZoomingIn, int focusX, int focusY) {
-            // TODO: make isWide determination per-message
-            final boolean isWide = mWebView.computeHorizontalScrollRange() >
-                    mWebView.computeHorizontalScrollExtent();
-
-            // if the conversation already fits-width, disable zooming out
-            // anymore since entire page
-            // already fits on screen.
-            if (!isWide && !isZoomingIn) {
-                return;
-            }
-            if (isOverviewMode(mAccount)) {
-                if (!isZoomingIn) {
-                    return;
-                }
-            }
-
-            // find the message under focusX/focusY
-            final int y = focusY + mWebView.getScrollY();
-
-            // assuming positioning has happened by now...
-            int msgBottom = mWebView.computeVerticalScrollRange();
-            MessageHeaderItem msgItem = null;
-
-            for (int i = 0, len = mAdapter.getCount(); i < len; i++) {
-                final ConversationOverlayItem item = mAdapter.getItem(i);
-
-                if (y < item.getTop()) {
-                    // focus must have been on the last-seen item.
-                    msgBottom = item.getTop();
-                    break;
-                }
-
-                if (item instanceof MessageHeaderItem && item.canBecomeSnapHeader()) {
-                    msgItem = (MessageHeaderItem) item;
-                }
-            }
-
-            if (msgItem == null) {
-                LogUtils.w(LOG_TAG, "ignoring scaleBegin on y=%d, no matching message.", y);
-                return;
-            }
-
-            // save off scroll position to be restored later in onHeightChange()
-            // TODO: need to take into account focus position, too
-            if (mWebView.getScrollX() > 0) {
-                mMessageScrollXFraction = (float) mWebView.computeHorizontalScrollOffset()
-                        / (mWebView.computeHorizontalScrollRange() -
-                        mWebView.computeHorizontalScrollExtent());
-            } else {
-                mMessageScrollXFraction = 0f;
-            }
-
-            final int msgBodyTop = msgItem.getTop() + msgItem.getHeight();
-            if (msgBodyTop < mWebView.getScrollY()) {
-                mMessageScrollYFraction = ((float) mWebView.getScrollY() - msgBodyTop) /
-                        (msgBottom - msgBodyTop - mWebView.computeVerticalScrollExtent());
-            } else {
-                mMessageScrollYFraction = 0f;
-            }
-
-            final boolean safeForImages = msgItem.getMessage().alwaysShowImages
-                    || msgItem.getShowImages();
-
-            // render the single message HTML
-            mTemplates.startConversation(mWebView.screenPxToWebPx(mSideMarginPx), 0);
-            mTemplates.appendMessageHtml(msgItem.getMessage(), true /* expanded */,
-                    safeForImages, 0, 0);
-            final String html = mTemplates.endConversation(mBaseUri,
-                    mConversation.getBaseUri(mBaseUri), 0, 0, false, false, false, false);
-
-            mMessageView.loadDataWithBaseURL(mBaseUri, html, "text/html", "utf-8", null);
-            mMessageViewLoadStartMs = SystemClock.uptimeMillis();
-            mMessageView.setInitialScale(isZoomingIn ? 200 : 1);
-
-            mMessageViewIsLoading = true;
-
-            mMessageGroup.setVisibility(View.VISIBLE);
-            mMessageGroup.setBackgroundColor(0);
-
-            final float scaleOut;
-            if (isZoomingIn) {
-                scaleOut = 1.15f;
-            } else {
-                scaleOut = 0.85f;
-            }
-
-            final int offsetBy = Math.max(0, msgItem.getTop() - mWebView.getScrollY());
-
-            final Interpolator curve = new DecelerateInterpolator(2.5f);
-
-            mWebView.setPivotX(focusX);
-            mWebView.setPivotY(focusY);
-            mWebView.animate().scaleX(scaleOut).scaleY(scaleOut).alpha(0.3f)
-                    .translationY(-offsetBy * 1.2f)
-                    .setDuration(300).setInterpolator(curve)
-                    .setListener(new HardwareLayerEnabler(mWebView));
-
-            msgItem.bindView(mWhooshHeader, false /* measureOnly */);
-            mWhooshHeader.setTranslationY(offsetBy);
-
-            mWhooshHeader.animate().translationY(0).setDuration(300).setInterpolator(curve);
-
-            // immediately hide the message's header view, if present
-            final View zoomingHeader = mConversationContainer.getViewForItem(msgItem);
-
-            final List<View> otherOverlays = mConversationContainer.getOverlayViews();
-            if (zoomingHeader != null) {
-                otherOverlays.remove(zoomingHeader);
-                zoomingHeader.setVisibility(View.INVISIBLE);
-            }
-            for (View v : otherOverlays) {
-                v.animate().alpha(0f).setDuration(150).setInterpolator(curve)
-                        .setListener(new HardwareLayerEnabler(v));
-            }
-
-            // WebView seems to have some optimizations to not draw or load if completely
-            // transparent. Start with some non-zero opacity.
-            mMessageInnerGroup.setAlpha(0.01f);
-
-            final AnimatorListener fadeIn = new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    mMessageInnerGroup.setLayerType(View.LAYER_TYPE_NONE, null);
-                    if (zoomingHeader != null) {
-                        zoomingHeader.setVisibility(View.VISIBLE);
-                    }
-                    mWebView.animate().cancel();
-                    mWebView.setTranslationY(0);
-                    mWebView.setAlpha(1f);
-                    mWebView.setScaleX(1f);
-                    mWebView.setScaleY(1f);
-                    mMessageGroup.setBackgroundColor(0xffffffff);
-                    for (View v : otherOverlays) {
-                        v.animate().cancel();
-                        v.setAlpha(1f);
-                    }
-                }
-            };
-            mOnMessageLoadComplete = new FragmentRunnable("onMessageLoadComplete") {
-                @Override
-                public void go() {
-                    mWhooshHeader.animate().cancel();
-                    mWhooshHeader.setTranslationY(0);
-                    mMessageInnerGroup.setLayerType(View.LAYER_TYPE_HARDWARE, null);
-                    mMessageInnerGroup.setAlpha(0.3f);
-                    mMessageInnerGroup.animate().alpha(1f).setInterpolator(curve)
-                            .setDuration(150).setListener(fadeIn);
-                }
-            };
-
-            setupPictureListener();
-        }
-
-        @SuppressWarnings("deprecation")
-        private void setupPictureListener() {
-            mMessageView.setPictureListener(new WebView.PictureListener() {
-                @Override
-                public void onNewPicture(WebView view, Picture picture) {
-                    LogUtils.w(LOG_TAG, "MessageView.onNewPicture, t=%s",
-                            SystemClock.uptimeMillis() - mMessageViewLoadStartMs);
-                    mMessageView.setPictureListener(null);
-
-                    if (mOnMessageLoadComplete != null) {
-                        mOnMessageLoadComplete.run();
-                    }
-                }
-            });
-        }
-
-    }
-
 }