Integrate Save WebArchive with download manager.

Bug:2968359
Bug:2905874

Change-Id: I80f557af415b03698325397d7a10d66bb0c10827
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index f4588bd..b01ea54 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -43,6 +43,7 @@
 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 +78,7 @@
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
+import android.widget.Toast;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -1567,6 +1569,52 @@
                 getCurrentTopWebView().showFindDialog(null, true);
                 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,
+                            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;
+                }
+                WebView topWebView = getCurrentTopWebView();
+                final String title = topWebView.getTitle();
+                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) {
+                                final DownloadManager manager = (DownloadManager) mActivity
+                                        .getSystemService(Context.DOWNLOAD_SERVICE);
+                                new Thread("Add WebArchive to download manager") {
+                                    @Override
+                                    public void run() {
+                                        manager.completedDownload(null == title ? value : title,
+                                                value, true, "application/x-webarchive-xml",
+                                                value, length, true);
+                                    }
+                                }.start();
+                                return;
+                            }
+                        }
+                        Toast.makeText(mActivity,
+                                R.string.webarchive_failed, Toast.LENGTH_SHORT).show();
+                    }
+                });
+                break;
+
             case R.id.page_info_menu_id:
                 mPageDialogsHandler.showPageInfo(mTabControl.getCurrentTab(),
                         false);