1a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton/* 2a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * Copyright (C) 2010 The Android Open Source Project 3a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * 4a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 5a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * you may not use this file except in compliance with the License. 6a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * You may obtain a copy of the License at 7a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * 8a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 9a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * 10a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * Unless required by applicable law or agreed to in writing, software 11a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 12a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * See the License for the specific language governing permissions and 14a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton * limitations under the License 15a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton */ 16a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 17a9bad830efad4c098e6f874704dedc005958aedfJeff Hamiltonpackage com.android.browser.preferences; 18a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 19961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.app.AlertDialog; 20961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.content.DialogInterface; 21961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.content.DialogInterface.OnClickListener; 22961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.content.res.Resources; 23a9bad830efad4c098e6f874704dedc005958aedfJeff Hamiltonimport android.os.Bundle; 24961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.preference.ListPreference; 25a9bad830efad4c098e6f874704dedc005958aedfJeff Hamiltonimport android.preference.Preference; 26a9bad830efad4c098e6f874704dedc005958aedfJeff Hamiltonimport android.preference.PreferenceFragment; 27af55452d7f37c20201663b80ca77b64457323361Ben Murdochimport android.preference.PreferenceScreen; 28961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.text.InputType; 29961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.text.TextUtils; 30a9bad830efad4c098e6f874704dedc005958aedfJeff Hamiltonimport android.util.Log; 31961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.view.KeyEvent; 32a7dde6b22f08d141642514cca908f1080fd46477Michael Kolbimport android.view.WindowManager; 33961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.view.inputmethod.EditorInfo; 34961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.widget.EditText; 35961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.widget.TextView; 36961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport android.widget.TextView.OnEditorActionListener; 37a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 38b9b2a8290874e447444c7791647cbade915bc47dJohn Reckimport com.android.browser.BrowserPreferencesPage; 39961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport com.android.browser.BrowserSettings; 40b9b2a8290874e447444c7791647cbade915bc47dJohn Reckimport com.android.browser.PreferenceKeys; 41b9b2a8290874e447444c7791647cbade915bc47dJohn Reckimport com.android.browser.R; 42961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport com.android.browser.UrlUtils; 43961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reckimport com.android.browser.homepages.HomeProvider; 44b9b2a8290874e447444c7791647cbade915bc47dJohn Reck 45035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reckpublic class GeneralPreferencesFragment extends PreferenceFragment 46b9b2a8290874e447444c7791647cbade915bc47dJohn Reck implements Preference.OnPreferenceChangeListener { 47961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 48a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton static final String TAG = "PersonalPreferencesFragment"; 49a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 50961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String BLANK_URL = "about:blank"; 51961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String CURRENT = "current"; 52961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String BLANK = "blank"; 53961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String DEFAULT = "default"; 54961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String MOST_VISITED = "most_visited"; 55961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String OTHER = "other"; 56961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 57961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck static final String PREF_HOMEPAGE_PICKER = "homepage_picker"; 58961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 59961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String[] mChoices, mValues; 60961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String mCurrentPage; 61961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 62a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton @Override 63a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton public void onCreate(Bundle savedInstanceState) { 64a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton super.onCreate(savedInstanceState); 65961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck Resources res = getActivity().getResources(); 66961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck mChoices = res.getStringArray(R.array.pref_homepage_choices); 67961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck mValues = res.getStringArray(R.array.pref_homepage_values); 68961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck mCurrentPage = getActivity().getIntent() 69961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck .getStringExtra(BrowserPreferencesPage.CURRENT_PAGE); 70a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 71a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton // Load the XML preferences file 72035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck addPreferencesFromResource(R.xml.general_preferences); 73035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck 74961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck ListPreference pref = (ListPreference) findPreference(PREF_HOMEPAGE_PICKER); 75961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setSummary(getHomepageSummary()); 76961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setPersistent(false); 77961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setValue(getHomepageValue()); 78961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setOnPreferenceChangeListener(this); 79035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck } 80035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck 81035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck @Override 82035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck public boolean onPreferenceChange(Preference pref, Object objValue) { 83035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck if (getActivity() == null) { 84035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck // We aren't attached, so don't accept preferences changes from the 85035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck // invisible UI. 86035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck Log.w("PageContentPreferencesFragment", "onPreferenceChange called from detached fragment!"); 87035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck return false; 88035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck } 89035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck 90961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (pref.getKey().equals(PREF_HOMEPAGE_PICKER)) { 91961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck BrowserSettings settings = BrowserSettings.getInstance(); 92961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (CURRENT.equals(objValue)) { 93961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck settings.setHomePage(mCurrentPage); 94961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 95961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (BLANK.equals(objValue)) { 96961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck settings.setHomePage(BLANK_URL); 97961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 98961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (DEFAULT.equals(objValue)) { 99961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck settings.setHomePage(BrowserSettings.getFactoryResetHomeUrl( 100961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck getActivity())); 101961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 102961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (MOST_VISITED.equals(objValue)) { 103961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck settings.setHomePage(HomeProvider.MOST_VISITED); 104961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 105961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (OTHER.equals(objValue)) { 106961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck promptForHomepage((ListPreference) pref); 107961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return false; 108961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 109961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setSummary(getHomepageSummary()); 110961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck ((ListPreference)pref).setValue(getHomepageValue()); 111961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return false; 112961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 113961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 114961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return true; 115961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 116961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 117961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck void promptForHomepage(final ListPreference pref) { 118961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck final BrowserSettings settings = BrowserSettings.getInstance(); 119961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck final EditText editText = new EditText(getActivity()); 120961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck editText.setInputType(InputType.TYPE_CLASS_TEXT 121961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck | InputType.TYPE_TEXT_VARIATION_URI); 122961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck editText.setText(settings.getHomePage()); 123961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck editText.setSelectAllOnFocus(true); 124961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck editText.setSingleLine(true); 125961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck editText.setImeActionLabel(null, EditorInfo.IME_ACTION_DONE); 126961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck final AlertDialog dialog = new AlertDialog.Builder(getActivity()) 127961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck .setView(editText) 128961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck .setPositiveButton(android.R.string.ok, new OnClickListener() { 129961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck @Override 130961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck public void onClick(DialogInterface dialog, int which) { 131961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String homepage = editText.getText().toString().trim(); 132961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck homepage = UrlUtils.smartUrlFilter(homepage); 133961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck settings.setHomePage(homepage); 134961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setValue(getHomepageValue()); 135961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck pref.setSummary(getHomepageSummary()); 136961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 137961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck }) 138961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck .setNegativeButton(android.R.string.cancel, new OnClickListener() { 139961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck @Override 140961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck public void onClick(DialogInterface dialog, int which) { 141961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck dialog.cancel(); 142961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 143961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck }) 144961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck .setTitle(R.string.pref_set_homepage_to) 145961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck .create(); 146961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck editText.setOnEditorActionListener(new OnEditorActionListener() { 147961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck @Override 148961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 149961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (actionId == EditorInfo.IME_ACTION_DONE) { 150961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); 151961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return true; 152961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 153961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return false; 154961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 155961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck }); 156a7dde6b22f08d141642514cca908f1080fd46477Michael Kolb dialog.getWindow().setSoftInputMode( 157a7dde6b22f08d141642514cca908f1080fd46477Michael Kolb WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 158961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck dialog.show(); 159961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 160961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 161961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String getHomepageValue() { 162961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck BrowserSettings settings = BrowserSettings.getInstance(); 163961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String homepage = settings.getHomePage(); 164961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (TextUtils.isEmpty(homepage) || BLANK_URL.endsWith(homepage)) { 165961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return BLANK; 166961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 167961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (HomeProvider.MOST_VISITED.equals(homepage)) { 168961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return MOST_VISITED; 169961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 170961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String defaultHomepage = BrowserSettings.getFactoryResetHomeUrl( 171961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck getActivity()); 172961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (TextUtils.equals(defaultHomepage, homepage)) { 173961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return DEFAULT; 174961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 175961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (TextUtils.equals(mCurrentPage, homepage)) { 176961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return CURRENT; 177961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 178961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return OTHER; 179961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 180961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck 181961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String getHomepageSummary() { 182961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck BrowserSettings settings = BrowserSettings.getInstance(); 183961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (settings.useMostVisitedHomepage()) { 184961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return getHomepageLabel(MOST_VISITED); 185961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 186961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String homepage = settings.getHomePage(); 187961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (TextUtils.isEmpty(homepage) || BLANK_URL.equals(homepage)) { 188961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return getHomepageLabel(BLANK); 189035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck } 190961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return homepage; 191961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 192035a56419c1d2562be1e86273ebfe4c43c4f0c66John Reck 193961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck String getHomepageLabel(String value) { 194961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck for (int i = 0; i < mValues.length; i++) { 195961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck if (value.equals(mValues[i])) { 196961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return mChoices[i]; 197961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 198961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck } 199961d35d6e9cd58d930d8572b91d7e0c9f928f1e8John Reck return null; 200a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton } 201a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 202a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton @Override 203a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton public void onResume() { 204a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton super.onResume(); 205a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 20645ceccb271fcbf301c7c3d5e0c77ae1e53f28cdaJohn Reck refreshUi(); 207a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton } 208a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton 20945ceccb271fcbf301c7c3d5e0c77ae1e53f28cdaJohn Reck void refreshUi() { 210af55452d7f37c20201663b80ca77b64457323361Ben Murdoch PreferenceScreen autoFillSettings = 21135e9dd6283a2d65687104eb0b3a459c02dcb150bJohn Reck (PreferenceScreen)findPreference(PreferenceKeys.PREF_AUTOFILL_PROFILE); 21235e9dd6283a2d65687104eb0b3a459c02dcb150bJohn Reck autoFillSettings.setDependency(PreferenceKeys.PREF_AUTOFILL_ENABLED); 213a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton } 214a9bad830efad4c098e6f874704dedc005958aedfJeff Hamilton} 215