diff options
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/preferences/SetHomepagePreference.java')
-rw-r--r-- | mobile/android/base/java/org/mozilla/gecko/preferences/SetHomepagePreference.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/preferences/SetHomepagePreference.java b/mobile/android/base/java/org/mozilla/gecko/preferences/SetHomepagePreference.java new file mode 100644 index 000000000..55be702c4 --- /dev/null +++ b/mobile/android/base/java/org/mozilla/gecko/preferences/SetHomepagePreference.java @@ -0,0 +1,124 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +package org.mozilla.gecko.preferences; + +import org.mozilla.gecko.AboutPages; +import org.mozilla.gecko.GeckoSharedPrefs; +import org.mozilla.gecko.R; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.DialogPreference; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +public class SetHomepagePreference extends DialogPreference { + private static final String DEFAULT_HOMEPAGE = AboutPages.HOME; + + private final SharedPreferences prefs; + + private RadioGroup homepageLayout; + private RadioButton defaultRadio; + private RadioButton userAddressRadio; + private EditText homepageEditText; + + // This is the url that 1) was loaded from prefs or, 2) stored + // when the user pressed the "default homepage" checkbox. + private String storedUrl; + + public SetHomepagePreference(final Context context, final AttributeSet attrs) { + super(context, attrs); + prefs = GeckoSharedPrefs.forProfile(context); + } + + @Override + protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { + // Without this GB devices have a black background to the dialog. + builder.setInverseBackgroundForced(true); + } + + @Override + protected void onBindDialogView(final View view) { + super.onBindDialogView(view); + + homepageLayout = (RadioGroup) view.findViewById(R.id.homepage_layout); + defaultRadio = (RadioButton) view.findViewById(R.id.radio_default); + userAddressRadio = (RadioButton) view.findViewById(R.id.radio_user_address); + homepageEditText = (EditText) view.findViewById(R.id.edittext_user_address); + + storedUrl = prefs.getString(GeckoPreferences.PREFS_HOMEPAGE, DEFAULT_HOMEPAGE); + + homepageLayout.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(final RadioGroup radioGroup, final int checkedId) { + if (checkedId == R.id.radio_user_address) { + homepageEditText.setVisibility(View.VISIBLE); + openKeyboardAndSelectAll(getContext(), homepageEditText); + } else { + homepageEditText.setVisibility(View.GONE); + } + } + }); + setUIState(storedUrl); + } + + private void setUIState(final String url) { + if (isUrlDefaultHomepage(url)) { + defaultRadio.setChecked(true); + } else { + userAddressRadio.setChecked(true); + homepageEditText.setText(url); + } + } + + private boolean isUrlDefaultHomepage(final String url) { + return TextUtils.isEmpty(url) || DEFAULT_HOMEPAGE.equals(url); + } + + private static void openKeyboardAndSelectAll(final Context context, final View viewToFocus) { + viewToFocus.requestFocus(); + viewToFocus.post(new Runnable() { + @Override + public void run() { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(viewToFocus, InputMethodManager.SHOW_IMPLICIT); + // android:selectAllOnFocus doesn't work for the initial focus: + // I'm not sure why. We manually selectAll instead. + if (viewToFocus instanceof EditText) { + ((EditText) viewToFocus).selectAll(); + } + } + }); + } + + @Override + protected void onDialogClosed(final boolean positiveResult) { + super.onDialogClosed(positiveResult); + if (positiveResult) { + final SharedPreferences.Editor editor = prefs.edit(); + final String homePageEditTextValue = homepageEditText.getText().toString(); + final String newPrefValue; + if (homepageLayout.getCheckedRadioButtonId() == R.id.radio_default || + isUrlDefaultHomepage(homePageEditTextValue)) { + newPrefValue = ""; + editor.remove(GeckoPreferences.PREFS_HOMEPAGE); + } else { + newPrefValue = homePageEditTextValue; + editor.putString(GeckoPreferences.PREFS_HOMEPAGE, newPrefValue); + } + editor.apply(); + + if (getOnPreferenceChangeListener() != null) { + getOnPreferenceChangeListener().onPreferenceChange(this, newPrefValue); + } + } + } +} |