Add freeze tab menu option

  Adds a freeze tab menu option hidden behind about:debug for now.

Change-Id: I1b321de6a5dbcb13e87f6e658439f727970b0e4f
diff --git a/res/menu-sw600dp/browser.xml b/res/menu-sw600dp/browser.xml
index be4a521..23366e7 100644
--- a/res/menu-sw600dp/browser.xml
+++ b/res/menu-sw600dp/browser.xml
@@ -34,6 +34,9 @@
             android:alphabeticShortcut="s" />
         <item android:id="@+id/save_webarchive_menu_id"
             android:title="@string/menu_save_webarchive" />
+        <item
+            android:id="@+id/freeze_tab_menu_id"
+            android:title="@string/menu_freeze_tab" />
         <item android:id="@+id/page_info_menu_id"
             android:title="@string/page_info"
             android:icon="@drawable/ic_pageinfo_holo_dark"
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index 90357e9..6eadcba 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -65,6 +65,9 @@
             android:id="@+id/save_webarchive_menu_id"
             android:title="@string/menu_save_webarchive" />
         <item
+            android:id="@+id/freeze_tab_menu_id"
+            android:title="@string/menu_freeze_tab" />
+        <item
             android:id="@+id/page_info_menu_id"
             android:title="@string/page_info"
             android:icon="@drawable/ic_pageinfo_holo_dark"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ae28023..e51538c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -235,6 +235,9 @@
     <string name="copy_page_url">Copy page url</string>
     <!-- Menu item -->
     <string name="share_page">Share page</string>
+    <!-- Menu item to freeze a tab. This will make a view-only
+            snapshot of the page in a new tab. [CHAR LIMIT=50] -->
+    <string name="menu_freeze_tab">Freeze tab</string>
     <!-- Menu item for saving a page. [CHAR LIMIT=30] -->
     <string name="menu_save_webarchive">Save page</string>
     <!-- Toast informing the user that the page has been saved. [CHAR LIMIT=50] -->
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 3974a9c..6a951c2 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -81,8 +81,10 @@
 import com.android.browser.search.SearchEngine;
 import com.android.common.Search;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.Calendar;
 import java.util.HashMap;
@@ -1494,6 +1496,7 @@
                 final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
                 counter.setVisible(showDebugSettings);
                 counter.setEnabled(showDebugSettings);
+                menu.findItem(R.id.freeze_tab_menu_id).setVisible(showDebugSettings);
 
                 final MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
                 newtab.setEnabled(getTabControl().canCreateNewTab());
@@ -1600,6 +1603,26 @@
                 getCurrentTopWebView().showFindDialog(null, true);
                 break;
 
+            case R.id.freeze_tab_menu_id:
+                // TODO: Show error messages
+                WebView source = getCurrentTopWebView();
+                if (source == null) break;
+                Tab t = createNewTab(false, true, false);
+                if (t == null) break;
+                WebView pinned = t.getWebView();
+                if (pinned == null) break;
+                try {
+                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                    source.saveViewState(bos);
+                    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+                    pinned.loadViewState(bis);
+                    bis.close();
+                    bos.close();
+                } catch (IOException e) {
+                    closeTab(t);
+                }
+                break;
+
             case R.id.save_webarchive_menu_id:
                 String state = Environment.getExternalStorageState();
                 if (!Environment.MEDIA_MOUNTED.equals(state)) {