Prevent tab switcher from showing obsolete thumbnails

The browser will capture the tab bitmap only after first
visual pixel has been drawn.

Change-Id: Ic9ae344c8ff5b39e5e2a76eaf08ba06bd825aef9
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index a1cb7b3..d606b79 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -23,10 +23,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Rect;
 import android.os.Message;
 import android.util.Log;
 import android.view.ActionMode;
@@ -37,12 +34,12 @@
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.DecelerateInterpolator;
-import android.webkit.ValueCallback;
-import org.codeaurora.swe.WebView;
 import android.widget.ImageView;
 
 import com.android.browser.UrlInputView.StateListener;
 
+import org.codeaurora.swe.WebView;
+
 /**
  * Ui for regular phone screen sizes
  */
@@ -250,44 +247,43 @@
     }
 
     void showNavScreen() {
-        WebView webView = getWebView();
-        if (webView != null) {
-            blockEvents();
-            mNavScreenRequested = true;
+        blockEvents();
+        mNavScreenRequested = true;
+        mTabControl.setOnThumbnailUpdatedListener(
+                new TabControl.OnThumbnailUpdatedListener() {
+                    @Override
+                    public void onThumbnailUpdated(Tab t) {
+                        mTabControl.setOnThumbnailUpdatedListener(null);
 
-            //To conserve memory, get a scaled down version of the screen and
-            //scale back up to full size
-            //0.25 uses 16 times less memory than the full size
-            final float downscaleRatio = 0.25f;
-            final float upscaleRatio = 1/downscaleRatio;
-            webView.getContentBitmapAsync(
-                    downscaleRatio,
-                    new Rect(),
-                    new ValueCallback<Bitmap>() {
-                        @Override
-                        public void onReceiveValue(Bitmap bm) {
-                            // Discard the callback if the req is interrupted
-                            if (!mNavScreenRequested) {
-                                unblockEvents();
-                                return;
-                            }
-
-                            Bitmap sbm = bm;
-                            if (bm != null) {
-                                //Upscale the low-res bitmap to the needed size
-                                sbm = Bitmap.createBitmap((int) upscaleRatio * bm.getWidth(),
-                                        (int) upscaleRatio * bm.getHeight(), Bitmap.Config.RGB_565);
-                                Canvas canvas = new Canvas(sbm);
-                                Matrix m = new Matrix();
-                                m.setScale(upscaleRatio, upscaleRatio, 0.0f, 0.0f);
-                                canvas.drawBitmap(bm, m, new Paint(Paint.FILTER_BITMAP_FLAG));
-                            }
-
-                            onShowNavScreenContinue(sbm);
+                        // Discard the callback if the req is interrupted
+                        if (!mNavScreenRequested) {
+                            unblockEvents();
+                            return;
                         }
+
+                        Bitmap bm = t.getScreenshot();
+                        Bitmap sbm;
+                        WebView webView = getWebView();
+                        if (webView != null) {
+                            int view_width = webView.getWidth();
+                            int capture_width = mActivity.getResources().getDimensionPixelSize(
+                                    R.dimen.tab_thumbnail_width);
+
+                            float scale =  (float) view_width / capture_width;
+
+                            //Upscale the low-res bitmap to the needed size
+                            Matrix m = new Matrix();
+                            m.postScale(scale, scale);
+                            sbm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
+                                    bm.getHeight(), m, false);
+                        } else {
+                            sbm = bm;
+                        }
+
+                        onShowNavScreenContinue(sbm);
                     }
-            );
-        }
+                });
+        mActiveTab.capture();
     }
 
     void onShowNavScreenContinue(Bitmap viewportBitmap) {
@@ -302,7 +298,6 @@
             mNavScreen.setAlpha(1f);
             mNavScreen.refreshAdapter();
         }
-        mActiveTab.capture();
         if (mAnimScreen == null) {
             mAnimScreen = new AnimScreen(mActivity);
         } else {
@@ -369,7 +364,6 @@
         if (showingNavScreen()) {
             // notify accessibility manager about the screen change
             mNavScreen.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-            mTabControl.setOnThumbnailUpdatedListener(mNavScreen);
         }
     }
 
@@ -517,7 +511,6 @@
     }
 
     private void finishAnimateOut() {
-        mTabControl.setOnThumbnailUpdatedListener(null);
         mNavScreen.setVisibility(View.GONE);
         mCustomViewContainer.setAlpha(1f);
         mCustomViewContainer.setVisibility(View.GONE);