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}
202