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