Reload page on settings change

- Reload current webpage when user tweaks browser settings

CR-Fixed: 5570

Change-Id: I643b857b23e2f39e6f54c3d38eb83622e0794d96
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index 2141490..46fde6a 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -19,8 +19,10 @@
 import android.app.Activity;
 import android.app.Fragment;
 import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
+import android.text.TextUtils;
 import android.view.MenuItem;
 
 import com.android.browser.preferences.AboutPreferencesFragment;
@@ -28,8 +30,12 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
 
 public class BrowserPreferencesPage extends Activity {
+    public static String sResultExtra;
+    private static ArrayList<String> sUpdatedUrls =
+            new ArrayList<String>(); //List of URLS for whom settings were updated
 
     public static void startPreferencesForResult(Activity callerActivity, String url, int requestCode) {
         final Intent intent = new Intent(callerActivity, BrowserPreferencesPage.class);
@@ -62,6 +68,8 @@
             return;
         }
 
+        sResultExtra = "";
+        sUpdatedUrls.clear();
         Intent intent = getIntent();
         if (intent != null) {
             String action = intent.getAction();
@@ -120,4 +128,22 @@
         }
         return super.onOptionsItemSelected(item);
     }
+
+    @Override
+    public void finish() {
+        if (!TextUtils.isEmpty(sResultExtra)) {
+            Intent intent = this.getIntent();
+            intent.putExtra(Intent.EXTRA_TEXT, sResultExtra);
+            intent.putStringArrayListExtra(Controller.EXTRA_UPDATED_URLS, sUpdatedUrls);
+            this.setResult(RESULT_OK, intent);
+        }
+        super.finish();
+    }
+
+    public static void onUrlNeedsReload(String url) {
+        String host = (Uri.parse(url)).getHost();
+        if (!sUpdatedUrls.contains(host)) {
+            sUpdatedUrls.add(host);
+        }
+    }
 }
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 2b66988..4a83f8a 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -134,6 +134,7 @@
     public static final String INCOGNITO_URI = "chrome://incognito";
     public static final String EXTRA_REQUEST_CODE = "_fake_request_code_";
     public static final String EXTRA_RESULT_CODE = "_fake_result_code_";
+    public static final String EXTRA_UPDATED_URLS = "updated_urls";
 
     // Remind switch to data connection if wifi is unavailable
     private static final int NETWORK_SWITCH_TYPE_OK = 1;
@@ -1334,6 +1335,17 @@
                     String action = intent.getStringExtra(Intent.EXTRA_TEXT);
                     if (PreferenceKeys.PREF_PRIVACY_CLEAR_HISTORY.equals(action)) {
                         mTabControl.removeParentChildRelationShips();
+                    } else if (action.equals(PreferenceKeys.ACTION_RELOAD_PAGE)) {
+                        ArrayList<String> origins =
+                                intent.getStringArrayListExtra(EXTRA_UPDATED_URLS);
+                        if (origins.isEmpty()) {
+                            mTabControl.reloadLiveTabs();
+                        }
+                        else{
+                            for (String origin : origins){
+                                mTabControl.findAndReload(origin);
+                            }
+                        }
                     }
                 }
                 break;
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 77050db..799891c 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -341,8 +341,8 @@
                     baos.toByteArray());
         }
         BrowserPreferencesPage.startPreferenceFragmentExtraForResult(
-                mUiController.getActivity(),
-                SiteSpecificPreferencesFragment.class.getName(), bundle, 0);
+                mUiController.getActivity(), SiteSpecificPreferencesFragment.class.getName(),
+                bundle, Controller.PREFERENCES_PAGE);
     }
 
     @Override
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index 2f144c5..15ec6a0 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -143,4 +143,6 @@
     static final String PREF_LEGAL_CREDITS = "legal_credits";
     static final String PREF_LEGAL_EULA = "legal_eula";
     static final String PREF_LEGAL_PRIVACY_POLICY = "legal_privacy_policy";
+
+    static final String ACTION_RELOAD_PAGE = "reload";
 }
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index a30cdca..81da696 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -16,6 +16,7 @@
 
 package com.android.browser;
 
+import android.net.Uri;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -38,6 +39,31 @@
     private static final String POSITIONS = "positions";
     private static final String CURRENT = "current";
 
+
+    /*
+    Find and reload any live tabs that have loaded the given URL.
+    Note - Upto 2 tabs are live at any given moment.
+     */
+    public void findAndReload(String origin) {
+        for (Tab tab : mTabs){
+            if (tab.getWebView() != null) {
+                Uri url = Uri.parse(tab.getWebView().getUrl());
+                if (url.getHost().equals(origin)){
+                    tab.getWebView().reload();
+                }
+            }
+        }
+    }
+
+    // Reload the all the live tabs
+    public void reloadLiveTabs() {
+        for (Tab tab : mTabs) {
+            if (tab.getWebView() != null) {
+                tab.getWebView().reload();
+            }
+        }
+    }
+
     public static interface OnThumbnailUpdatedListener {
         void onThumbnailUpdated(Tab t);
     }
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index 09355a5..9f61061 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -45,6 +45,7 @@
 import android.widget.Toast;
 
 import com.android.browser.AutoFillSettingsFragment;
+import com.android.browser.BrowserPreferencesPage;
 import com.android.browser.BrowserSettings;
 import com.android.browser.PreferenceKeys;
 import com.android.browser.R;
@@ -102,6 +103,10 @@
         SwitchPreference powersave = (SwitchPreference) findPreference(PREF_POWERSAVE);
         powersave.setOnPreferenceChangeListener(this);
 
+        SwitchPreference nightmode = (SwitchPreference) findPreference(
+                PreferenceKeys.PREF_NIGHTMODE_ENABLED);
+        nightmode.setOnPreferenceChangeListener(this);
+
         final Bundle arguments = getArguments();
         if (arguments != null && arguments.getBoolean("LowPower")) {
             LowPowerDialogFragment fragment = LowPowerDialogFragment.newInstance();
@@ -168,8 +173,12 @@
                 PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.WEBREFINER, !(Boolean)objValue);
                 showPowerSaveInfo((Boolean) objValue);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
         }
 
+        if (pref.getKey().equals(PreferenceKeys.PREF_NIGHTMODE_ENABLED)) {
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
+        }
         return true;
     }
 
diff --git a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
index 1bcf0a3..d038163 100644
--- a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
+++ b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
@@ -17,6 +17,7 @@
 package com.android.browser.preferences;
 
 import com.android.browser.BrowserLocationSwitchPreference;
+import com.android.browser.BrowserPreferencesPage;
 import com.android.browser.BrowserSettings;
 import com.android.browser.PreferenceKeys;
 import com.android.browser.R;
@@ -155,30 +156,35 @@
         if (pref.getKey().toString().equalsIgnoreCase("enable_geolocation")) {
             PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.GEOLOCATION, flag);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
         if (pref.getKey().toString().equalsIgnoreCase("microphone")) {
             PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.VOICE, flag);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
         if (pref.getKey().toString().equalsIgnoreCase("camera")) {
             PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.VIDEO, flag);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
         if (pref.getKey().toString().equalsIgnoreCase("distracting_contents")) {
             PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.WEBREFINER, !flag);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
         if (pref.getKey().toString().equalsIgnoreCase("popup_windows")) {
             PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.POPUP, flag);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
@@ -192,12 +198,14 @@
                         PermissionsServiceFactory.PermissionType.THIRDPARTYCOOKIES, flag);
                 showPermission(findPreference("accept_third_cookies"), flag);
             }
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
         if (pref.getKey().toString().equalsIgnoreCase("accept_third_cookies")) {
             PermissionsServiceFactory.setDefaultPermissions(
                     PermissionsServiceFactory.PermissionType.THIRDPARTYCOOKIES, flag);
+            BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
             return true;
         }
 
diff --git a/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java b/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java
index 0b3ec8a..23311b4 100644
--- a/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java
+++ b/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java
@@ -57,6 +57,7 @@
 import android.widget.TextView;
 
 import com.android.browser.BrowserLocationListPreference;
+import com.android.browser.BrowserPreferencesPage;
 import com.android.browser.BrowserSettings;
 import com.android.browser.NavigationBarBase;
 import com.android.browser.PreferenceKeys;
@@ -94,6 +95,8 @@
     private ActionBar mBar;
     private List<String> mLocationValues;
 
+    private Preference mSecurityInfoPrefs;
+
     private boolean mUsingDefaultSettings = true;
     private int mOriginalActionBarOptions;
     private int mIconColor = 0;
@@ -182,6 +185,14 @@
             if (view != null) {
                 view.clearText();
             }
+
+            boolean empty = true;
+            for (Map.Entry<ViewType, String> entry: mTexts.entrySet()) {
+                if (!entry.getValue().isEmpty()) {
+                    empty = false;
+                }
+            }
+            mbEmpty = empty;
         }
 
         public void setResource(ViewType type, View parent, int resId) {
@@ -309,6 +320,8 @@
                 mSslState = 2;
             }
         }
+
+        updateSecurityViewVisibility();
     }
 
     private AlertDialog.Builder createSslCertificateDialog(Context ctx,
@@ -452,14 +465,17 @@
         Preference pref = findPreference("clear_data");
         updateStorageInfo(pref);
         pref.setOnPreferenceClickListener(this);
-        String warningText = new String("");
+        String warningText = (mSslState == 1) ? getString(R.string.pref_warning_cert) + " " :
+                new String("");
+        boolean setting_warnings = false;
 
         long permission = showPermission("select_geolocation",
                 PermissionsServiceFactory.PermissionType.GEOLOCATION,
                 R.string.pref_security_ask_before_using, R.string.pref_security_not_allowed);
 
         if (PermissionsServiceFactory.Permission.ALLOW == permission) {
-            warningText = getString(R.string.pref_privacy_enable_geolocation);
+            warningText += getString(R.string.pref_privacy_enable_geolocation);
+            setting_warnings = true;
         }
 
         ListPreference geolocation_pref = (ListPreference) findPreference("select_geolocation");
@@ -477,7 +493,8 @@
                 pref.setSummary(customSummary);
             }
             mUsingDefaultSettings = false;
-            warningText = getString(R.string.pref_privacy_enable_geolocation);
+            warningText += getString(R.string.pref_privacy_enable_geolocation);
+            setting_warnings = true;
             geolocation_pref.setValueIndex(1);
         } else if (permission == PermissionsServiceFactory.Permission.ALLOW) {
             geolocation_pref.setValueIndex(2);
@@ -487,25 +504,31 @@
                 R.string.pref_security_ask_before_using, R.string.pref_security_not_allowed);
 
         if (PermissionsServiceFactory.Permission.ALLOW == permission) {
-            if (!warningText.isEmpty()) {
+            if (!warningText.isEmpty() && setting_warnings) {
                 warningText += ", ";
             }
             warningText += getString(R.string.pref_security_allow_mic);
+            setting_warnings = true;
         }
 
         permission = showPermission("camera", PermissionsServiceFactory.PermissionType.VIDEO,
                 R.string.pref_security_ask_before_using, R.string.pref_security_not_allowed);
         if (PermissionsServiceFactory.Permission.ALLOW == permission) {
-            if (!warningText.isEmpty()) {
+            if (!warningText.isEmpty() && setting_warnings) {
                 warningText += ", ";
             }
             warningText += getString(R.string.pref_security_allow_camera);
+            setting_warnings = true;
         }
 
         if (!warningText.isEmpty()) {
-            warningText += " ";
-            warningText += getResources().getString(R.string.pref_security_access_is_allowed);
-            mSecurityViews.appendText(SiteSecurityViewFactory.ViewType.WARNING, warningText);
+            if (setting_warnings) {
+                warningText += " ";
+                warningText += getResources().getString(R.string.pref_security_access_is_allowed);
+            }
+            mSecurityViews.setText(SiteSecurityViewFactory.ViewType.WARNING, warningText);
+        } else {
+            mSecurityViews.clearText(SiteSecurityViewFactory.ViewType.WARNING);
         }
 
         pref = findPreference("distracting_contents");
@@ -530,13 +553,28 @@
             mBar.getCustomView().setVisibility(View.VISIBLE);
         }
 
+        updateSecurityViewVisibility();
+    }
+
+    private void updateSecurityViewVisibility() {
         if (mSecurityViews.mbEmpty) {
             PreferenceScreen screen = (PreferenceScreen)
                     findPreference("site_specific_prefs");
 
-            pref = findPreference("site_security_info_title");
-            if (pref != null && screen != null) {
-                screen.removePreference(pref);
+            if (mSecurityInfoPrefs == null) {
+                mSecurityInfoPrefs = findPreference("site_security_info_title");
+            }
+
+            if (mSecurityInfoPrefs != null && screen != null) {
+                screen.removePreference(mSecurityInfoPrefs);
+            }
+        } else {
+            PreferenceScreen screen = (PreferenceScreen)
+                    findPreference("site_specific_prefs");
+
+            Preference pref = findPreference("site_security_info_title");
+            if (pref == null && mSecurityInfoPrefs != null) {
+                screen.addPreference(mSecurityInfoPrefs);
             }
         }
 
@@ -636,6 +674,9 @@
                                             refiner.useDefaultPermissionForOrigins(origins);
                                         }
 
+                                        BrowserPreferencesPage.sResultExtra =
+                                                PreferenceKeys.ACTION_RELOAD_PAGE;
+                                        BrowserPreferencesPage.onUrlNeedsReload(mOriginText);
                                         finish();
                                     }
                                 }
@@ -752,6 +793,9 @@
             updateTwoStatePreference(pref,
                     PermissionsServiceFactory.PermissionType.COOKIE, (boolean)objValue);
         }
+        BrowserPreferencesPage.sResultExtra = PreferenceKeys.ACTION_RELOAD_PAGE;
+        BrowserPreferencesPage.onUrlNeedsReload(mOriginText);
+        updatePreferenceInfo();
         return true;
     }
 
@@ -767,6 +811,9 @@
                                     mOriginInfo.clearAllStoredData();
                                     Preference e = findPreference("clear_data");
                                     e.setSummary("(Empty)");
+                                    BrowserPreferencesPage.sResultExtra =
+                                            PreferenceKeys.ACTION_RELOAD_PAGE;
+                                    BrowserPreferencesPage.onUrlNeedsReload(mOriginText);
                                 }
                             }
                         })