Saved Pages tab

 Bug: 4982126
 Add saved pages tab
 Remove "save page" menu option
 Add "save for offline reading" menu option
 Smooth animation to combo view

Change-Id: Ia67552a6f6a5474a6dfcff6790a341d4d36d5a77
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 9046745..88fcbd6 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -40,7 +40,6 @@
 import android.net.http.SslError;
 import android.os.AsyncTask;
 import android.os.Bundle;
-import android.os.Environment;
 import android.os.Handler;
 import android.os.Message;
 import android.os.PowerManager;
@@ -77,6 +76,7 @@
 import android.widget.Toast;
 
 import com.android.browser.IntentHandler.UrlData;
+import com.android.browser.UI.ComboViews;
 import com.android.browser.UI.DropdownChangeListener;
 import com.android.browser.provider.BrowserProvider;
 import com.android.browser.provider.BrowserProvider2.Snapshots;
@@ -330,7 +330,6 @@
                     webView.setInitialScale(scale);
                 }
             }
-            mTabControl.loadSnapshotTabs();
             mUi.updateTabs(mTabControl.getTabs());
         } else {
             mTabControl.restoreState(icicle, currentTabId, restoreIncognitoTabs,
@@ -1179,7 +1178,8 @@
         // Disable opening in a new window if we have maxed out the windows
         extras.putBoolean(BrowserBookmarksPage.EXTRA_DISABLE_WINDOW,
                 !mTabControl.canCreateNewTab());
-        mUi.showComboView(startWithHistory, extras);
+        mUi.showComboView(startWithHistory
+                ? ComboViews.History : ComboViews.Bookmarks, extras);
     }
 
     // combo view callbacks
@@ -1520,11 +1520,9 @@
                 final MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
                 newtab.setEnabled(getTabControl().canCreateNewTab());
 
-                MenuItem archive = menu.findItem(R.id.save_webarchive_menu_id);
-                Tab tab = getTabControl().getCurrentTab();
-                String url = tab != null ? tab.getUrl() : null;
-                archive.setVisible(!TextUtils.isEmpty(url)
-                        && !url.endsWith(".webarchivexml"));
+                MenuItem saveSnapshot = menu.findItem(R.id.save_snapshot_menu_id);
+                Tab tab = getCurrentTab();
+                saveSnapshot.setVisible(tab != null && !tab.isSnapshot());
                 break;
         }
         mCurrentMenuState = mMenuState;
@@ -1619,83 +1617,32 @@
                 getCurrentTopWebView().showFindDialog(null, true);
                 break;
 
-            case R.id.freeze_tab_menu_id:
-                // TODO: Show error messages
-                Tab source = getTabControl().getCurrentTab();
+            case R.id.save_snapshot_menu_id:
+                final Tab source = getTabControl().getCurrentTab();
                 if (source == null) break;
                 final ContentResolver cr = mActivity.getContentResolver();
                 final ContentValues values = source.createSnapshotValues();
-                new AsyncTask<Tab, Void, Long>() {
-                    @Override
-                    protected Long doInBackground(Tab... params) {
-                        Tab t = params[0];
-                        if (values == null) {
-                            return t.isSnapshot()
-                                    ? ((SnapshotTab)t).getSnapshotId()
-                                    : -1;
-                        }
-                        Uri result = cr.insert(Snapshots.CONTENT_URI, values);
-                        long id = ContentUris.parseId(result);
-                        return id;
-                    }
+                if (values != null) {
+                    new AsyncTask<Tab, Void, Long>() {
 
-                    @Override
-                    protected void onPostExecute(Long id) {
-                        if (id > 0) {
-                            createNewSnapshotTab(id, true);
+                        @Override
+                        protected Long doInBackground(Tab... params) {
+                            Uri result = cr.insert(Snapshots.CONTENT_URI, values);
+                            long id = ContentUris.parseId(result);
+                            return id;
                         }
-                    };
-                }.execute(source);
-                break;
 
-            case R.id.save_webarchive_menu_id:
-                String state = Environment.getExternalStorageState();
-                if (!Environment.MEDIA_MOUNTED.equals(state)) {
-                    Log.e(LOGTAG, "External storage not mounted");
-                    Toast.makeText(mActivity, R.string.webarchive_failed,
+                        @Override
+                        protected void onPostExecute(Long id) {
+                            Bundle b = new Bundle();
+                            b.putLong(BrowserSnapshotPage.EXTRA_ANIMATE_ID, id);
+                            mUi.showComboView(ComboViews.Snapshots, b);
+                        };
+                    }.execute(source);
+                } else {
+                    Toast.makeText(mActivity, R.string.snapshot_failed,
                             Toast.LENGTH_SHORT).show();
-                    break;
                 }
-                final String directory = Environment.getExternalStoragePublicDirectory(
-                        Environment.DIRECTORY_DOWNLOADS) + File.separator;
-                File dir = new File(directory);
-                if (!dir.exists() && !dir.mkdirs()) {
-                    Log.e(LOGTAG, "Save as Web Archive: mkdirs for " + directory + " failed!");
-                    Toast.makeText(mActivity, R.string.webarchive_failed,
-                            Toast.LENGTH_SHORT).show();
-                    break;
-                }
-                final WebView topWebView = getCurrentTopWebView();
-                final String title = topWebView.getTitle();
-                final String url = topWebView.getUrl();
-                topWebView.saveWebArchive(directory, true,
-                        new ValueCallback<String>() {
-                    @Override
-                    public void onReceiveValue(final String value) {
-                        if (value != null) {
-                            File file = new File(value);
-                            final long length = file.length();
-                            if (file.exists() && length > 0) {
-                                Toast.makeText(mActivity, R.string.webarchive_saved,
-                                        Toast.LENGTH_SHORT).show();
-                                final DownloadManager manager = (DownloadManager) mActivity
-                                        .getSystemService(Context.DOWNLOAD_SERVICE);
-                                new Thread("Add WebArchive to download manager") {
-                                    @Override
-                                    public void run() {
-                                        manager.addCompletedDownload(
-                                                null == title ? value : title,
-                                                value, true, "application/x-webarchive-xml",
-                                                value, length, true);
-                                    }
-                                }.start();
-                                return;
-                            }
-                        }
-                        DownloadHandler.onDownloadStartNoStream(mActivity,
-                                url, null, null, null, topWebView.isPrivateBrowsingEnabled());
-                    }
-                });
                 break;
 
             case R.id.page_info_menu_id:
@@ -2166,18 +2113,6 @@
         mUi.removeTab(tab);
         mTabControl.removeTab(tab);
         mCrashRecoveryHandler.backupState();
-        if (tab.isSnapshot()) {
-            SnapshotTab st = (SnapshotTab) tab;
-            final Uri uri = ContentUris.withAppendedId(
-                    Snapshots.CONTENT_URI, st.getSnapshotId());
-            final ContentResolver cr = mActivity.getContentResolver();
-            new Thread() {
-                @Override
-                public void run() {
-                    cr.delete(uri, null, null);
-                }
-            }.start();
-        }
     }
 
     @Override
@@ -2326,11 +2261,17 @@
         return tab;
     }
 
-    private SnapshotTab createNewSnapshotTab(long snapshotId, boolean setActive) {
-        SnapshotTab tab = mTabControl.createSnapshotTab(snapshotId);
-        addTab(tab);
-        if (setActive) {
-            setActiveTab(tab);
+    @Override
+    public SnapshotTab createNewSnapshotTab(long snapshotId, boolean setActive) {
+        SnapshotTab tab = null;
+        if (mTabControl.canCreateNewTab()) {
+            tab = mTabControl.createSnapshotTab(snapshotId);
+            addTab(tab);
+            if (setActive) {
+                setActiveTab(tab);
+            }
+        } else {
+            mUi.showMaxTabsWarning();
         }
         return tab;
     }