Home | History | Annotate | Download | only in settings
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings;
     18 
     19 
     20 import android.app.Activity;
     21 import android.app.AlertDialog;
     22 import android.app.Dialog;
     23 import android.app.admin.DevicePolicyManager;
     24 import android.content.ActivityNotFoundException;
     25 import android.content.ComponentName;
     26 import android.content.Context;
     27 import android.content.DialogInterface;
     28 import android.content.Intent;
     29 import android.content.pm.PackageManager;
     30 import android.content.res.Resources;
     31 import android.net.ConnectivityManager;
     32 import android.net.NetworkInfo;
     33 import android.net.Uri;
     34 import android.nfc.NfcAdapter;
     35 import android.nfc.NfcManager;
     36 import android.os.Bundle;
     37 import android.os.SystemProperties;
     38 import android.os.UserHandle;
     39 import android.os.UserManager;
     40 import android.preference.Preference;
     41 import android.preference.Preference.OnPreferenceChangeListener;
     42 import android.preference.PreferenceScreen;
     43 import android.preference.SwitchPreference;
     44 import android.provider.SearchIndexableResource;
     45 import android.provider.Settings;
     46 import android.telephony.TelephonyManager;
     47 import android.text.TextUtils;
     48 import android.util.Log;
     49 
     50 import com.android.internal.telephony.SmsApplication;
     51 import com.android.internal.telephony.SmsApplication.SmsApplicationData;
     52 import com.android.internal.telephony.TelephonyIntents;
     53 import com.android.internal.telephony.TelephonyProperties;
     54 import com.android.settings.nfc.NfcEnabler;
     55 import com.android.settings.search.BaseSearchIndexProvider;
     56 import com.android.settings.search.Indexable;
     57 
     58 import java.util.ArrayList;
     59 import java.util.Arrays;
     60 import java.util.Collection;
     61 import java.util.List;
     62 
     63 public class WirelessSettings extends SettingsPreferenceFragment
     64         implements OnPreferenceChangeListener, Indexable {
     65     private static final String TAG = "WirelessSettings";
     66 
     67     private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane";
     68     private static final String KEY_TOGGLE_NFC = "toggle_nfc";
     69     private static final String KEY_WIMAX_SETTINGS = "wimax_settings";
     70     private static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings";
     71     private static final String KEY_VPN_SETTINGS = "vpn_settings";
     72     private static final String KEY_TETHER_SETTINGS = "tether_settings";
     73     private static final String KEY_PROXY_SETTINGS = "proxy_settings";
     74     private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings";
     75     private static final String KEY_MANAGE_MOBILE_PLAN = "manage_mobile_plan";
     76     private static final String KEY_SMS_APPLICATION = "sms_application";
     77     private static final String KEY_TOGGLE_NSD = "toggle_nsd"; //network service discovery
     78     private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
     79 
     80     public static final String EXIT_ECM_RESULT = "exit_ecm_result";
     81     public static final int REQUEST_CODE_EXIT_ECM = 1;
     82 
     83     private AirplaneModeEnabler mAirplaneModeEnabler;
     84     private SwitchPreference mAirplaneModePreference;
     85     private NfcEnabler mNfcEnabler;
     86     private NfcAdapter mNfcAdapter;
     87     private NsdEnabler mNsdEnabler;
     88 
     89     private ConnectivityManager mCm;
     90     private TelephonyManager mTm;
     91     private PackageManager mPm;
     92     private UserManager mUm;
     93 
     94     private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1;
     95     private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage";
     96 
     97     private AppListPreference mSmsApplicationPreference;
     98 
     99     /**
    100      * Invoked on each preference click in this hierarchy, overrides
    101      * PreferenceFragment's implementation.  Used to make sure we track the
    102      * preference click events.
    103      */
    104     @Override
    105     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    106         log("onPreferenceTreeClick: preference=" + preference);
    107         if (preference == mAirplaneModePreference && Boolean.parseBoolean(
    108                 SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
    109             // In ECM mode launch ECM app dialog
    110             startActivityForResult(
    111                 new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
    112                 REQUEST_CODE_EXIT_ECM);
    113             return true;
    114         } else if (preference == findPreference(KEY_MANAGE_MOBILE_PLAN)) {
    115             onManageMobilePlanClick();
    116         }
    117         // Let the intents be launched by the Preference manager
    118         return super.onPreferenceTreeClick(preferenceScreen, preference);
    119     }
    120 
    121     private String mManageMobilePlanMessage;
    122     public void onManageMobilePlanClick() {
    123         log("onManageMobilePlanClick:");
    124         mManageMobilePlanMessage = null;
    125         Resources resources = getActivity().getResources();
    126 
    127         NetworkInfo ni = mCm.getProvisioningOrActiveNetworkInfo();
    128         if (mTm.hasIccCard() && (ni != null)) {
    129             // Check for carrier apps that can handle provisioning first
    130             Intent provisioningIntent = new Intent(TelephonyIntents.ACTION_CARRIER_SETUP);
    131             List<String> carrierPackages =
    132                     mTm.getCarrierPackageNamesForIntent(provisioningIntent);
    133             if (carrierPackages != null && !carrierPackages.isEmpty()) {
    134                 if (carrierPackages.size() != 1) {
    135                     Log.w(TAG, "Multiple matching carrier apps found, launching the first.");
    136                 }
    137                 provisioningIntent.setPackage(carrierPackages.get(0));
    138                 startActivity(provisioningIntent);
    139                 return;
    140             }
    141 
    142             // Get provisioning URL
    143             String url = mCm.getMobileProvisioningUrl();
    144             if (!TextUtils.isEmpty(url)) {
    145                 Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
    146                         Intent.CATEGORY_APP_BROWSER);
    147                 intent.setData(Uri.parse(url));
    148                 intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
    149                         Intent.FLAG_ACTIVITY_NEW_TASK);
    150                 try {
    151                     startActivity(intent);
    152                 } catch (ActivityNotFoundException e) {
    153                     Log.w(TAG, "onManageMobilePlanClick: startActivity failed" + e);
    154                 }
    155             } else {
    156                 // No provisioning URL
    157                 String operatorName = mTm.getSimOperatorName();
    158                 if (TextUtils.isEmpty(operatorName)) {
    159                     // Use NetworkOperatorName as second choice in case there is no
    160                     // SPN (Service Provider Name on the SIM). Such as with T-mobile.
    161                     operatorName = mTm.getNetworkOperatorName();
    162                     if (TextUtils.isEmpty(operatorName)) {
    163                         mManageMobilePlanMessage = resources.getString(
    164                                 R.string.mobile_unknown_sim_operator);
    165                     } else {
    166                         mManageMobilePlanMessage = resources.getString(
    167                                 R.string.mobile_no_provisioning_url, operatorName);
    168                     }
    169                 } else {
    170                     mManageMobilePlanMessage = resources.getString(
    171                             R.string.mobile_no_provisioning_url, operatorName);
    172                 }
    173             }
    174         } else if (mTm.hasIccCard() == false) {
    175             // No sim card
    176             mManageMobilePlanMessage = resources.getString(R.string.mobile_insert_sim_card);
    177         } else {
    178             // NetworkInfo is null, there is no connection
    179             mManageMobilePlanMessage = resources.getString(R.string.mobile_connect_to_internet);
    180         }
    181         if (!TextUtils.isEmpty(mManageMobilePlanMessage)) {
    182             log("onManageMobilePlanClick: message=" + mManageMobilePlanMessage);
    183             showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID);
    184         }
    185     }
    186 
    187     private void initSmsApplicationSetting() {
    188         log("initSmsApplicationSetting:");
    189         Collection<SmsApplicationData> smsApplications =
    190                 SmsApplication.getApplicationCollection(getActivity());
    191 
    192         // If the list is empty the dialog will be empty, but we will not crash.
    193         int count = smsApplications.size();
    194         String[] packageNames = new String[count];
    195         int i = 0;
    196         for (SmsApplicationData smsApplicationData : smsApplications) {
    197             packageNames[i] = smsApplicationData.mPackageName;
    198             i++;
    199         }
    200         String defaultPackageName = null;
    201         ComponentName appName = SmsApplication.getDefaultSmsApplication(getActivity(), true);
    202         if (appName != null) {
    203             defaultPackageName = appName.getPackageName();
    204         }
    205         mSmsApplicationPreference.setPackageNames(packageNames, defaultPackageName);
    206     }
    207 
    208     @Override
    209     public Dialog onCreateDialog(int dialogId) {
    210         log("onCreateDialog: dialogId=" + dialogId);
    211         switch (dialogId) {
    212             case MANAGE_MOBILE_PLAN_DIALOG_ID:
    213                 return new AlertDialog.Builder(getActivity())
    214                             .setMessage(mManageMobilePlanMessage)
    215                             .setCancelable(false)
    216                             .setPositiveButton(com.android.internal.R.string.ok,
    217                                     new DialogInterface.OnClickListener() {
    218                                 @Override
    219                                 public void onClick(DialogInterface dialog, int id) {
    220                                     log("MANAGE_MOBILE_PLAN_DIALOG.onClickListener id=" + id);
    221                                     mManageMobilePlanMessage = null;
    222                                 }
    223                             })
    224                             .create();
    225         }
    226         return super.onCreateDialog(dialogId);
    227     }
    228 
    229     private void log(String s) {
    230         Log.d(TAG, s);
    231     }
    232 
    233     public static boolean isRadioAllowed(Context context, String type) {
    234         if (!AirplaneModeEnabler.isAirplaneModeOn(context)) {
    235             return true;
    236         }
    237         // Here we use the same logic in onCreate().
    238         String toggleable = Settings.Global.getString(context.getContentResolver(),
    239                 Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
    240         return toggleable != null && toggleable.contains(type);
    241     }
    242 
    243     private boolean isSmsSupported() {
    244         // Some tablet has sim card but could not do telephony operations. Skip those.
    245         return mTm.isSmsCapable();
    246     }
    247 
    248     @Override
    249     public void onCreate(Bundle savedInstanceState) {
    250         super.onCreate(savedInstanceState);
    251         if (savedInstanceState != null) {
    252             mManageMobilePlanMessage = savedInstanceState.getString(SAVED_MANAGE_MOBILE_PLAN_MSG);
    253         }
    254         log("onCreate: mManageMobilePlanMessage=" + mManageMobilePlanMessage);
    255 
    256         mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    257         mTm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    258         mPm = getPackageManager();
    259         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
    260 
    261         addPreferencesFromResource(R.xml.wireless_settings);
    262 
    263         final int myUserId = UserHandle.myUserId();
    264         final boolean isSecondaryUser = myUserId != UserHandle.USER_OWNER;
    265         final boolean isRestrictedUser = mUm.getUserInfo(myUserId).isRestricted();
    266 
    267         final Activity activity = getActivity();
    268         mAirplaneModePreference = (SwitchPreference) findPreference(KEY_TOGGLE_AIRPLANE);
    269         SwitchPreference nfc = (SwitchPreference) findPreference(KEY_TOGGLE_NFC);
    270         PreferenceScreen androidBeam = (PreferenceScreen) findPreference(KEY_ANDROID_BEAM_SETTINGS);
    271         SwitchPreference nsd = (SwitchPreference) findPreference(KEY_TOGGLE_NSD);
    272 
    273         mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
    274         mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
    275 
    276         mSmsApplicationPreference = (AppListPreference) findPreference(KEY_SMS_APPLICATION);
    277         // Restricted users cannot currently read/write SMS.
    278         if (isRestrictedUser) {
    279             removePreference(KEY_SMS_APPLICATION);
    280         } else {
    281             mSmsApplicationPreference.setOnPreferenceChangeListener(this);
    282             initSmsApplicationSetting();
    283         }
    284 
    285         // Remove NSD checkbox by default
    286         getPreferenceScreen().removePreference(nsd);
    287         //mNsdEnabler = new NsdEnabler(activity, nsd);
    288 
    289         String toggleable = Settings.Global.getString(activity.getContentResolver(),
    290                 Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
    291 
    292         //enable/disable wimax depending on the value in config.xml
    293         final boolean isWimaxEnabled = !isSecondaryUser && this.getResources().getBoolean(
    294                 com.android.internal.R.bool.config_wimaxEnabled);
    295         if (!isWimaxEnabled
    296                 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
    297             PreferenceScreen root = getPreferenceScreen();
    298             Preference ps = (Preference) findPreference(KEY_WIMAX_SETTINGS);
    299             if (ps != null) root.removePreference(ps);
    300         } else {
    301             if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_WIMAX )
    302                     && isWimaxEnabled) {
    303                 Preference ps = (Preference) findPreference(KEY_WIMAX_SETTINGS);
    304                 ps.setDependency(KEY_TOGGLE_AIRPLANE);
    305             }
    306         }
    307 
    308         // Manually set dependencies for Wifi when not toggleable.
    309         if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_WIFI)) {
    310             findPreference(KEY_VPN_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE);
    311         }
    312         // Disable VPN.
    313         if (isSecondaryUser || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) {
    314             removePreference(KEY_VPN_SETTINGS);
    315         }
    316 
    317         // Manually set dependencies for Bluetooth when not toggleable.
    318         if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_BLUETOOTH)) {
    319             // No bluetooth-dependent items in the list. Code kept in case one is added later.
    320         }
    321 
    322         // Manually set dependencies for NFC when not toggleable.
    323         if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_NFC)) {
    324             findPreference(KEY_TOGGLE_NFC).setDependency(KEY_TOGGLE_AIRPLANE);
    325             findPreference(KEY_ANDROID_BEAM_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE);
    326         }
    327 
    328         // Remove NFC if not available
    329         mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);
    330         if (mNfcAdapter == null) {
    331             getPreferenceScreen().removePreference(nfc);
    332             getPreferenceScreen().removePreference(androidBeam);
    333             mNfcEnabler = null;
    334         }
    335 
    336         // Remove Mobile Network Settings and Manage Mobile Plan for secondary users,
    337         // if it's a wifi-only device, or if the settings are restricted.
    338         if (isSecondaryUser || Utils.isWifiOnly(getActivity())
    339                 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
    340             removePreference(KEY_MOBILE_NETWORK_SETTINGS);
    341             removePreference(KEY_MANAGE_MOBILE_PLAN);
    342         }
    343         // Remove Mobile Network Settings and Manage Mobile Plan
    344         // if config_show_mobile_plan sets false.
    345         final boolean isMobilePlanEnabled = this.getResources().getBoolean(
    346                 R.bool.config_show_mobile_plan);
    347         if (!isMobilePlanEnabled) {
    348             Preference pref = findPreference(KEY_MANAGE_MOBILE_PLAN);
    349             if (pref != null) {
    350                 removePreference(KEY_MANAGE_MOBILE_PLAN);
    351             }
    352         }
    353 
    354         // Remove SMS Application if the device does not support SMS
    355         if (!isSmsSupported()) {
    356             removePreference(KEY_SMS_APPLICATION);
    357         }
    358 
    359         // Remove Airplane Mode settings if it's a stationary device such as a TV.
    360         if (mPm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)) {
    361             removePreference(KEY_TOGGLE_AIRPLANE);
    362         }
    363 
    364         // Enable Proxy selector settings if allowed.
    365         Preference mGlobalProxy = findPreference(KEY_PROXY_SETTINGS);
    366         final DevicePolicyManager mDPM = (DevicePolicyManager)
    367                 activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
    368         // proxy UI disabled until we have better app support
    369         getPreferenceScreen().removePreference(mGlobalProxy);
    370         mGlobalProxy.setEnabled(mDPM.getGlobalProxyAdmin() == null);
    371 
    372         // Disable Tethering if it's not allowed or if it's a wifi-only device
    373         final ConnectivityManager cm =
    374                 (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
    375         if (isSecondaryUser || !cm.isTetheringSupported()
    376                 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING)) {
    377             getPreferenceScreen().removePreference(findPreference(KEY_TETHER_SETTINGS));
    378         } else {
    379             Preference p = findPreference(KEY_TETHER_SETTINGS);
    380             p.setTitle(Utils.getTetheringLabel(cm));
    381 
    382             // Grey out if provisioning is not available.
    383             p.setEnabled(!TetherSettings
    384                     .isProvisioningNeededButUnavailable(getActivity()));
    385         }
    386 
    387         // Enable link to CMAS app settings depending on the value in config.xml.
    388         boolean isCellBroadcastAppLinkEnabled = this.getResources().getBoolean(
    389                 com.android.internal.R.bool.config_cellBroadcastAppLinks);
    390         try {
    391             if (isCellBroadcastAppLinkEnabled) {
    392                 if (mPm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver")
    393                         == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
    394                     isCellBroadcastAppLinkEnabled = false;  // CMAS app disabled
    395                 }
    396             }
    397         } catch (IllegalArgumentException ignored) {
    398             isCellBroadcastAppLinkEnabled = false;  // CMAS app not installed
    399         }
    400         if (isSecondaryUser || !isCellBroadcastAppLinkEnabled
    401                 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
    402             PreferenceScreen root = getPreferenceScreen();
    403             Preference ps = findPreference(KEY_CELL_BROADCAST_SETTINGS);
    404             if (ps != null) root.removePreference(ps);
    405         }
    406     }
    407 
    408     @Override
    409     public void onStart() {
    410         super.onStart();
    411 
    412         initSmsApplicationSetting();
    413     }
    414 
    415     @Override
    416     public void onResume() {
    417         super.onResume();
    418 
    419         mAirplaneModeEnabler.resume();
    420         if (mNfcEnabler != null) {
    421             mNfcEnabler.resume();
    422         }
    423         if (mNsdEnabler != null) {
    424             mNsdEnabler.resume();
    425         }
    426     }
    427 
    428     @Override
    429     public void onSaveInstanceState(Bundle outState) {
    430         super.onSaveInstanceState(outState);
    431 
    432         if (!TextUtils.isEmpty(mManageMobilePlanMessage)) {
    433             outState.putString(SAVED_MANAGE_MOBILE_PLAN_MSG, mManageMobilePlanMessage);
    434         }
    435     }
    436 
    437     @Override
    438     public void onPause() {
    439         super.onPause();
    440 
    441         mAirplaneModeEnabler.pause();
    442         if (mNfcEnabler != null) {
    443             mNfcEnabler.pause();
    444         }
    445         if (mNsdEnabler != null) {
    446             mNsdEnabler.pause();
    447         }
    448     }
    449 
    450     @Override
    451     public void onActivityResult(int requestCode, int resultCode, Intent data) {
    452         if (requestCode == REQUEST_CODE_EXIT_ECM) {
    453             Boolean isChoiceYes = data.getBooleanExtra(EXIT_ECM_RESULT, false);
    454             // Set Airplane mode based on the return value and checkbox state
    455             mAirplaneModeEnabler.setAirplaneModeInECM(isChoiceYes,
    456                     mAirplaneModePreference.isChecked());
    457         }
    458         super.onActivityResult(requestCode, resultCode, data);
    459     }
    460 
    461     @Override
    462     protected int getHelpResource() {
    463         return R.string.help_url_more_networks;
    464     }
    465 
    466     @Override
    467     public boolean onPreferenceChange(Preference preference, Object newValue) {
    468         if (preference == mSmsApplicationPreference && newValue != null) {
    469             SmsApplication.setDefaultApplication(newValue.toString(), getActivity());
    470             return true;
    471         }
    472         return false;
    473     }
    474 
    475     /**
    476      * For Search.
    477      */
    478     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
    479         new BaseSearchIndexProvider() {
    480             @Override
    481             public List<SearchIndexableResource> getXmlResourcesToIndex(
    482                     Context context, boolean enabled) {
    483                 SearchIndexableResource sir = new SearchIndexableResource(context);
    484                 sir.xmlResId = R.xml.wireless_settings;
    485                 return Arrays.asList(sir);
    486             }
    487 
    488             @Override
    489             public List<String> getNonIndexableKeys(Context context) {
    490                 final ArrayList<String> result = new ArrayList<String>();
    491 
    492                 result.add(KEY_TOGGLE_NSD);
    493 
    494                 final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
    495                 final int myUserId = UserHandle.myUserId();
    496                 final boolean isSecondaryUser = myUserId != UserHandle.USER_OWNER;
    497                 final boolean isRestrictedUser = um.getUserInfo(myUserId).isRestricted();
    498                 final boolean isWimaxEnabled = !isSecondaryUser
    499                         && context.getResources().getBoolean(
    500                         com.android.internal.R.bool.config_wimaxEnabled);
    501                 if (!isWimaxEnabled
    502                         || um.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
    503                     result.add(KEY_WIMAX_SETTINGS);
    504                 }
    505 
    506                 if (isSecondaryUser) { // Disable VPN
    507                     result.add(KEY_VPN_SETTINGS);
    508                 }
    509 
    510                 // Remove NFC if not available
    511                 final NfcManager manager = (NfcManager)
    512                         context.getSystemService(Context.NFC_SERVICE);
    513                 if (manager != null) {
    514                     NfcAdapter adapter = manager.getDefaultAdapter();
    515                     if (adapter == null) {
    516                         result.add(KEY_TOGGLE_NFC);
    517                         result.add(KEY_ANDROID_BEAM_SETTINGS);
    518                     }
    519                 }
    520 
    521                 // Remove Mobile Network Settings and Manage Mobile Plan if it's a wifi-only device.
    522                 if (isSecondaryUser || Utils.isWifiOnly(context)) {
    523                     result.add(KEY_MOBILE_NETWORK_SETTINGS);
    524                     result.add(KEY_MANAGE_MOBILE_PLAN);
    525                 }
    526 
    527                 // Remove Mobile Network Settings and Manage Mobile Plan
    528                 // if config_show_mobile_plan sets false.
    529                 final boolean isMobilePlanEnabled = context.getResources().getBoolean(
    530                         R.bool.config_show_mobile_plan);
    531                 if (!isMobilePlanEnabled) {
    532                     result.add(KEY_MANAGE_MOBILE_PLAN);
    533                 }
    534 
    535                 // Remove SMS Application if the device does not support SMS
    536                 TelephonyManager tm =
    537                         (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    538                 if (!tm.isSmsCapable() || isRestrictedUser) {
    539                     result.add(KEY_SMS_APPLICATION);
    540                 }
    541 
    542                 final PackageManager pm = context.getPackageManager();
    543 
    544                 // Remove Airplane Mode settings if it's a stationary device such as a TV.
    545                 if (pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)) {
    546                     result.add(KEY_TOGGLE_AIRPLANE);
    547                 }
    548 
    549                 // proxy UI disabled until we have better app support
    550                 result.add(KEY_PROXY_SETTINGS);
    551 
    552                 // Disable Tethering if it's not allowed or if it's a wifi-only device
    553                 ConnectivityManager cm = (ConnectivityManager)
    554                         context.getSystemService(Context.CONNECTIVITY_SERVICE);
    555                 if (isSecondaryUser || !cm.isTetheringSupported()) {
    556                     result.add(KEY_TETHER_SETTINGS);
    557                 }
    558 
    559                 // Enable link to CMAS app settings depending on the value in config.xml.
    560                 boolean isCellBroadcastAppLinkEnabled = context.getResources().getBoolean(
    561                         com.android.internal.R.bool.config_cellBroadcastAppLinks);
    562                 try {
    563                     if (isCellBroadcastAppLinkEnabled) {
    564                         if (pm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver")
    565                                 == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
    566                             isCellBroadcastAppLinkEnabled = false;  // CMAS app disabled
    567                         }
    568                     }
    569                 } catch (IllegalArgumentException ignored) {
    570                     isCellBroadcastAppLinkEnabled = false;  // CMAS app not installed
    571                 }
    572                 if (isSecondaryUser || !isCellBroadcastAppLinkEnabled) {
    573                     result.add(KEY_CELL_BROADCAST_SETTINGS);
    574                 }
    575 
    576                 return result;
    577             }
    578         };
    579 }
    580