1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.browser; 18 19 import java.util.List; 20 import java.util.Map; 21 import java.util.Set; 22 import java.util.Vector; 23 24 import android.content.Intent; 25 import android.net.Uri; 26 import android.os.Bundle; 27 import android.preference.EditTextPreference; 28 import android.preference.ListPreference; 29 import android.preference.Preference; 30 import android.preference.PreferenceActivity; 31 import android.preference.PreferenceScreen; 32 import android.util.Log; 33 import android.webkit.GeolocationPermissions; 34 import android.webkit.ValueCallback; 35 import android.webkit.WebStorage; 36 import android.webkit.WebView; 37 38 public class BrowserPreferencesPage extends PreferenceActivity 39 implements Preference.OnPreferenceChangeListener { 40 41 private String LOGTAG = "BrowserPreferencesPage"; 42 /* package */ static final String CURRENT_PAGE = "currentPage"; 43 44 @Override 45 protected void onCreate(Bundle savedInstanceState) { 46 super.onCreate(savedInstanceState); 47 48 // Load the XML preferences file 49 addPreferencesFromResource(R.xml.browser_preferences); 50 51 Preference e = findPreference(BrowserSettings.PREF_HOMEPAGE); 52 e.setOnPreferenceChangeListener(this); 53 e.setSummary(getPreferenceScreen().getSharedPreferences() 54 .getString(BrowserSettings.PREF_HOMEPAGE, null)); 55 ((BrowserHomepagePreference) e).setCurrentPage( 56 getIntent().getStringExtra(CURRENT_PAGE)); 57 58 e = findPreference(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS); 59 e.setOnPreferenceChangeListener(this); 60 61 e = findPreference(BrowserSettings.PREF_TEXT_SIZE); 62 e.setOnPreferenceChangeListener(this); 63 e.setSummary(getVisualTextSizeName( 64 getPreferenceScreen().getSharedPreferences() 65 .getString(BrowserSettings.PREF_TEXT_SIZE, null)) ); 66 67 e = findPreference(BrowserSettings.PREF_DEFAULT_ZOOM); 68 e.setOnPreferenceChangeListener(this); 69 e.setSummary(getVisualDefaultZoomName( 70 getPreferenceScreen().getSharedPreferences() 71 .getString(BrowserSettings.PREF_DEFAULT_ZOOM, null)) ); 72 73 e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING); 74 e.setOnPreferenceChangeListener(this); 75 76 e = findPreference(BrowserSettings.PREF_CLEAR_HISTORY); 77 e.setOnPreferenceChangeListener(this); 78 79 if (BrowserSettings.getInstance().showDebugSettings()) { 80 addPreferencesFromResource(R.xml.debug_preferences); 81 } 82 83 PreferenceScreen websiteSettings = (PreferenceScreen) 84 findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS); 85 Intent intent = new Intent(this, WebsiteSettingsActivity.class); 86 websiteSettings.setIntent(intent); 87 } 88 89 /* 90 * We need to set the PreferenceScreen state in onResume(), as the number of 91 * origins with active features (WebStorage, Geolocation etc) could have 92 * changed after calling the WebsiteSettingsActivity. 93 */ 94 @Override 95 protected void onResume() { 96 super.onResume(); 97 final PreferenceScreen websiteSettings = (PreferenceScreen) 98 findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS); 99 websiteSettings.setEnabled(false); 100 WebStorage.getInstance().getOrigins(new ValueCallback<Map>() { 101 public void onReceiveValue(Map webStorageOrigins) { 102 if ((webStorageOrigins != null) && !webStorageOrigins.isEmpty()) { 103 websiteSettings.setEnabled(true); 104 } 105 } 106 }); 107 GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() { 108 public void onReceiveValue(Set<String> geolocationOrigins) { 109 if ((geolocationOrigins != null) && !geolocationOrigins.isEmpty()) { 110 websiteSettings.setEnabled(true); 111 } 112 } 113 }); 114 } 115 116 @Override 117 protected void onPause() { 118 super.onPause(); 119 120 // sync the shared preferences back to BrowserSettings 121 BrowserSettings.getInstance().syncSharedPreferences( 122 getPreferenceScreen().getSharedPreferences()); 123 } 124 125 public boolean onPreferenceChange(Preference pref, Object objValue) { 126 if (pref.getKey().equals(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS)) { 127 Boolean value = (Boolean) objValue; 128 if (value.booleanValue() == true) { 129 finish(); 130 } 131 } else if (pref.getKey().equals(BrowserSettings.PREF_HOMEPAGE)) { 132 String value = (String) objValue; 133 boolean needUpdate = value.indexOf(' ') != -1; 134 if (needUpdate) { 135 value = value.trim().replace(" ", "%20"); 136 } 137 if (value.length() != 0 && Uri.parse(value).getScheme() == null) { 138 value = "http://" + value; 139 needUpdate = true; 140 } 141 // Set the summary value. 142 pref.setSummary(value); 143 if (needUpdate) { 144 // Update through the EditText control as it has a cached copy 145 // of the string and it will handle persisting the value 146 ((EditTextPreference) pref).setText(value); 147 148 // as we update the value above, we need to return false 149 // here so that setText() is not called by EditTextPref 150 // with the old value. 151 return false; 152 } else { 153 return true; 154 } 155 } else if (pref.getKey().equals(BrowserSettings.PREF_TEXT_SIZE)) { 156 pref.setSummary(getVisualTextSizeName((String) objValue)); 157 return true; 158 } else if (pref.getKey().equals(BrowserSettings.PREF_DEFAULT_ZOOM)) { 159 pref.setSummary(getVisualDefaultZoomName((String) objValue)); 160 return true; 161 } else if (pref.getKey().equals( 162 BrowserSettings.PREF_DEFAULT_TEXT_ENCODING)) { 163 pref.setSummary((String) objValue); 164 return true; 165 } else if (pref.getKey().equals(BrowserSettings.PREF_CLEAR_HISTORY) 166 && ((Boolean) objValue).booleanValue() == true) { 167 // Need to tell the browser to remove the parent/child relationship 168 // between tabs 169 setResult(RESULT_OK, (new Intent()).putExtra(Intent.EXTRA_TEXT, 170 pref.getKey())); 171 return true; 172 } 173 174 return false; 175 } 176 177 private CharSequence getVisualTextSizeName(String enumName) { 178 CharSequence[] visualNames = getResources().getTextArray( 179 R.array.pref_text_size_choices); 180 CharSequence[] enumNames = getResources().getTextArray( 181 R.array.pref_text_size_values); 182 183 // Sanity check 184 if (visualNames.length != enumNames.length) { 185 return ""; 186 } 187 188 for (int i = 0; i < enumNames.length; i++) { 189 if (enumNames[i].equals(enumName)) { 190 return visualNames[i]; 191 } 192 } 193 194 return ""; 195 } 196 197 private CharSequence getVisualDefaultZoomName(String enumName) { 198 CharSequence[] visualNames = getResources().getTextArray( 199 R.array.pref_default_zoom_choices); 200 CharSequence[] enumNames = getResources().getTextArray( 201 R.array.pref_default_zoom_values); 202 203 // Sanity check 204 if (visualNames.length != enumNames.length) { 205 return ""; 206 } 207 208 for (int i = 0; i < enumNames.length; i++) { 209 if (enumNames[i].equals(enumName)) { 210 return visualNames[i]; 211 } 212 } 213 214 return ""; 215 } 216 } 217