diff options
6 files changed, 248 insertions, 2 deletions
diff --git a/res/xml/privacy_and_security_preferences.xml b/res/xml/privacy_and_security_preferences.xml index d543498c..45e80f24 100644 --- a/res/xml/privacy_and_security_preferences.xml +++ b/res/xml/privacy_and_security_preferences.xml @@ -145,7 +145,7 @@ android:summaryOff="@string/pref_security_not_allowed" android:title="@string/pref_security_accept_cookies" /> - <SwitchPreference + <com.android.browser.BrowserLocationSwitchPreference android:layout="@layout/swe_preference" android:defaultValue="true" android:icon="@drawable/ic_sp_location" diff --git a/res/xml/site_specific_preferences.xml b/res/xml/site_specific_preferences.xml index 63e03b0f..836bb349 100644 --- a/res/xml/site_specific_preferences.xml +++ b/res/xml/site_specific_preferences.xml @@ -74,7 +74,7 @@ android:summaryOff="@string/pref_security_not_allowed" android:title="@string/pref_security_accept_cookies" /> - <ListPreference + <com.android.browser.BrowserLocationListPreference android:layout="@layout/swe_preference" android:widgetLayout="@layout/swe_preference_list_widget" android:icon="@drawable/ic_sp_location" diff --git a/src/com/android/browser/BrowserLocationListPreference.java b/src/com/android/browser/BrowserLocationListPreference.java new file mode 100644 index 00000000..1bff5989 --- /dev/null +++ b/src/com/android/browser/BrowserLocationListPreference.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package com.android.browser; + +import android.content.Context; +import android.content.Intent; +import android.preference.ListPreference; +import android.preference.Preference; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; + +import org.codeaurora.swe.PermissionsServiceFactory; + +public class BrowserLocationListPreference extends ListPreference { + + View mView; + private boolean mSwitchEnabled = true; //internal state tracker + private OnPreferenceClickListener onPreferenceClickListener; + private OnPreferenceChangeListener oldPreferenceChangeListener; + + public BrowserLocationListPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public BrowserLocationListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public BrowserLocationListPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public BrowserLocationListPreference(Context context) { + super(context); + } + + @Override + protected void onBindView(View view) { + super.onBindView(view); + mView = view; + if (oldPreferenceChangeListener == null){ //set it just the first time + oldPreferenceChangeListener = getOnPreferenceChangeListener(); + } + if (mView != null && mSwitchEnabled) { + mView.setAlpha((float) 1.0); + } + else if (mView != null){ + mView.setAlpha((float) 0.5); //Gray out the option + } + } + + @Override + public void onClick(){ + //This shows the popup + if (PermissionsServiceFactory.isSystemLocationEnabled() && mSwitchEnabled) super.onClick(); + else { + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + getContext().startActivity(intent); + }; + } + + @Override + public void setEnabled(boolean enable){ + // setEnabled will not call super.setEnabled(enable) because + // we want to avoid the default behavior entirely. + if (!mSwitchEnabled && enable) { //Transition from off to on + if(mView != null) + mView.setAlpha((float) 1.0); + setOnPreferenceClickListener(onPreferenceClickListener); + setOnPreferenceChangeListener(oldPreferenceChangeListener); + } + else if(!enable && mSwitchEnabled) { //Transition from on to off + if (mView != null) { + mView.setAlpha((float) 0.5); //Gray out the option + } + onPreferenceClickListener = getOnPreferenceClickListener(); + if (oldPreferenceChangeListener == null) //to protect against calling !enable onresume() + oldPreferenceChangeListener = getOnPreferenceChangeListener(); + + // Prevent clicks from registering. + setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return false; // Do Not update + } + }); + } + mSwitchEnabled = enable; + } +} diff --git a/src/com/android/browser/BrowserLocationSwitchPreference.java b/src/com/android/browser/BrowserLocationSwitchPreference.java new file mode 100644 index 00000000..6e57fe25 --- /dev/null +++ b/src/com/android/browser/BrowserLocationSwitchPreference.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +package com.android.browser; + +import android.content.Context; +import android.content.Intent; +import android.preference.Preference; +import android.preference.SwitchPreference; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; + +import org.codeaurora.swe.PermissionsServiceFactory; + +public class BrowserLocationSwitchPreference extends SwitchPreference { + + View mView; + private boolean mSwitchEnabled = true; //internal state tracker + private OnPreferenceClickListener onPreferenceClickListener; + private OnPreferenceChangeListener oldPreferenceChangeListener; + + public BrowserLocationSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public BrowserLocationSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public BrowserLocationSwitchPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public BrowserLocationSwitchPreference(Context context) { + super(context); + } + + @Override + protected void onBindView(View view) { + super.onBindView(view); + mView = view; + if (oldPreferenceChangeListener == null){ //set it just the first time + oldPreferenceChangeListener = getOnPreferenceChangeListener(); + } + if (mView != null && mSwitchEnabled) { + mView.setAlpha((float) 1.0); + } + else if (mView != null){ + mView.setAlpha((float) 0.5); //Gray out the option + } + } + + @Override + public void onClick(){ + //This toggles teh switch + if (PermissionsServiceFactory.isSystemLocationEnabled() && mSwitchEnabled) super.onClick(); + else { + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + getContext().startActivity(intent); + }; + } + + @Override + public void setEnabled(boolean enable){ + // setEnabled will not call super.setEnabled(enable) because + // we want to avoid the default behavior entirely. + if (!mSwitchEnabled && enable) { //Transition from off to on + if(mView != null) + mView.setAlpha((float) 1.0); + setOnPreferenceClickListener(onPreferenceClickListener); + setOnPreferenceChangeListener(oldPreferenceChangeListener); + } + else if(!enable && mSwitchEnabled) { //Transition from on to off + if (mView != null) { + mView.setAlpha((float) 0.5); //Gray out the option + } + onPreferenceClickListener = getOnPreferenceClickListener(); + if (oldPreferenceChangeListener == null) //to protect against calling !enable onresume() + oldPreferenceChangeListener = getOnPreferenceChangeListener(); + + // Prevent clicks from registering. + setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return false; // Do Not update + } + }); + } + mSwitchEnabled = enable; + } +} diff --git a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java index 76c5cedd..6d22f483 100644 --- a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java +++ b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java @@ -16,6 +16,7 @@ package com.android.browser.preferences; +import com.android.browser.BrowserLocationSwitchPreference; import com.android.browser.PreferenceKeys; import com.android.browser.R; import com.android.browser.mdm.DoNotTrackRestriction; @@ -200,10 +201,13 @@ public class PrivacySecurityPreferencesFragment extends SWEPreferenceFragment public void onResume() { super.onResume(); ActionBar bar = getActivity().getActionBar(); + BrowserLocationSwitchPreference pref = + (BrowserLocationSwitchPreference) findPreference(PreferenceKeys.PREF_ENABLE_GEOLOCATION); if (bar != null) { bar.setTitle(R.string.pref_privacy_security_title); bar.setDisplayHomeAsUpEnabled(false); bar.setHomeButtonEnabled(false); } + if ( pref != null) pref.setEnabled(PermissionsServiceFactory.isSystemLocationEnabled()); } } diff --git a/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java b/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java index 9d74329c..7859422e 100644 --- a/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java +++ b/src/com/android/browser/preferences/SiteSpecificPreferencesFragment.java @@ -51,8 +51,11 @@ import android.webkit.ValueCallback; import android.widget.Button; import android.widget.TextView; +import com.android.browser.BrowserLocationListPreference; +import com.android.browser.BrowserLocationSwitchPreference; import com.android.browser.NavigationBarBase; import com.android.browser.PageDialogsHandler; +import com.android.browser.PreferenceKeys; import com.android.browser.R; import org.codeaurora.swe.PermissionsServiceFactory; @@ -473,6 +476,9 @@ public class SiteSpecificPreferencesFragment extends SWEPreferenceFragment @Override public void onResume() { super.onResume(); + BrowserLocationListPreference pref = + (BrowserLocationListPreference) findPreference("select_geolocation"); + if ( pref != null) pref.setEnabled(PermissionsServiceFactory.isSystemLocationEnabled()); if (mBar != null) { mOriginalActionBarOptions = mBar.getDisplayOptions(); mBar.setDisplayHomeAsUpEnabled(false); |