Reduce capture frequency

 Bug: 5142655
 Only capture while the navscreen is visible
 Fix Tab.capture to never capture the title bar
 Fix navscreen not responding to updated thumbnails

Change-Id: Id48ad32bb131c398c7d1ce4243e92f04cd421ade
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 38bbf90..dd93c1f 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.content.Context;
+import android.graphics.Canvas;
 import android.util.AttributeSet;
 import android.view.View;
 import android.webkit.WebView;
@@ -99,4 +100,8 @@
         }
     }
 
+    public void drawContent(Canvas c) {
+        onDraw(c);
+    }
+
 }
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index face39e..0190c1b 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -38,9 +38,12 @@
 import android.widget.TextView;
 
 import com.android.browser.NavTabGallery.OnRemoveListener;
+import com.android.browser.TabControl.OnThumbnailUpdatedListener;
+
+import java.util.HashMap;
 
 public class NavScreen extends RelativeLayout
-        implements OnClickListener, OnMenuItemClickListener {
+        implements OnClickListener, OnMenuItemClickListener, OnThumbnailUpdatedListener {
 
     UiController mUiController;
     PhoneUi mUi;
@@ -62,6 +65,7 @@
     TabAdapter mAdapter;
     int mOrientation;
     boolean mNeedsMenu;
+    HashMap<Tab, View> mTabViews;
 
     public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
         super(activity);
@@ -119,7 +123,9 @@
         mNewTab.setOnClickListener(this);
         mMore.setOnClickListener(this);
         mScroller = (NavTabGallery) findViewById(R.id.scroller);
-        mAdapter = new TabAdapter(mContext, mUiController.getTabControl());
+        TabControl tc = mUiController.getTabControl();
+        mTabViews = new HashMap<Tab, View>(tc.getTabCount());
+        mAdapter = new TabAdapter(mContext, tc);
         mScroller.setAdapter(mAdapter);
         mScroller.setOrientation(mOrientation == Configuration.ORIENTATION_LANDSCAPE
                 ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
@@ -239,6 +245,7 @@
             final NavTabView tabview = new NavTabView(mActivity);
             final Tab tab = getItem(position);
             tabview.setWebView(mUi, tab);
+            mTabViews.put(tab, tabview.mImage);
             tabview.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -262,4 +269,13 @@
 
     }
 
+    @Override
+    public void onThumbnailUpdated(Tab t) {
+        View v = mTabViews.get(t);
+        if (v != null) {
+            v.invalidate();
+            mScroller.invalidate();
+        }
+    }
+
 }
diff --git a/src/com/android/browser/NavTabView.java b/src/com/android/browser/NavTabView.java
index 23ad2f1..ed6b63d 100644
--- a/src/com/android/browser/NavTabView.java
+++ b/src/com/android/browser/NavTabView.java
@@ -31,7 +31,7 @@
     private ImageView mClose;
     private TextView mTitle;
     private View mTitleBar;
-    private ImageView mImage;
+    ImageView mImage;
     private OnClickListener mClickListener;
     private boolean mHighlighted;
 
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 32bc092..f33dbef 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -17,7 +17,6 @@
 package com.android.browser;
 
 import android.app.Activity;
-import android.content.Context;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.ActionMode;
@@ -27,7 +26,6 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
 
@@ -112,6 +110,8 @@
 
     @Override
     public void setActiveTab(final Tab tab) {
+        mTitleBar.cancelTitleBarAnimation(true);
+        mTitleBar.setSkipTitleBarAnimations(true);
         super.setActiveTab(tab);
         BrowserWebView view = (BrowserWebView) tab.getWebView();
         // TabControl.setCurrentTab has been called before this,
@@ -138,6 +138,7 @@
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
         updateLockIconToLatest(tab);
         tab.getTopWindow().requestFocus();
+        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     /**
@@ -269,6 +270,7 @@
     }
 
     void showNavScreen() {
+        mActiveTab.capture();
         detachTab(mActiveTab);
         mNavScreen = new NavScreen(mActivity, mUiController, this);
         // Add the custom view to its container.
@@ -278,10 +280,12 @@
         mCustomViewContainer.bringToFront();
         // notify accessibility manager about the screen change
         mNavScreen.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+        mTabControl.setOnThumbnailUpdatedListener(mNavScreen);
     }
 
     void hideNavScreen(boolean animate) {
         if (mNavScreen == null) return;
+        mTabControl.setOnThumbnailUpdatedListener(null);
         Tab tab = mNavScreen.getSelectedTab();
         mCustomViewContainer.removeView(mNavScreen);
         mNavScreen = null;
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 39bf49c..9e4894f 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -68,6 +68,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.browser.TabControl.OnThumbnailUpdatedListener;
 import com.android.browser.homepages.HomeProvider;
 import com.android.browser.provider.BrowserProvider2.Thumbnails;
 import com.android.browser.provider.SnapshotProvider.Snapshots;
@@ -97,7 +98,7 @@
     private static final String CONSOLE_LOGTAG = "browser";
 
     private static final int MSG_CAPTURE = 42;
-    private static final int CAPTURE_DELAY = 500;
+    private static final int CAPTURE_DELAY = 100;
 
     private static Bitmap sDefaultFavicon;
 
@@ -1498,6 +1499,7 @@
         mWebViewController.onSetWebView(this, w);
 
         if (mMainView != null) {
+            mMainView.setPictureListener(null);
             if (w != null) {
                 syncCurrentState(w, null);
             } else {
@@ -1516,7 +1518,10 @@
             // switched to another tab while waiting for the download to start.
             mMainView.setDownloadListener(mDownloadListener);
             mMainView.setWebBackForwardListClient(mWebBackForwardListClient);
-            mMainView.setPictureListener(this);
+            TabControl tc = mWebViewController.getTabControl();
+            if (tc != null && tc.getOnThumbnailUpdatedListener() != null) {
+                mMainView.setPictureListener(this);
+            }
             if (mSavedState != null) {
                 mMainView.restoreState(mSavedState);
                 mSavedState = null;
@@ -1670,6 +1675,9 @@
     }
 
     void putInForeground() {
+        if (mInForeground) {
+            return;
+        }
         mInForeground = true;
         resume();
         Activity activity = mWebViewController.getActivity();
@@ -1685,6 +1693,9 @@
     }
 
     void putInBackground() {
+        if (!mInForeground) {
+            return;
+        }
         mInForeground = false;
         pause();
         mMainView.setOnCreateContextMenuListener(null);
@@ -2024,9 +2035,22 @@
         c.translate(-left, -top);
         float scale = mCaptureWidth / (float) mMainView.getWidth();
         c.scale(scale, scale, left, top);
-        mMainView.draw(c);
+        if (mMainView instanceof BrowserWebView) {
+            ((BrowserWebView)mMainView).drawContent(c);
+        } else {
+            mMainView.draw(c);
+        }
         c.setBitmap(null);
+        mHandler.removeMessages(MSG_CAPTURE);
         persistThumbnail();
+        TabControl tc = mWebViewController.getTabControl();
+        if (tc != null) {
+            OnThumbnailUpdatedListener updateListener
+                    = tc.getOnThumbnailUpdatedListener();
+            if (updateListener != null) {
+                updateListener.onThumbnailUpdated(this);
+            }
+        }
     }
 
     @Override
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index b708841..38a46a8 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -36,6 +36,10 @@
     private static final String POSITIONS = "positions";
     private static final String CURRENT = "current";
 
+    public static interface OnThumbnailUpdatedListener {
+        void onThumbnailUpdated(Tab t);
+    }
+
     // Maximum number of tabs.
     private int mMaxTabs;
     // Private array of WebViews that are used as tabs.
@@ -48,6 +52,7 @@
     private final Controller mController;
 
     private final File mThumbnailDir;
+    private OnThumbnailUpdatedListener mOnThumbnailUpdatedListener;
 
     /**
      * Construct a new TabControl object
@@ -675,4 +680,18 @@
         return true;
     }
 
+    public void setOnThumbnailUpdatedListener(OnThumbnailUpdatedListener listener) {
+        mOnThumbnailUpdatedListener = listener;
+        for (Tab t : mTabs) {
+            WebView web = t.getWebView();
+            if (web != null) {
+                web.setPictureListener(listener != null ? t : null);
+            }
+        }
+    }
+
+    public OnThumbnailUpdatedListener getOnThumbnailUpdatedListener() {
+        return mOnThumbnailUpdatedListener;
+    }
+
 }