1925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang/* 2925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * Copyright (C) 2017 The Android Open Source Project 3925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * 4925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * you may not use this file except in compliance with the License. 6925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * You may obtain a copy of the License at 7925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * 8925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * http://www.apache.org/licenses/LICENSE-2.0 9925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * 10925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * Unless required by applicable law or agreed to in writing, software 11925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * See the License for the specific language governing permissions and 14925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang * limitations under the License. 15925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang */ 16925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 17925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhangpackage com.android.settings.wifi; 18925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 19925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhangimport android.content.Context; 20925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhangimport android.provider.Settings; 21925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhangimport android.support.v14.preference.SwitchPreference; 22925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhangimport android.support.v7.preference.Preference; 23925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhangimport android.text.TextUtils; 24925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 251d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport com.android.settings.core.PreferenceControllerMixin; 261d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport com.android.settingslib.core.AbstractPreferenceController; 27925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 28925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang/** 291d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler * {@link AbstractPreferenceController} that controls whether we should fall back to celluar when 301d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler * wifi is bad. 31925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang */ 321d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerpublic class CellularFallbackPreferenceController extends AbstractPreferenceController 331d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler implements PreferenceControllerMixin { 34925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 35925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang private static final String KEY_CELLULAR_FALLBACK = "wifi_cellular_data_fallback"; 36925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 37925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 38925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang public CellularFallbackPreferenceController(Context context) { 39925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang super(context); 40925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 41925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 42925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang @Override 43925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang public boolean isAvailable() { 44925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return !avoidBadWifiConfig(); 45925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 46925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 47925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang @Override 48925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang public String getPreferenceKey() { 49925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return KEY_CELLULAR_FALLBACK; 50925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 51925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 52925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang @Override 53925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang public boolean handlePreferenceTreeClick(Preference preference) { 54925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang if (!TextUtils.equals(preference.getKey(), KEY_CELLULAR_FALLBACK)) { 55925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return false; 56925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 57925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang if (!(preference instanceof SwitchPreference)) { 58925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return false; 59925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 60925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang // On: avoid bad wifi. Off: prompt. 61925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang String settingName = Settings.Global.NETWORK_AVOID_BAD_WIFI; 62925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang Settings.Global.putString(mContext.getContentResolver(), settingName, 63925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang ((SwitchPreference) preference).isChecked() ? "1" : null); 64925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return true; 65925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 66925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 67925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang @Override 68925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang public void updateState(Preference preference) { 69925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang final boolean currentSetting = avoidBadWifiCurrentSettings(); 70925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang // TODO: can this ever be null? The return value of avoidBadWifiConfig() can only 71925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang // change if the resources change, but if that happens the activity will be recreated... 72925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang if (preference != null) { 73925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang SwitchPreference pref = (SwitchPreference) preference; 74925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang pref.setChecked(currentSetting); 75925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 76925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 77925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 78925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang private boolean avoidBadWifiConfig() { 79925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return mContext.getResources().getInteger( 80925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang com.android.internal.R.integer.config_networkAvoidBadWifi) == 1; 81925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 82925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang 83925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang private boolean avoidBadWifiCurrentSettings() { 84925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang return "1".equals(Settings.Global.getString(mContext.getContentResolver(), 85925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang Settings.Global.NETWORK_AVOID_BAD_WIFI)); 86925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang } 87925f23244a5e90e0694a602d4a1f2b5e8b748fefFan Zhang} 88