merge in jb-release history after reset to master
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index e50f72e..c00ffa8 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -263,7 +263,7 @@
     <item msgid="2193955365569270096">"Tiếng Hàn (EUC-KR)"</item>
   </string-array>
     <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Mã hóa văn bản"</string>
-    <string name="pref_accessibility_title" msgid="5127836981587423215">"Khả năng truy cập"</string>
+    <string name="pref_accessibility_title" msgid="5127836981587423215">"Hỗ trợ truy cập"</string>
     <string name="pref_font_size_category" msgid="6683754355084218254">"Kích thước văn bản"</string>
     <string name="pref_lab_title" msgid="5571091610359629423">"Lab"</string>
     <string name="pref_lab_quick_controls" msgid="3267606522082281367">"Các điều khiển nhanh"</string>
diff --git a/res/values/all_search_engines.xml b/res/values/all_search_engines.xml
index 58992a4..e472915 100644
--- a/res/values/all_search_engines.xml
+++ b/res/values/all_search_engines.xml
@@ -207,10 +207,10 @@
   <string-array name="google" translatable="false">
     <item>Google</item>
     <item>google.com</item>
-    <item>http://www.google.com/favicon.ico</item>
-    <item>http://www.google.com/search?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}</item>
+    <item>https://www.google.com/favicon.ico</item>
+    <item>https://www.google.com/search?ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}</item>
     <item>UTF-8</item>
-    <item>http://www.google.com/complete/search?hl={language}&amp;client=android&amp;q={searchTerms}</item>
+    <item>https://www.google.com/complete/search?client=android&amp;q={searchTerms}</item>
   </string-array>
   <string-array name="bing_en_NZ" translatable="false">
     <item>Bing</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2de5e58..2a7fa96 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -664,6 +664,28 @@
     <string name="pref_data_preload_summary">Allow browser to preload high confidence search results in the background</string>
     <!-- Title of dialog for search preloading [CHAR LIMIT=40] -->
     <string name="pref_data_preload_dialogtitle">Search result preloading</string>
+    <!-- Title for link prefetching [CHAR LIMIT=40] -->
+    <string name="pref_link_prefetch_title">Web page preloading</string>
+    <!-- Link prefetching options [CHAR LIMIT=20] -->
+    <string-array name="pref_link_prefetch_choices">
+        <item>Never</item>
+        <item>Only on Wi-Fi</item>
+        <item>Always</item>
+    </string-array>
+    <!-- Do not translate -->
+    <string name="pref_link_prefetch_value_never" translatable="false">NEVER</string>
+    <string name="pref_link_prefetch_value_wifi_only" translatable="false">WIFI_ONLY</string>
+    <string name="pref_link_prefetch_value_always" translatable="false">ALWAYS</string>
+    <string name="pref_link_prefetch_default_value" translatable="false">@string/pref_link_prefetch_value_wifi_only</string>
+    <string-array name="pref_link_prefetch_values" translatable="false">
+        <item><xliff:g>@string/pref_link_prefetch_value_never</xliff:g></item>
+        <item><xliff:g>@string/pref_link_prefetch_value_wifi_only</xliff:g></item>
+        <item><xliff:g>@string/pref_link_prefetch_value_always</xliff:g></item>
+    </string-array>
+    <!-- Summary for link prefetching [CHAR LIMIT=80] -->
+    <string name="pref_link_prefetch_summary">Allow browser to preload linked web pages in the background</string>
+    <!-- Title of dialog for link prefetching [CHAR LIMIT=40] -->
+    <string name="pref_link_prefetch_dialogtitle">Web page preloading</string>
     <!-- Title for a dialog displayed when the browser has a data connectivity
             problem -->
     <string name="browserFrameNetworkErrorLabel">Connection problem</string>
@@ -763,14 +785,9 @@
     <!-- Do not translate.  Testing only -->
     <string name="dump_nav" translatable="false">Dump navigation cache</string>
 
-    <!-- The default homepage. If it starts with "http://www.google" and the
-            user signs up the device with a Google sites account, the site's
-            domain will be appended. -->
+    <!-- The default homepage. -->
     <string name="homepage_base" translatable="false">
-        http://www.google.com/webhp?client={CID}&amp;source=android-home</string>
-    <!-- The default url for the instant_base_page. -->
-    <string name="instant_base" translatable="false">
-        http://www.google.com/webhp?client={CID}&amp;source=android-instant&amp;ion=1</string>
+        https://www.google.com/webhp?client={CID}&amp;source=android-home</string>
 
     <!-- Bookmarks -->
     <string-array name="bookmarks" translatable="false">
diff --git a/res/xml/bandwidth_preferences.xml b/res/xml/bandwidth_preferences.xml
index bb1688e..9946b48 100644
--- a/res/xml/bandwidth_preferences.xml
+++ b/res/xml/bandwidth_preferences.xml
@@ -24,6 +24,14 @@
         android:entryValues="@array/pref_data_preload_values"
         android:dialogTitle="@string/pref_data_preload_dialogtitle" />
 
+    <ListPreference
+        android:key="link_prefetch_when"
+        android:title="@string/pref_link_prefetch_title"
+        android:summary="@string/pref_link_prefetch_summary"
+        android:entries="@array/pref_link_prefetch_choices"
+        android:entryValues="@array/pref_link_prefetch_values"
+        android:dialogTitle="@string/pref_link_prefetch_dialogtitle" />
+
     <CheckBoxPreference
         android:key="load_images"
         android:defaultValue="true"
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 4fe93d6..415e72d 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -22,6 +22,8 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
 import android.os.Build;
 import android.os.Message;
 import android.preference.PreferenceManager;
@@ -115,6 +117,9 @@
     private boolean mNeedsSharedSync = true;
     private float mFontSizeMult = 1.0f;
 
+    // Current state of network-dependent settings
+    private boolean mLinkPrefetchAllowed = true;
+
     // Cached values
     private int mPageCacheCapacity = 1;
     private String mAppCachePath;
@@ -290,6 +295,8 @@
             settings.setProperty(WebViewProperties.gfxEnableCpuUploadPath,
                     enableCpuUploadPath() ? "true" : "false");
         }
+
+        settings.setLinkPrefetchEnabled(mLinkPrefetchAllowed);
     }
 
     /**
@@ -361,8 +368,7 @@
         syncManagedSettings();
         if (PREF_SEARCH_ENGINE.equals(key)) {
             updateSearchEngine(false);
-        }
-        if (PREF_FULLSCREEN.equals(key)) {
+        } else if (PREF_FULLSCREEN.equals(key)) {
             if (mController.getUi() != null) {
                 mController.getUi().setFullscreen(useFullscreen());
             }
@@ -370,6 +376,8 @@
             if (mController.getUi() != null) {
                 mController.getUi().setUseQuickControls(sharedPreferences.getBoolean(key, false));
             }
+        } else if (PREF_LINK_PREFETCH.equals(key)) {
+            updateConnectionType();
         }
     }
 
@@ -576,6 +584,37 @@
         return mPrefs;
     }
 
+    // update connectivity-dependent options
+    public void updateConnectionType() {
+        ConnectivityManager cm = (ConnectivityManager)
+            mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+        String linkPrefetchPreference = getLinkPrefetchEnabled();
+        boolean linkPrefetchAllowed = linkPrefetchPreference.
+            equals(getLinkPrefetchAlwaysPreferenceString(mContext));
+        NetworkInfo ni = cm.getActiveNetworkInfo();
+        if (ni != null) {
+            switch (ni.getType()) {
+                case ConnectivityManager.TYPE_WIFI:
+                case ConnectivityManager.TYPE_ETHERNET:
+                case ConnectivityManager.TYPE_BLUETOOTH:
+                    linkPrefetchAllowed |= linkPrefetchPreference.
+                        equals(getLinkPrefetchOnWifiOnlyPreferenceString(mContext));
+                    break;
+                case ConnectivityManager.TYPE_MOBILE:
+                case ConnectivityManager.TYPE_MOBILE_DUN:
+                case ConnectivityManager.TYPE_MOBILE_MMS:
+                case ConnectivityManager.TYPE_MOBILE_SUPL:
+                case ConnectivityManager.TYPE_WIMAX:
+                default:
+                    break;
+            }
+        }
+        if (mLinkPrefetchAllowed != linkPrefetchAllowed) {
+            mLinkPrefetchAllowed = linkPrefetchAllowed;
+            syncManagedSettings();
+        }
+    }
+
     // -----------------------------
     // getter/setters for accessibility_preferences.xml
     // -----------------------------
@@ -858,6 +897,30 @@
         return mPrefs.getString(PREF_DATA_PRELOAD, getDefaultPreloadSetting());
     }
 
+    public static String getLinkPrefetchOnWifiOnlyPreferenceString(Context context) {
+        return context.getResources().getString(R.string.pref_link_prefetch_value_wifi_only);
+    }
+
+    public static String getLinkPrefetchAlwaysPreferenceString(Context context) {
+        return context.getResources().getString(R.string.pref_link_prefetch_value_always);
+    }
+
+    private static final String DEFAULT_LINK_PREFETCH_SECURE_SETTING_KEY =
+            "browser_default_link_prefetch_setting";
+
+    public String getDefaultLinkPrefetchSetting() {
+        String preload = Settings.Secure.getString(mContext.getContentResolver(),
+            DEFAULT_LINK_PREFETCH_SECURE_SETTING_KEY);
+        if (preload == null) {
+            preload = mContext.getResources().getString(R.string.pref_link_prefetch_default_value);
+        }
+        return preload;
+    }
+
+    public String getLinkPrefetchEnabled() {
+        return mPrefs.getString(PREF_LINK_PREFETCH, getDefaultLinkPrefetchSetting());
+    }
+
     // -----------------------------
     // getter/setters for browser recovery
     // -----------------------------
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
index 4ae91ba..4480664 100644
--- a/src/com/android/browser/NetworkStateHandler.java
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -26,6 +26,8 @@
 import android.webkit.WebView;
 import android.webkit.WebViewClassic;
 
+import com.android.browser.BrowserSettings;
+
 /**
  * Handle network state changes
  */
@@ -68,6 +70,7 @@
                     String subtypeName = info.getSubtypeName();
                     sendNetworkType(typeName.toLowerCase(),
                             (subtypeName != null ? subtypeName.toLowerCase() : ""));
+                    BrowserSettings.getInstance().updateConnectionType();
 
                     boolean noConnection = intent.getBooleanExtra(
                             ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
@@ -87,6 +90,7 @@
     void onResume() {
         mActivity.registerReceiver(mNetworkStateIntentReceiver,
                 mNetworkStateChangedFilter);
+        BrowserSettings.getInstance().updateConnectionType();
     }
 
     /**
@@ -114,5 +118,4 @@
             WebViewClassic.fromWebView(w).setNetworkType(type, subtype);
         }
     }
-
 }
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index 1a20495..ff42aaf 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -102,6 +102,7 @@
     // Keys for bandwidth_preferences.xml
     // ----------------------
     static final String PREF_DATA_PRELOAD = "preload_when";
+    static final String PREF_LINK_PREFETCH = "link_prefetch_when";
     static final String PREF_LOAD_IMAGES = "load_images";
 
     // ----------------------
diff --git a/src/com/android/browser/preferences/BandwidthPreferencesFragment.java b/src/com/android/browser/preferences/BandwidthPreferencesFragment.java
index 2c147cc..0cb064a 100644
--- a/src/com/android/browser/preferences/BandwidthPreferencesFragment.java
+++ b/src/com/android/browser/preferences/BandwidthPreferencesFragment.java
@@ -16,9 +16,11 @@
 
 package com.android.browser.preferences;
 
+import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
 
 import com.android.browser.BrowserSettings;
 import com.android.browser.PreferenceKeys;
@@ -38,15 +40,24 @@
     @Override
     public void onResume() {
         super.onResume();
-        if (!getPreferenceScreen().getSharedPreferences()
-                .contains(PreferenceKeys.PREF_DATA_PRELOAD)) {
+        PreferenceScreen prefScreen = getPreferenceScreen();
+        SharedPreferences sharedPrefs = prefScreen.getSharedPreferences();
+        if (!sharedPrefs.contains(PreferenceKeys.PREF_DATA_PRELOAD)) {
             // set default value for preload setting
-            ListPreference preload = (ListPreference) getPreferenceScreen().findPreference(
+            ListPreference preload = (ListPreference) prefScreen.findPreference(
                     PreferenceKeys.PREF_DATA_PRELOAD);
             if (preload != null) {
                 preload.setValue(BrowserSettings.getInstance().getDefaultPreloadSetting());
             }
         }
+        if (!sharedPrefs.contains(PreferenceKeys.PREF_LINK_PREFETCH)) {
+            // set default value for link prefetch setting
+            ListPreference prefetch = (ListPreference) prefScreen.findPreference(
+                    PreferenceKeys.PREF_LINK_PREFETCH);
+            if (prefetch != null) {
+                prefetch.setValue(BrowserSettings.getInstance().getDefaultLinkPrefetchSetting());
+            }
+        }
     }
 
 }
diff --git a/src/com/android/browser/search/SearchEngineInfo.java b/src/com/android/browser/search/SearchEngineInfo.java
index 0c11a04..ec304f6 100644
--- a/src/com/android/browser/search/SearchEngineInfo.java
+++ b/src/com/android/browser/search/SearchEngineInfo.java
@@ -83,15 +83,13 @@
 
         // Add the current language/country information to the URIs.
         Locale locale = context.getResources().getConfiguration().locale;
-        String language = locale.getLanguage();
-        StringBuilder languageBuilder = new StringBuilder(language);
-        String country = locale.getCountry();
-        if (!TextUtils.isEmpty(country) && useLangCountryHl(language, country)) {
-            languageBuilder.append('-');
-            languageBuilder.append(country);
+        StringBuilder language = new StringBuilder(locale.getLanguage());
+        if (!TextUtils.isEmpty(locale.getCountry())) {
+            language.append('-');
+            language.append(locale.getCountry());
         }
 
-        String language_str = languageBuilder.toString();
+        String language_str = language.toString();
         mSearchEngineData[FIELD_SEARCH_URI] =
                 mSearchEngineData[FIELD_SEARCH_URI].replace(PARAMETER_LANGUAGE, language_str);
         mSearchEngineData[FIELD_SUGGEST_URI] =
@@ -111,19 +109,6 @@
                 mSearchEngineData[FIELD_SUGGEST_URI].replace(PARAMETER_INPUT_ENCODING, enc);
     }
 
-    private static boolean useLangCountryHl(String language, String country) {
-        // lang-country is currently only supported for a small number of locales
-        if("en".equals(language)) {
-            return "GB".equals(country);
-        } else if ("zh".equals(language)) {
-            return "CN".equals(country) || "TW".equals(country);
-        } else if ("pt".equals(language)) {
-            return "BR".equals(country) || "PT".equals(country);
-        } else {
-            return false;
-        }
-    }
-
     public String getName() {
         return mName;
     }
diff --git a/tools/get_search_engines.py b/tools/get_search_engines.py
index 86393f1..17916c8 100755
--- a/tools/get_search_engines.py
+++ b/tools/get_search_engines.py
@@ -39,9 +39,9 @@
 
 google_data = ["google", "Google", "google.com",
   "http://www.google.com/favicon.ico",
-  "http://www.google.com/search?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
+  "http://www.google.com/search?ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
   "UTF-8",
-  "http://www.google.com/complete/search?hl={language}&amp;client=android&amp;q={searchTerms}"]
+  "http://www.google.com/complete/search?client=android&amp;q={searchTerms}"]
 
 class SearchEngineManager(object):
   """Manages list of search engines and creates locale specific lists.