Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2006 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.phone;
     18 
     19 import android.app.ActionBar;
     20 import android.app.Activity;
     21 import android.app.DialogFragment;
     22 import android.app.Fragment;
     23 import android.app.FragmentManager;
     24 import android.content.BroadcastReceiver;
     25 import android.content.ComponentName;
     26 import android.content.ContentResolver;
     27 import android.content.Context;
     28 import android.content.Intent;
     29 import android.content.IntentFilter;
     30 import android.content.ServiceConnection;
     31 import android.content.pm.PackageManager;
     32 import android.content.pm.ResolveInfo;
     33 import android.net.Uri;
     34 import android.os.AsyncResult;
     35 import android.os.Bundle;
     36 import android.os.Handler;
     37 import android.os.IBinder;
     38 import android.os.Message;
     39 import android.os.PersistableBundle;
     40 import android.os.UserHandle;
     41 import android.os.UserManager;
     42 import android.preference.ListPreference;
     43 import android.preference.Preference;
     44 import android.preference.PreferenceCategory;
     45 import android.preference.PreferenceFragment;
     46 import android.preference.PreferenceScreen;
     47 import android.preference.SwitchPreference;
     48 import android.provider.Settings;
     49 import android.telecom.PhoneAccountHandle;
     50 import android.telecom.TelecomManager;
     51 import android.telephony.CarrierConfigManager;
     52 import android.telephony.PhoneStateListener;
     53 import android.telephony.ServiceState;
     54 import android.telephony.SubscriptionInfo;
     55 import android.telephony.SubscriptionManager;
     56 import android.telephony.TelephonyManager;
     57 import android.telephony.euicc.EuiccManager;
     58 import android.text.TextUtils;
     59 import android.util.Log;
     60 import android.view.LayoutInflater;
     61 import android.view.MenuItem;
     62 import android.view.View;
     63 import android.view.ViewGroup;
     64 import android.widget.TabHost;
     65 
     66 import com.android.ims.ImsConfig;
     67 import com.android.ims.ImsManager;
     68 import com.android.internal.logging.MetricsLogger;
     69 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
     70 import com.android.internal.telephony.Phone;
     71 import com.android.internal.telephony.PhoneConstants;
     72 import com.android.internal.telephony.PhoneFactory;
     73 import com.android.internal.telephony.TelephonyIntents;
     74 import com.android.phone.settings.PhoneAccountSettingsFragment;
     75 import com.android.settingslib.RestrictedLockUtils;
     76 
     77 
     78 import java.util.ArrayList;
     79 import java.util.Iterator;
     80 import java.util.List;
     81 
     82 /**
     83  * "Mobile network settings" screen.  This screen lets you
     84  * enable/disable mobile data, and control data roaming and other
     85  * network-specific mobile data features.  It's used on non-voice-capable
     86  * tablets as well as regular phone devices.
     87  *
     88  * Note that this Activity is part of the phone app, even though
     89  * you reach it from the "Wireless & Networks" section of the main
     90  * Settings app.  It's not part of the "Call settings" hierarchy that's
     91  * available from the Phone app (see CallFeaturesSetting for that.)
     92  */
     93 
     94 public class MobileNetworkSettings extends Activity  {
     95 
     96     private enum TabState {
     97         NO_TABS, UPDATE, DO_NOTHING
     98     }
     99 
    100     @Override
    101     public void onCreate(Bundle savedInstanceState) {
    102         super.onCreate(savedInstanceState);
    103         setContentView(R.layout.network_setting);
    104 
    105         FragmentManager fragmentManager = getFragmentManager();
    106         Fragment fragment = fragmentManager.findFragmentById(R.id.network_setting_content);
    107         if (fragment == null) {
    108             fragmentManager.beginTransaction()
    109                     .add(R.id.network_setting_content, new MobileNetworkFragment())
    110                     .commit();
    111         }
    112     }
    113 
    114     @Override
    115     public boolean onOptionsItemSelected(final MenuItem item) {
    116         final int itemId = item.getItemId();
    117         switch (itemId) {
    118             // Respond to the action bar's Up/Home button
    119             case android.R.id.home:
    120                 finish();
    121                 return true;
    122         }
    123         return super.onOptionsItemSelected(item);
    124     }
    125 
    126 
    127     /**
    128      * Whether to show the entry point to eUICC settings.
    129      *
    130      * <p>We show the entry point on any device which supports eUICC as long as either the eUICC
    131      * was ever provisioned (that is, at least one profile was ever downloaded onto it), or if
    132      * the user has enabled development mode.
    133      */
    134     public static boolean showEuiccSettings(Context context) {
    135         EuiccManager euiccManager =
    136                 (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
    137         if (!euiccManager.isEnabled()) {
    138             return false;
    139         }
    140         ContentResolver cr = context.getContentResolver();
    141         return Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0
    142                 || Settings.Global.getInt(
    143                 cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
    144     }
    145 
    146     /**
    147      * Whether to show the Enhanced 4G LTE settings.
    148      *
    149      * <p>We show this settings if the VoLTE can be enabled by this device and the carrier app
    150      * doesn't set {@link CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL} to false.
    151      */
    152     public static boolean hideEnhanced4gLteSettings(Context context,
    153                 PersistableBundle carrierConfig) {
    154         return !(ImsManager.isVolteEnabledByPlatform(context)
    155             && ImsManager.isVolteProvisionedOnDevice(context))
    156             || carrierConfig.getBoolean(
    157             CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL);
    158 
    159     }
    160 
    161     public static class MobileNetworkFragment extends PreferenceFragment implements
    162             Preference.OnPreferenceChangeListener, RoamingDialogFragment.RoamingDialogListener {
    163 
    164         // debug data
    165         private static final String LOG_TAG = "NetworkSettings";
    166         private static final boolean DBG = true;
    167         public static final int REQUEST_CODE_EXIT_ECM = 17;
    168 
    169         // Number of active Subscriptions to show tabs
    170         private static final int TAB_THRESHOLD = 2;
    171 
    172         // Number of last phone number digits shown in Euicc Setting tab
    173         private static final int NUM_LAST_PHONE_DIGITS = 4;
    174 
    175         // fragment tag for roaming data dialog
    176         private static final String ROAMING_TAG = "RoamingDialogFragment";
    177 
    178         //String keys for preference lookup
    179         private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key";
    180         private static final String BUTTON_ROAMING_KEY = "button_roaming_key";
    181         private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key";
    182         private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key";
    183         private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte";
    184         private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
    185         private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
    186         private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
    187         private static final String BUTTON_CARRIER_SETTINGS_EUICC_KEY =
    188                 "carrier_settings_euicc_key";
    189         private static final String BUTTON_WIFI_CALLING_KEY = "wifi_calling_key";
    190         private static final String BUTTON_VIDEO_CALLING_KEY = "video_calling_key";
    191         private static final String BUTTON_MOBILE_DATA_ENABLE_KEY = "mobile_data_enable";
    192         private static final String BUTTON_DATA_USAGE_KEY = "data_usage_summary";
    193         private static final String BUTTON_ADVANCED_OPTIONS_KEY = "advanced_options";
    194         private static final String CATEGORY_CALLING_KEY = "calling";
    195         private static final String CATEGORY_GSM_APN_EXPAND_KEY = "category_gsm_apn_key";
    196         private static final String CATEGORY_CDMA_APN_EXPAND_KEY = "category_cdma_apn_key";
    197 
    198         private final BroadcastReceiver mPhoneChangeReceiver = new PhoneChangeReceiver();
    199 
    200         static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE;
    201 
    202         //Information about logical "up" Activity
    203         private static final String UP_ACTIVITY_PACKAGE = "com.android.settings";
    204         private static final String UP_ACTIVITY_CLASS =
    205                 "com.android.settings.Settings$WirelessSettingsActivity";
    206 
    207         //Information that needs to save into Bundle.
    208         private static final String EXPAND_ADVANCED_FIELDS = "expand_advanced_fields";
    209 
    210         private SubscriptionManager mSubscriptionManager;
    211         private TelephonyManager mTelephonyManager;
    212 
    213         //UI objects
    214         private AdvancedOptionsPreference mAdvancedOptions;
    215         private ListPreference mButtonPreferredNetworkMode;
    216         private ListPreference mButtonEnabledNetworks;
    217         private RestrictedSwitchPreference mButtonDataRoam;
    218         private SwitchPreference mButton4glte;
    219         private Preference mLteDataServicePref;
    220         private Preference mEuiccSettingsPref;
    221         private PreferenceCategory mCallingCategory;
    222         private Preference mWiFiCallingPref;
    223         private SwitchPreference mVideoCallingPref;
    224         private NetworkSelectListPreference mButtonNetworkSelect;
    225         private MobileDataPreference mMobileDataPref;
    226         private DataUsagePreference mDataUsagePref;
    227 
    228         private static final String iface = "rmnet0"; //TODO: this will go away
    229         private List<SubscriptionInfo> mActiveSubInfos;
    230 
    231         private UserManager mUm;
    232         private Phone mPhone;
    233         private MyHandler mHandler;
    234         private boolean mOkClicked;
    235         private boolean mExpandAdvancedFields;
    236 
    237         // We assume the the value returned by mTabHost.getCurrentTab() == slotId
    238         private TabHost mTabHost;
    239 
    240         //GsmUmts options and Cdma options
    241         GsmUmtsOptions mGsmUmtsOptions;
    242         CdmaOptions mCdmaOptions;
    243 
    244         private Preference mClickedPreference;
    245         private boolean mShow4GForLTE;
    246         private boolean mIsGlobalCdma;
    247         private boolean mUnavailable;
    248 
    249         private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
    250             /*
    251              * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call
    252              * and depending on TTY mode and TTY support over VoLTE.
    253              * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
    254              * java.lang.String)
    255              */
    256             @Override
    257             public void onCallStateChanged(int state, String incomingNumber) {
    258                 if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
    259 
    260                 Activity activity = getActivity();
    261                 if (activity == null) {
    262                     return;
    263                 }
    264 
    265                 int subId = mPhone != null
    266                         ? mPhone.getSubId() : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    267                 PersistableBundle carrierConfig =
    268                         PhoneGlobals.getInstance().getCarrierConfigForSubId(subId);
    269                 boolean enabled = is4gLtePrefEnabled(activity.getApplicationContext(),
    270                         carrierConfig);
    271                 Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
    272                 if (pref != null) pref.setEnabled(enabled && hasActiveSubscriptions());
    273 
    274             }
    275         };
    276 
    277         /**
    278          * Service connection code for the NetworkQueryService.
    279          * Handles the work of binding to a local object so that we can make
    280          * the appropriate service calls.
    281          */
    282 
    283         /** Local service interface */
    284         private INetworkQueryService mNetworkQueryService = null;
    285 
    286         private void setNetworkQueryService() {
    287             mButtonNetworkSelect = (NetworkSelectListPreference) getPreferenceScreen()
    288                     .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY);
    289             if (mButtonNetworkSelect != null) {
    290                 mButtonNetworkSelect.setNetworkQueryService(mNetworkQueryService);
    291             }
    292 
    293         }
    294         /** Service connection */
    295         private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() {
    296 
    297             /** Handle the task of binding the local object to the service */
    298             public void onServiceConnected(ComponentName className, IBinder service) {
    299                 if (DBG) log("connection created, binding local service.");
    300                 mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
    301                 setNetworkQueryService();
    302             }
    303 
    304             /** Handle the task of cleaning up the local binding */
    305             public void onServiceDisconnected(ComponentName className) {
    306                 if (DBG) log("connection disconnected, cleaning local binding.");
    307                 mNetworkQueryService = null;
    308                 setNetworkQueryService();
    309             }
    310         };
    311 
    312         private void bindNetworkQueryService() {
    313             getContext().startService(new Intent(getContext(), NetworkQueryService.class));
    314             getContext().bindService(new Intent(getContext(), NetworkQueryService.class).setAction(
    315                         NetworkQueryService.ACTION_LOCAL_BINDER),
    316                         mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE);
    317         }
    318 
    319         private void unbindNetworkQueryService() {
    320             // unbind the service.
    321             getContext().unbindService(mNetworkQueryServiceConnection);
    322         }
    323 
    324         @Override
    325         public void onPositiveButtonClick(DialogFragment dialog) {
    326             mPhone.setDataRoamingEnabled(true);
    327             mButtonDataRoam.setChecked(true);
    328         }
    329 
    330         @Override
    331         public void onViewCreated(View view, Bundle savedInstanceState) {
    332             if (getListView() != null) {
    333                 getListView().setDivider(null);
    334             }
    335         }
    336 
    337         /**
    338          * Invoked on each preference click in this hierarchy, overrides
    339          * PreferenceActivity's implementation.  Used to make sure we track the
    340          * preference click events.
    341          */
    342         @Override
    343         public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
    344                                              Preference preference) {
    345             sendMetricsEventPreferenceClicked(preferenceScreen, preference);
    346 
    347             /** TODO: Refactor and get rid of the if's using subclasses */
    348             final int phoneSubId = mPhone.getSubId();
    349             if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
    350                 return true;
    351             } else if (mGsmUmtsOptions != null &&
    352                     mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
    353                 return true;
    354             } else if (mCdmaOptions != null &&
    355                     mCdmaOptions.preferenceTreeClick(preference) == true) {
    356                 if (mPhone.isInEcm()) {
    357 
    358                     mClickedPreference = preference;
    359 
    360                     // In ECM mode launch ECM app dialog
    361                     startActivityForResult(
    362                             new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
    363                             REQUEST_CODE_EXIT_ECM);
    364                 }
    365                 return true;
    366             } else if (preference == mButtonPreferredNetworkMode) {
    367                 //displays the value taken from the Settings.System
    368                 int settingsNetworkMode = android.provider.Settings.Global.getInt(
    369                         mPhone.getContext().getContentResolver(),
    370                         android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
    371                         preferredNetworkMode);
    372                 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
    373                 return true;
    374             } else if (preference == mLteDataServicePref) {
    375                 String tmpl = android.provider.Settings.Global.getString(
    376                         getActivity().getContentResolver(),
    377                         android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
    378                 if (!TextUtils.isEmpty(tmpl)) {
    379                     String imsi = mTelephonyManager.getSubscriberId();
    380                     if (imsi == null) {
    381                         imsi = "";
    382                     }
    383                     final String url = TextUtils.isEmpty(tmpl) ? null
    384                             : TextUtils.expandTemplate(tmpl, imsi).toString();
    385                     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    386                     startActivity(intent);
    387                 } else {
    388                     android.util.Log.e(LOG_TAG, "Missing SETUP_PREPAID_DATA_SERVICE_URL");
    389                 }
    390                 return true;
    391             }  else if (preference == mButtonEnabledNetworks) {
    392                 int settingsNetworkMode = android.provider.Settings.Global.getInt(
    393                         mPhone.getContext().getContentResolver(),
    394                         android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
    395                         preferredNetworkMode);
    396                 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
    397                 return true;
    398             } else if (preference == mButtonDataRoam) {
    399                 // Do not disable the preference screen if the user clicks Data roaming.
    400                 return true;
    401             } else if (preference == mEuiccSettingsPref) {
    402                 Intent intent = new Intent(EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS);
    403                 startActivity(intent);
    404                 return true;
    405             } else if (preference == mWiFiCallingPref || preference == mVideoCallingPref
    406                     || preference == mMobileDataPref || preference == mDataUsagePref) {
    407                 return false;
    408             } else if (preference == mAdvancedOptions) {
    409                 mExpandAdvancedFields = true;
    410                 updateBody();
    411                 return true;
    412             } else {
    413                 // if the button is anything but the simple toggle preference,
    414                 // we'll need to disable all preferences to reject all click
    415                 // events until the sub-activity's UI comes up.
    416                 preferenceScreen.setEnabled(false);
    417                 // Let the intents be launched by the Preference manager
    418                 return false;
    419             }
    420         }
    421 
    422         private final SubscriptionManager.OnSubscriptionsChangedListener
    423                 mOnSubscriptionsChangeListener
    424                 = new SubscriptionManager.OnSubscriptionsChangedListener() {
    425             @Override
    426             public void onSubscriptionsChanged() {
    427                 if (DBG) log("onSubscriptionsChanged:");
    428                 initializeSubscriptions();
    429             }
    430         };
    431 
    432         private void initializeSubscriptions() {
    433             final Activity activity = getActivity();
    434             if (activity == null || activity.isDestroyed()) {
    435                 // Process preferences in activity only if its not destroyed
    436                 return;
    437             }
    438             int currentTab = 0;
    439             if (DBG) log("initializeSubscriptions:+");
    440 
    441             // Before updating the the active subscription list check
    442             // if tab updating is needed as the list is changing.
    443             List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
    444             MobileNetworkSettings.TabState state = isUpdateTabsNeeded(sil);
    445 
    446             // Update to the active subscription list
    447             mActiveSubInfos.clear();
    448             if (sil != null) {
    449                 mActiveSubInfos.addAll(sil);
    450                 // If there is only 1 sim then currenTab should represent slot no. of the sim.
    451                 if (sil.size() == 1) {
    452                     currentTab = sil.get(0).getSimSlotIndex();
    453                 }
    454             }
    455 
    456             switch (state) {
    457                 case UPDATE: {
    458                     if (DBG) log("initializeSubscriptions: UPDATE");
    459                     currentTab = mTabHost != null ? mTabHost.getCurrentTab() : 0;
    460 
    461                     mTabHost = (TabHost) getActivity().findViewById(android.R.id.tabhost);
    462                     mTabHost.setup();
    463 
    464                     // Update the tabName. Since the mActiveSubInfos are in slot order
    465                     // we can iterate though the tabs and subscription info in one loop. But
    466                     // we need to handle the case where a slot may be empty.
    467 
    468                     Iterator<SubscriptionInfo> siIterator = mActiveSubInfos.listIterator();
    469                     SubscriptionInfo si = siIterator.hasNext() ? siIterator.next() : null;
    470                     for (int simSlotIndex = 0; simSlotIndex  < mActiveSubInfos.size();
    471                          simSlotIndex++) {
    472                         String tabName;
    473                         if (si != null && si.getSimSlotIndex() == simSlotIndex) {
    474                             // Slot is not empty and we match
    475                             tabName = String.valueOf(si.getDisplayName());
    476                             si = siIterator.hasNext() ? siIterator.next() : null;
    477                         } else {
    478                             // Slot is empty, set name to unknown
    479                             tabName = getResources().getString(R.string.unknown);
    480                         }
    481                         if (DBG) {
    482                             log("initializeSubscriptions:tab=" + simSlotIndex + " name=" + tabName);
    483                         }
    484 
    485                         mTabHost.addTab(buildTabSpec(String.valueOf(simSlotIndex), tabName));
    486                     }
    487 
    488                     mTabHost.setOnTabChangedListener(mTabListener);
    489                     mTabHost.setCurrentTab(currentTab);
    490                     break;
    491                 }
    492                 case NO_TABS: {
    493                     if (DBG) log("initializeSubscriptions: NO_TABS");
    494 
    495                     if (mTabHost != null) {
    496                         mTabHost.clearAllTabs();
    497                         mTabHost = null;
    498                     }
    499                     break;
    500                 }
    501                 case DO_NOTHING: {
    502                     if (DBG) log("initializeSubscriptions: DO_NOTHING");
    503                     if (mTabHost != null) {
    504                         currentTab = mTabHost.getCurrentTab();
    505                     }
    506                     break;
    507                 }
    508             }
    509             updatePhone(currentTab);
    510             updateBody();
    511             if (DBG) log("initializeSubscriptions:-");
    512         }
    513 
    514         private MobileNetworkSettings.TabState isUpdateTabsNeeded(List<SubscriptionInfo> newSil) {
    515             TabState state = MobileNetworkSettings.TabState.DO_NOTHING;
    516             if (newSil == null) {
    517                 if (mActiveSubInfos.size() >= TAB_THRESHOLD) {
    518                     if (DBG) log("isUpdateTabsNeeded: NO_TABS, size unknown and was tabbed");
    519                     state = MobileNetworkSettings.TabState.NO_TABS;
    520                 }
    521             } else if (newSil.size() < TAB_THRESHOLD && mActiveSubInfos.size() >= TAB_THRESHOLD) {
    522                 if (DBG) log("isUpdateTabsNeeded: NO_TABS, size went to small");
    523                 state = MobileNetworkSettings.TabState.NO_TABS;
    524             } else if (newSil.size() >= TAB_THRESHOLD && mActiveSubInfos.size() < TAB_THRESHOLD) {
    525                 if (DBG) log("isUpdateTabsNeeded: UPDATE, size changed");
    526                 state = MobileNetworkSettings.TabState.UPDATE;
    527             } else if (newSil.size() >= TAB_THRESHOLD) {
    528                 Iterator<SubscriptionInfo> siIterator = mActiveSubInfos.iterator();
    529                 for(SubscriptionInfo newSi : newSil) {
    530                     SubscriptionInfo curSi = siIterator.next();
    531                     if (!newSi.getDisplayName().equals(curSi.getDisplayName())) {
    532                         if (DBG) log("isUpdateTabsNeeded: UPDATE, new name="
    533                                 + newSi.getDisplayName());
    534                         state = MobileNetworkSettings.TabState.UPDATE;
    535                         break;
    536                     }
    537                 }
    538             }
    539             if (DBG) {
    540                 Log.i(LOG_TAG, "isUpdateTabsNeeded:- " + state
    541                         + " newSil.size()=" + ((newSil != null) ? newSil.size() : 0)
    542                         + " mActiveSubInfos.size()=" + mActiveSubInfos.size());
    543             }
    544             return state;
    545         }
    546 
    547         private TabHost.OnTabChangeListener mTabListener = new TabHost.OnTabChangeListener() {
    548             @Override
    549             public void onTabChanged(String tabId) {
    550                 if (DBG) log("onTabChanged:");
    551                 // The User has changed tab; update the body.
    552                 updatePhone(Integer.parseInt(tabId));
    553                 updateBody();
    554             }
    555         };
    556 
    557         private void updatePhone(int slotId) {
    558             final SubscriptionInfo sir = mSubscriptionManager
    559                     .getActiveSubscriptionInfoForSimSlotIndex(slotId);
    560             if (sir != null) {
    561                 mPhone = PhoneFactory.getPhone(
    562                         SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
    563             }
    564             if (mPhone == null) {
    565                 // Do the best we can
    566                 mPhone = PhoneGlobals.getPhone();
    567             }
    568             Log.i(LOG_TAG, "updatePhone:- slotId=" + slotId + " sir=" + sir);
    569         }
    570 
    571         private TabHost.TabContentFactory mEmptyTabContent = new TabHost.TabContentFactory() {
    572             @Override
    573             public View createTabContent(String tag) {
    574                 return new View(mTabHost.getContext());
    575             }
    576         };
    577 
    578         private TabHost.TabSpec buildTabSpec(String tag, String title) {
    579             return mTabHost.newTabSpec(tag).setIndicator(title).setContent(
    580                     mEmptyTabContent);
    581         }
    582 
    583         @Override
    584         public void onSaveInstanceState(Bundle outState) {
    585             super.onSaveInstanceState(outState);
    586 
    587             // If advanced fields are already expanded, we save it and expand it
    588             // when it's re-created.
    589             outState.putBoolean(EXPAND_ADVANCED_FIELDS, mExpandAdvancedFields);
    590         }
    591 
    592         @Override
    593         public void onCreate(Bundle icicle) {
    594             Log.i(LOG_TAG, "onCreate:+");
    595             super.onCreate(icicle);
    596 
    597             final Activity activity = getActivity();
    598             if (activity == null || activity.isDestroyed()) {
    599                 Log.e(LOG_TAG, "onCreate:- with no valid activity.");
    600                 return;
    601             }
    602 
    603             mHandler = new MyHandler();
    604             mUm = (UserManager) activity.getSystemService(Context.USER_SERVICE);
    605             mSubscriptionManager = SubscriptionManager.from(activity);
    606             mTelephonyManager = (TelephonyManager) activity.getSystemService(
    607                             Context.TELEPHONY_SERVICE);
    608 
    609             if (icicle != null) {
    610                 mExpandAdvancedFields = icicle.getBoolean(EXPAND_ADVANCED_FIELDS, false);
    611             }
    612 
    613             bindNetworkQueryService();
    614 
    615             if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
    616                 mUnavailable = true;
    617                 activity.setContentView(R.layout.telephony_disallowed_preference_screen);
    618                 return;
    619             }
    620 
    621             addPreferencesFromResource(R.xml.network_setting_fragment);
    622 
    623             mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
    624             mButton4glte.setOnPreferenceChangeListener(this);
    625 
    626             mCallingCategory = (PreferenceCategory) findPreference(CATEGORY_CALLING_KEY);
    627             mWiFiCallingPref = findPreference(BUTTON_WIFI_CALLING_KEY);
    628             mVideoCallingPref = (SwitchPreference) findPreference(BUTTON_VIDEO_CALLING_KEY);
    629             mMobileDataPref = (MobileDataPreference) findPreference(BUTTON_MOBILE_DATA_ENABLE_KEY);
    630             mDataUsagePref = (DataUsagePreference) findPreference(BUTTON_DATA_USAGE_KEY);
    631 
    632             try {
    633                 Context con = activity.createPackageContext("com.android.systemui", 0);
    634                 int id = con.getResources().getIdentifier("config_show4GForLTE",
    635                         "bool", "com.android.systemui");
    636                 mShow4GForLTE = con.getResources().getBoolean(id);
    637             } catch (PackageManager.NameNotFoundException e) {
    638                 Log.e(LOG_TAG, "NameNotFoundException for show4GFotLTE");
    639                 mShow4GForLTE = false;
    640             }
    641 
    642             //get UI object references
    643             PreferenceScreen prefSet = getPreferenceScreen();
    644 
    645             mButtonDataRoam = (RestrictedSwitchPreference) prefSet.findPreference(
    646                     BUTTON_ROAMING_KEY);
    647             mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference(
    648                     BUTTON_PREFERED_NETWORK_MODE);
    649             mButtonEnabledNetworks = (ListPreference) prefSet.findPreference(
    650                     BUTTON_ENABLED_NETWORKS_KEY);
    651             mAdvancedOptions = (AdvancedOptionsPreference) prefSet.findPreference(
    652                     BUTTON_ADVANCED_OPTIONS_KEY);
    653             mButtonDataRoam.setOnPreferenceChangeListener(this);
    654 
    655             mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY);
    656 
    657             mEuiccSettingsPref = prefSet.findPreference(BUTTON_CARRIER_SETTINGS_EUICC_KEY);
    658             mEuiccSettingsPref.setOnPreferenceChangeListener(this);
    659 
    660             // Initialize mActiveSubInfo
    661             int max = mSubscriptionManager.getActiveSubscriptionInfoCountMax();
    662             mActiveSubInfos = new ArrayList<SubscriptionInfo>(max);
    663 
    664             IntentFilter intentFilter = new IntentFilter(
    665                     TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
    666             activity.registerReceiver(mPhoneChangeReceiver, intentFilter);
    667 
    668             Log.i(LOG_TAG, "onCreate:-");
    669         }
    670 
    671         @Override
    672         public View onCreateView(LayoutInflater inflater, ViewGroup container,
    673                 Bundle savedInstanceState) {
    674             return inflater.inflate(com.android.internal.R.layout.common_tab_settings,
    675                     container, false);
    676         }
    677 
    678         @Override
    679         public void onActivityCreated(Bundle savedInstanceState) {
    680             super.onActivityCreated(savedInstanceState);
    681             initializeSubscriptions();
    682         }
    683 
    684         private class PhoneChangeReceiver extends BroadcastReceiver {
    685             @Override
    686             public void onReceive(Context context, Intent intent) {
    687                 Log.i(LOG_TAG, "onReceive:");
    688                 // When the radio changes (ex: CDMA->GSM), refresh all options.
    689                 updateBody();
    690             }
    691         }
    692 
    693         @Override
    694         public void onDestroy() {
    695             unbindNetworkQueryService();
    696             super.onDestroy();
    697             if (getActivity() != null) {
    698                 getActivity().unregisterReceiver(mPhoneChangeReceiver);
    699             }
    700         }
    701 
    702         @Override
    703         public void onResume() {
    704             super.onResume();
    705             Log.i(LOG_TAG, "onResume:+");
    706 
    707             if (mUnavailable) {
    708                 Log.i(LOG_TAG, "onResume:- ignore mUnavailable == false");
    709                 return;
    710             }
    711 
    712             final Activity activity = getActivity();
    713             if (activity == null || activity.isDestroyed()) {
    714                 Log.e(LOG_TAG, "onResume:- with no valid activity.");
    715                 return;
    716             }
    717             // upon resumption from the sub-activity, make sure we re-enable the
    718             // preferences.
    719             getPreferenceScreen().setEnabled(true);
    720 
    721             // Set UI state in onResume because a user could go home, launch some
    722             // app to change this setting's backend, and re-launch this settings app
    723             // and the UI state would be inconsistent with actual state
    724             mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
    725 
    726             if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null
    727                     || getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null)  {
    728                 updatePreferredNetworkUIFromDb();
    729             }
    730 
    731             if (ImsManager.isVolteEnabledByPlatform(activity)
    732                     && ImsManager.isVolteProvisionedOnDevice(activity)) {
    733                 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    734             }
    735 
    736             // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
    737             boolean enh4glteMode = ImsManager.isEnhanced4gLteModeSettingEnabledByUser(activity)
    738                     && ImsManager.isNonTtyOrTtyOnVolteEnabled(activity);
    739             mButton4glte.setChecked(enh4glteMode);
    740 
    741             // Video calling and WiFi calling state might have changed.
    742             updateCallingCategory();
    743 
    744             mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
    745 
    746             Log.i(LOG_TAG, "onResume:-");
    747 
    748         }
    749 
    750         private boolean hasActiveSubscriptions() {
    751             return mActiveSubInfos.size() > 0;
    752         }
    753 
    754         private void updateBodyBasicFields(Activity activity, PreferenceScreen prefSet,
    755                 int phoneSubId, boolean hasActiveSubscriptions) {
    756             Context context = activity.getApplicationContext();
    757 
    758             ActionBar actionBar = activity.getActionBar();
    759             if (actionBar != null) {
    760                 // android.R.id.home will be triggered in onOptionsItemSelected()
    761                 actionBar.setDisplayHomeAsUpEnabled(true);
    762             }
    763 
    764             prefSet.addPreference(mMobileDataPref);
    765             prefSet.addPreference(mButtonDataRoam);
    766             prefSet.addPreference(mDataUsagePref);
    767 
    768             // Customized preferences needs to be initialized with subId.
    769             mMobileDataPref.initialize(phoneSubId);
    770             mDataUsagePref.initialize(phoneSubId);
    771 
    772             mMobileDataPref.setEnabled(hasActiveSubscriptions);
    773             mButtonDataRoam.setEnabled(hasActiveSubscriptions);
    774             mDataUsagePref.setEnabled(hasActiveSubscriptions);
    775 
    776             // Initialize states of mButtonDataRoam.
    777             mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
    778             mButtonDataRoam.setDisabledByAdmin(false);
    779             if (mButtonDataRoam.isEnabled()) {
    780                 if (RestrictedLockUtils.hasBaseUserRestriction(context,
    781                         UserManager.DISALLOW_DATA_ROAMING, UserHandle.myUserId())) {
    782                     mButtonDataRoam.setEnabled(false);
    783                 } else {
    784                     mButtonDataRoam.checkRestrictionAndSetDisabled(
    785                             UserManager.DISALLOW_DATA_ROAMING);
    786                 }
    787             }
    788         }
    789 
    790         private void updateBody() {
    791             final Activity activity = getActivity();
    792             final PreferenceScreen prefSet = getPreferenceScreen();
    793             final int phoneSubId = mPhone.getSubId();
    794             final boolean hasActiveSubscriptions = hasActiveSubscriptions();
    795 
    796             if (activity == null || activity.isDestroyed()) {
    797                 Log.e(LOG_TAG, "updateBody with no valid activity.");
    798                 return;
    799             }
    800 
    801             if (prefSet == null) {
    802                 Log.e(LOG_TAG, "updateBody with no null prefSet.");
    803                 return;
    804             }
    805 
    806             prefSet.removeAll();
    807 
    808             updateBodyBasicFields(activity, prefSet, phoneSubId, hasActiveSubscriptions);
    809 
    810             if (mExpandAdvancedFields) {
    811                 updateBodyAdvancedFields(activity, prefSet, phoneSubId, hasActiveSubscriptions);
    812             } else {
    813                 prefSet.addPreference(mAdvancedOptions);
    814             }
    815         }
    816 
    817         private void updateBodyAdvancedFields(Activity activity, PreferenceScreen prefSet,
    818                 int phoneSubId, boolean hasActiveSubscriptions) {
    819             boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
    820 
    821             if (DBG) {
    822                 log("updateBody: isLteOnCdma=" + isLteOnCdma + " phoneSubId=" + phoneSubId);
    823             }
    824 
    825             prefSet.addPreference(mButtonPreferredNetworkMode);
    826             prefSet.addPreference(mButtonEnabledNetworks);
    827             prefSet.addPreference(mButton4glte);
    828 
    829             if (showEuiccSettings(getActivity())) {
    830                 prefSet.addPreference(mEuiccSettingsPref);
    831                 String spn = mTelephonyManager.getSimOperatorName();
    832                 if (TextUtils.isEmpty(spn)) {
    833                     mEuiccSettingsPref.setSummary(null);
    834                 } else {
    835                     mEuiccSettingsPref.setSummary(spn);
    836                 }
    837             }
    838 
    839             int settingsNetworkMode = android.provider.Settings.Global.getInt(
    840                     mPhone.getContext().getContentResolver(),
    841                     android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
    842                     preferredNetworkMode);
    843 
    844             PersistableBundle carrierConfig =
    845                     PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
    846             mIsGlobalCdma = isLteOnCdma
    847                     && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
    848             if (carrierConfig.getBoolean(
    849                     CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) {
    850                 prefSet.removePreference(mButtonPreferredNetworkMode);
    851                 prefSet.removePreference(mButtonEnabledNetworks);
    852                 prefSet.removePreference(mLteDataServicePref);
    853             } else if (carrierConfig.getBoolean(CarrierConfigManager
    854                     .KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL)
    855                     && !mPhone.getServiceState().getRoaming()
    856                     && mPhone.getServiceState().getDataRegState()
    857                     == ServiceState.STATE_IN_SERVICE) {
    858                 prefSet.removePreference(mButtonPreferredNetworkMode);
    859                 prefSet.removePreference(mButtonEnabledNetworks);
    860 
    861                 final int phoneType = mPhone.getPhoneType();
    862                 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
    863                     updateCdmaOptions(this, prefSet, mPhone);
    864                 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
    865                     updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService);
    866                 } else {
    867                     throw new IllegalStateException("Unexpected phone type: " + phoneType);
    868                 }
    869                 // Since pref is being hidden from user, set network mode to default
    870                 // in case it is currently something else. That is possible if user
    871                 // changed the setting while roaming and is now back to home network.
    872                 settingsNetworkMode = preferredNetworkMode;
    873             } else if (carrierConfig.getBoolean(
    874                     CarrierConfigManager.KEY_WORLD_PHONE_BOOL) == true) {
    875                 prefSet.removePreference(mButtonEnabledNetworks);
    876                 // set the listener for the mButtonPreferredNetworkMode list preference so we can issue
    877                 // change Preferred Network Mode.
    878                 mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this);
    879 
    880                 updateCdmaOptions(this, prefSet, mPhone);
    881                 updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService);
    882             } else {
    883                 prefSet.removePreference(mButtonPreferredNetworkMode);
    884                 final int phoneType = mPhone.getPhoneType();
    885                 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
    886                     int lteForced = android.provider.Settings.Global.getInt(
    887                             mPhone.getContext().getContentResolver(),
    888                             android.provider.Settings.Global.LTE_SERVICE_FORCED + mPhone.getSubId(),
    889                             0);
    890 
    891                     if (isLteOnCdma) {
    892                         if (lteForced == 0) {
    893                             mButtonEnabledNetworks.setEntries(
    894                                     R.array.enabled_networks_cdma_choices);
    895                             mButtonEnabledNetworks.setEntryValues(
    896                                     R.array.enabled_networks_cdma_values);
    897                         } else {
    898                             switch (settingsNetworkMode) {
    899                                 case Phone.NT_MODE_CDMA:
    900                                 case Phone.NT_MODE_CDMA_NO_EVDO:
    901                                 case Phone.NT_MODE_EVDO_NO_CDMA:
    902                                     mButtonEnabledNetworks.setEntries(
    903                                             R.array.enabled_networks_cdma_no_lte_choices);
    904                                     mButtonEnabledNetworks.setEntryValues(
    905                                             R.array.enabled_networks_cdma_no_lte_values);
    906                                     break;
    907                                 case Phone.NT_MODE_GLOBAL:
    908                                 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
    909                                 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
    910                                 case Phone.NT_MODE_LTE_ONLY:
    911                                     mButtonEnabledNetworks.setEntries(
    912                                             R.array.enabled_networks_cdma_only_lte_choices);
    913                                     mButtonEnabledNetworks.setEntryValues(
    914                                             R.array.enabled_networks_cdma_only_lte_values);
    915                                     break;
    916                                 default:
    917                                     mButtonEnabledNetworks.setEntries(
    918                                             R.array.enabled_networks_cdma_choices);
    919                                     mButtonEnabledNetworks.setEntryValues(
    920                                             R.array.enabled_networks_cdma_values);
    921                                     break;
    922                             }
    923                         }
    924                     }
    925                     updateCdmaOptions(this, prefSet, mPhone);
    926 
    927                 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
    928                     if (isSupportTdscdma()) {
    929                         mButtonEnabledNetworks.setEntries(
    930                                 R.array.enabled_networks_tdscdma_choices);
    931                         mButtonEnabledNetworks.setEntryValues(
    932                                 R.array.enabled_networks_tdscdma_values);
    933                     } else if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)
    934                             && !getResources().getBoolean(R.bool.config_enabled_lte)) {
    935                         mButtonEnabledNetworks.setEntries(
    936                                 R.array.enabled_networks_except_gsm_lte_choices);
    937                         mButtonEnabledNetworks.setEntryValues(
    938                                 R.array.enabled_networks_except_gsm_lte_values);
    939                     } else if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) {
    940                         int select = (mShow4GForLTE == true) ?
    941                                 R.array.enabled_networks_except_gsm_4g_choices
    942                                 : R.array.enabled_networks_except_gsm_choices;
    943                         mButtonEnabledNetworks.setEntries(select);
    944                         mButtonEnabledNetworks.setEntryValues(
    945                                 R.array.enabled_networks_except_gsm_values);
    946                     } else if (!getResources().getBoolean(R.bool.config_enabled_lte)) {
    947                         mButtonEnabledNetworks.setEntries(
    948                                 R.array.enabled_networks_except_lte_choices);
    949                         mButtonEnabledNetworks.setEntryValues(
    950                                 R.array.enabled_networks_except_lte_values);
    951                     } else if (mIsGlobalCdma) {
    952                         mButtonEnabledNetworks.setEntries(
    953                                 R.array.enabled_networks_cdma_choices);
    954                         mButtonEnabledNetworks.setEntryValues(
    955                                 R.array.enabled_networks_cdma_values);
    956                     } else {
    957                         int select = (mShow4GForLTE == true) ? R.array.enabled_networks_4g_choices
    958                                 : R.array.enabled_networks_choices;
    959                         mButtonEnabledNetworks.setEntries(select);
    960                         mButtonEnabledNetworks.setEntryValues(
    961                                 R.array.enabled_networks_values);
    962                     }
    963                     updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService);
    964                 } else {
    965                     throw new IllegalStateException("Unexpected phone type: " + phoneType);
    966                 }
    967                 if (isWorldMode()) {
    968                     mButtonEnabledNetworks.setEntries(
    969                             R.array.preferred_network_mode_choices_world_mode);
    970                     mButtonEnabledNetworks.setEntryValues(
    971                             R.array.preferred_network_mode_values_world_mode);
    972                 }
    973                 mButtonEnabledNetworks.setOnPreferenceChangeListener(this);
    974                 if (DBG) log("settingsNetworkMode: " + settingsNetworkMode);
    975             }
    976 
    977             final boolean missingDataServiceUrl = TextUtils.isEmpty(
    978                     android.provider.Settings.Global.getString(activity.getContentResolver(),
    979                             android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL));
    980             if (!isLteOnCdma || missingDataServiceUrl) {
    981                 prefSet.removePreference(mLteDataServicePref);
    982             } else {
    983                 android.util.Log.d(LOG_TAG, "keep ltePref");
    984             }
    985 
    986             if (hideEnhanced4gLteSettings(getActivity(), carrierConfig)) {
    987                 Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY);
    988                 if (pref != null) {
    989                     prefSet.removePreference(pref);
    990                 }
    991             }
    992 
    993             updateCallingCategory();
    994 
    995             // Enable link to CMAS app settings depending on the value in config.xml.
    996             final boolean isCellBroadcastAppLinkEnabled = activity.getResources().getBoolean(
    997                     com.android.internal.R.bool.config_cellBroadcastAppLinks);
    998             if (!mUm.isAdminUser() || !isCellBroadcastAppLinkEnabled
    999                     || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
   1000                 PreferenceScreen root = getPreferenceScreen();
   1001                 Preference ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
   1002                 if (ps != null) {
   1003                     root.removePreference(ps);
   1004                 }
   1005             }
   1006 
   1007             // Get the networkMode from Settings.System and displays it
   1008             mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
   1009             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
   1010             UpdatePreferredNetworkModeSummary(settingsNetworkMode);
   1011             UpdateEnabledNetworksValueAndSummary(settingsNetworkMode);
   1012             // Display preferred network type based on what modem returns b/18676277
   1013             mPhone.setPreferredNetworkType(settingsNetworkMode, mHandler
   1014                     .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
   1015 
   1016             /**
   1017              * Enable/disable depending upon if there are any active subscriptions.
   1018              *
   1019              * I've decided to put this enable/disable code at the bottom as the
   1020              * code above works even when there are no active subscriptions, thus
   1021              * putting it afterwards is a smaller change. This can be refined later,
   1022              * but you do need to remember that this all needs to work when subscriptions
   1023              * change dynamically such as when hot swapping sims.
   1024              */
   1025             boolean canChange4glte = is4gLtePrefEnabled(activity.getApplicationContext(),
   1026                     carrierConfig);
   1027             boolean useVariant4glteTitle = carrierConfig.getBoolean(
   1028                     CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL);
   1029             int enhanced4glteModeTitleId = useVariant4glteTitle ?
   1030                     R.string.enhanced_4g_lte_mode_title_variant :
   1031                     R.string.enhanced_4g_lte_mode_title;
   1032 
   1033             mButtonPreferredNetworkMode.setEnabled(hasActiveSubscriptions);
   1034             mButtonEnabledNetworks.setEnabled(hasActiveSubscriptions);
   1035             mButton4glte.setTitle(enhanced4glteModeTitleId);
   1036             mButton4glte.setEnabled(hasActiveSubscriptions && canChange4glte);
   1037             mLteDataServicePref.setEnabled(hasActiveSubscriptions);
   1038             Preference ps;
   1039             PreferenceScreen root = getPreferenceScreen();
   1040             ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
   1041             if (ps != null) {
   1042                 ps.setEnabled(hasActiveSubscriptions);
   1043             }
   1044             ps = findPreference(CATEGORY_GSM_APN_EXPAND_KEY);
   1045             if (ps != null) {
   1046                 ps.setEnabled(hasActiveSubscriptions);
   1047             }
   1048             ps = findPreference(CATEGORY_CDMA_APN_EXPAND_KEY);
   1049             if (ps != null) {
   1050                 ps.setEnabled(hasActiveSubscriptions);
   1051             }
   1052             ps = findPreference(NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
   1053             if (ps != null) {
   1054                 ps.setEnabled(hasActiveSubscriptions);
   1055             }
   1056             ps = findPreference(BUTTON_CARRIER_SETTINGS_KEY);
   1057             if (ps != null) {
   1058                 ps.setEnabled(hasActiveSubscriptions);
   1059             }
   1060             ps = findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY);
   1061             if (ps != null) {
   1062                 ps.setEnabled(hasActiveSubscriptions);
   1063             }
   1064             ps = findPreference(CATEGORY_CALLING_KEY);
   1065             if (ps != null) {
   1066                 ps.setEnabled(hasActiveSubscriptions);
   1067             }
   1068         }
   1069 
   1070         @Override
   1071         public void onPause() {
   1072             super.onPause();
   1073             if (DBG) log("onPause:+");
   1074 
   1075             mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
   1076 
   1077             mSubscriptionManager
   1078                     .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
   1079             if (DBG) log("onPause:-");
   1080         }
   1081 
   1082         /**
   1083          * Implemented to support onPreferenceChangeListener to look for preference
   1084          * changes specifically on CLIR.
   1085          *
   1086          * @param preference is the preference to be changed, should be mButtonCLIR.
   1087          * @param objValue should be the value of the selection, NOT its localized
   1088          * display value.
   1089          */
   1090         public boolean onPreferenceChange(Preference preference, Object objValue) {
   1091             final int phoneSubId = mPhone.getSubId();
   1092             if (preference == mButtonPreferredNetworkMode) {
   1093                 //NOTE onPreferenceChange seems to be called even if there is no change
   1094                 //Check if the button value is changed from the System.Setting
   1095                 mButtonPreferredNetworkMode.setValue((String) objValue);
   1096                 int buttonNetworkMode;
   1097                 buttonNetworkMode = Integer.parseInt((String) objValue);
   1098                 int settingsNetworkMode = android.provider.Settings.Global.getInt(
   1099                         mPhone.getContext().getContentResolver(),
   1100                         android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
   1101                         preferredNetworkMode);
   1102                 if (buttonNetworkMode != settingsNetworkMode) {
   1103                     int modemNetworkMode;
   1104                     // if new mode is invalid ignore it
   1105                     switch (buttonNetworkMode) {
   1106                         case Phone.NT_MODE_WCDMA_PREF:
   1107                         case Phone.NT_MODE_GSM_ONLY:
   1108                         case Phone.NT_MODE_WCDMA_ONLY:
   1109                         case Phone.NT_MODE_GSM_UMTS:
   1110                         case Phone.NT_MODE_CDMA:
   1111                         case Phone.NT_MODE_CDMA_NO_EVDO:
   1112                         case Phone.NT_MODE_EVDO_NO_CDMA:
   1113                         case Phone.NT_MODE_GLOBAL:
   1114                         case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
   1115                         case Phone.NT_MODE_LTE_GSM_WCDMA:
   1116                         case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
   1117                         case Phone.NT_MODE_LTE_ONLY:
   1118                         case Phone.NT_MODE_LTE_WCDMA:
   1119                         case Phone.NT_MODE_TDSCDMA_ONLY:
   1120                         case Phone.NT_MODE_TDSCDMA_WCDMA:
   1121                         case Phone.NT_MODE_LTE_TDSCDMA:
   1122                         case Phone.NT_MODE_TDSCDMA_GSM:
   1123                         case Phone.NT_MODE_LTE_TDSCDMA_GSM:
   1124                         case Phone.NT_MODE_TDSCDMA_GSM_WCDMA:
   1125                         case Phone.NT_MODE_LTE_TDSCDMA_WCDMA:
   1126                         case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA:
   1127                         case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1128                         case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1129                             // This is one of the modes we recognize
   1130                             modemNetworkMode = buttonNetworkMode;
   1131                             break;
   1132                         default:
   1133                             loge("Invalid Network Mode (" +buttonNetworkMode+ ") chosen. Ignore.");
   1134                             return true;
   1135                     }
   1136 
   1137                     android.provider.Settings.Global.putInt(
   1138                             mPhone.getContext().getContentResolver(),
   1139                             android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
   1140                             buttonNetworkMode );
   1141                     //Set the modem network mode
   1142                     mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
   1143                             .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
   1144                 }
   1145             } else if (preference == mButtonEnabledNetworks) {
   1146                 mButtonEnabledNetworks.setValue((String) objValue);
   1147                 int buttonNetworkMode;
   1148                 buttonNetworkMode = Integer.parseInt((String) objValue);
   1149                 if (DBG) log("buttonNetworkMode: " + buttonNetworkMode);
   1150                 int settingsNetworkMode = android.provider.Settings.Global.getInt(
   1151                         mPhone.getContext().getContentResolver(),
   1152                         android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
   1153                         preferredNetworkMode);
   1154                 if (buttonNetworkMode != settingsNetworkMode) {
   1155                     int modemNetworkMode;
   1156                     // if new mode is invalid ignore it
   1157                     switch (buttonNetworkMode) {
   1158                         case Phone.NT_MODE_WCDMA_PREF:
   1159                         case Phone.NT_MODE_GSM_ONLY:
   1160                         case Phone.NT_MODE_LTE_GSM_WCDMA:
   1161                         case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
   1162                         case Phone.NT_MODE_CDMA:
   1163                         case Phone.NT_MODE_CDMA_NO_EVDO:
   1164                         case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
   1165                         case Phone.NT_MODE_TDSCDMA_ONLY:
   1166                         case Phone.NT_MODE_TDSCDMA_WCDMA:
   1167                         case Phone.NT_MODE_LTE_TDSCDMA:
   1168                         case Phone.NT_MODE_TDSCDMA_GSM:
   1169                         case Phone.NT_MODE_LTE_TDSCDMA_GSM:
   1170                         case Phone.NT_MODE_TDSCDMA_GSM_WCDMA:
   1171                         case Phone.NT_MODE_LTE_TDSCDMA_WCDMA:
   1172                         case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA:
   1173                         case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1174                         case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1175                             // This is one of the modes we recognize
   1176                             modemNetworkMode = buttonNetworkMode;
   1177                             break;
   1178                         default:
   1179                             loge("Invalid Network Mode (" +buttonNetworkMode+ ") chosen. Ignore.");
   1180                             return true;
   1181                     }
   1182 
   1183                     UpdateEnabledNetworksValueAndSummary(buttonNetworkMode);
   1184 
   1185                     android.provider.Settings.Global.putInt(
   1186                             mPhone.getContext().getContentResolver(),
   1187                             android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
   1188                             buttonNetworkMode );
   1189                     //Set the modem network mode
   1190                     mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
   1191                             .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
   1192                 }
   1193             } else if (preference == mButton4glte) {
   1194                 SwitchPreference enhanced4gModePref = (SwitchPreference) preference;
   1195                 boolean enhanced4gMode = !enhanced4gModePref.isChecked();
   1196                 enhanced4gModePref.setChecked(enhanced4gMode);
   1197                 ImsManager.setEnhanced4gLteModeSetting(getActivity(),
   1198                         enhanced4gModePref.isChecked());
   1199             } else if (preference == mButtonDataRoam) {
   1200                 if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
   1201 
   1202                 //normally called on the toggle click
   1203                 if (!mButtonDataRoam.isChecked()) {
   1204                     // First confirm with a warning dialog about charges
   1205                     mOkClicked = false;
   1206                     RoamingDialogFragment fragment = new RoamingDialogFragment();
   1207                     fragment.show(getFragmentManager(), ROAMING_TAG);
   1208                     // Don't update the toggle unless the confirm button is actually pressed.
   1209                     return false;
   1210                 } else {
   1211                     mPhone.setDataRoamingEnabled(false);
   1212                 }
   1213                 return true;
   1214             } else if (preference == mVideoCallingPref) {
   1215                 // If mButton4glte is not checked, mVideoCallingPref should be disabled.
   1216                 // So it only makes sense to call phoneMgr.enableVideoCalling if it's checked.
   1217                 if (mButton4glte.isChecked()) {
   1218                     PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
   1219                     return true;
   1220                 } else {
   1221                     loge("mVideoCallingPref should be disabled if mButton4glte is not checked.");
   1222                     mVideoCallingPref.setEnabled(false);
   1223                     return false;
   1224                 }
   1225             }
   1226 
   1227             updateBody();
   1228             // always let the preference setting proceed.
   1229             return true;
   1230         }
   1231 
   1232         private boolean is4gLtePrefEnabled(Context context, PersistableBundle carrierConfig) {
   1233             return (mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE)
   1234                     && ImsManager.isNonTtyOrTtyOnVolteEnabled(context)
   1235                     && carrierConfig.getBoolean(
   1236                             CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
   1237         }
   1238 
   1239         private class MyHandler extends Handler {
   1240 
   1241             static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 0;
   1242 
   1243             @Override
   1244             public void handleMessage(Message msg) {
   1245                 switch (msg.what) {
   1246                     case MESSAGE_SET_PREFERRED_NETWORK_TYPE:
   1247                         handleSetPreferredNetworkTypeResponse(msg);
   1248                         break;
   1249                 }
   1250             }
   1251 
   1252             private void handleSetPreferredNetworkTypeResponse(Message msg) {
   1253                 final Activity activity = getActivity();
   1254                 if (activity == null || activity.isDestroyed()) {
   1255                     // Access preferences of activity only if it is not destroyed
   1256                     // or if fragment is not attached to an activity.
   1257                     return;
   1258                 }
   1259 
   1260                 AsyncResult ar = (AsyncResult) msg.obj;
   1261                 final int phoneSubId = mPhone.getSubId();
   1262 
   1263                 if (ar.exception == null) {
   1264                     int networkMode;
   1265                     if (getPreferenceScreen().findPreference(
   1266                             BUTTON_PREFERED_NETWORK_MODE) != null)  {
   1267                         networkMode =  Integer.parseInt(mButtonPreferredNetworkMode.getValue());
   1268                         android.provider.Settings.Global.putInt(
   1269                                 mPhone.getContext().getContentResolver(),
   1270                                 android.provider.Settings.Global.PREFERRED_NETWORK_MODE
   1271                                         + phoneSubId,
   1272                                 networkMode );
   1273                     }
   1274                     if (getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) {
   1275                         networkMode = Integer.parseInt(mButtonEnabledNetworks.getValue());
   1276                         android.provider.Settings.Global.putInt(
   1277                                 mPhone.getContext().getContentResolver(),
   1278                                 android.provider.Settings.Global.PREFERRED_NETWORK_MODE
   1279                                         + phoneSubId,
   1280                                 networkMode );
   1281                     }
   1282                 } else {
   1283                     Log.i(LOG_TAG, "handleSetPreferredNetworkTypeResponse:" +
   1284                             "exception in setting network mode.");
   1285                     updatePreferredNetworkUIFromDb();
   1286                 }
   1287             }
   1288         }
   1289 
   1290         private void updatePreferredNetworkUIFromDb() {
   1291             final int phoneSubId = mPhone.getSubId();
   1292 
   1293             int settingsNetworkMode = android.provider.Settings.Global.getInt(
   1294                     mPhone.getContext().getContentResolver(),
   1295                     android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
   1296                     preferredNetworkMode);
   1297 
   1298             if (DBG) {
   1299                 log("updatePreferredNetworkUIFromDb: settingsNetworkMode = " +
   1300                         settingsNetworkMode);
   1301             }
   1302 
   1303             UpdatePreferredNetworkModeSummary(settingsNetworkMode);
   1304             UpdateEnabledNetworksValueAndSummary(settingsNetworkMode);
   1305             // changes the mButtonPreferredNetworkMode accordingly to settingsNetworkMode
   1306             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
   1307         }
   1308 
   1309         private void UpdatePreferredNetworkModeSummary(int NetworkMode) {
   1310             switch(NetworkMode) {
   1311                 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA:
   1312                 case Phone.NT_MODE_TDSCDMA_GSM:
   1313                 case Phone.NT_MODE_WCDMA_PREF:
   1314                     mButtonPreferredNetworkMode.setSummary(
   1315                             R.string.preferred_network_mode_wcdma_perf_summary);
   1316                     break;
   1317                 case Phone.NT_MODE_GSM_ONLY:
   1318                     mButtonPreferredNetworkMode.setSummary(
   1319                             R.string.preferred_network_mode_gsm_only_summary);
   1320                     break;
   1321                 case Phone.NT_MODE_TDSCDMA_WCDMA:
   1322                 case Phone.NT_MODE_WCDMA_ONLY:
   1323                     mButtonPreferredNetworkMode.setSummary(
   1324                             R.string.preferred_network_mode_wcdma_only_summary);
   1325                     break;
   1326                 case Phone.NT_MODE_GSM_UMTS:
   1327                     mButtonPreferredNetworkMode.setSummary(
   1328                             R.string.preferred_network_mode_gsm_wcdma_summary);
   1329                     break;
   1330                 case Phone.NT_MODE_CDMA:
   1331                     switch (mPhone.getLteOnCdmaMode()) {
   1332                         case PhoneConstants.LTE_ON_CDMA_TRUE:
   1333                             mButtonPreferredNetworkMode.setSummary(
   1334                                     R.string.preferred_network_mode_cdma_summary);
   1335                             break;
   1336                         case PhoneConstants.LTE_ON_CDMA_FALSE:
   1337                         default:
   1338                             mButtonPreferredNetworkMode.setSummary(
   1339                                     R.string.preferred_network_mode_cdma_evdo_summary);
   1340                             break;
   1341                     }
   1342                     break;
   1343                 case Phone.NT_MODE_CDMA_NO_EVDO:
   1344                     mButtonPreferredNetworkMode.setSummary(
   1345                             R.string.preferred_network_mode_cdma_only_summary);
   1346                     break;
   1347                 case Phone.NT_MODE_EVDO_NO_CDMA:
   1348                     mButtonPreferredNetworkMode.setSummary(
   1349                             R.string.preferred_network_mode_evdo_only_summary);
   1350                     break;
   1351                 case Phone.NT_MODE_LTE_TDSCDMA:
   1352                 case Phone.NT_MODE_LTE_ONLY:
   1353                     mButtonPreferredNetworkMode.setSummary(
   1354                             R.string.preferred_network_mode_lte_summary);
   1355                     break;
   1356                 case Phone.NT_MODE_LTE_TDSCDMA_GSM:
   1357                 case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA:
   1358                 case Phone.NT_MODE_LTE_GSM_WCDMA:
   1359                     mButtonPreferredNetworkMode.setSummary(
   1360                             R.string.preferred_network_mode_lte_gsm_wcdma_summary);
   1361                     break;
   1362                 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
   1363                     mButtonPreferredNetworkMode.setSummary(
   1364                             R.string.preferred_network_mode_lte_cdma_evdo_summary);
   1365                     break;
   1366                 case Phone.NT_MODE_TDSCDMA_ONLY:
   1367                     mButtonPreferredNetworkMode.setSummary(
   1368                             R.string.preferred_network_mode_tdscdma_summary);
   1369                     break;
   1370                 case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1371                 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
   1372                     if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA ||
   1373                             mIsGlobalCdma ||
   1374                             isWorldMode()) {
   1375                         mButtonPreferredNetworkMode.setSummary(
   1376                                 R.string.preferred_network_mode_global_summary);
   1377                     } else {
   1378                         mButtonPreferredNetworkMode.setSummary(
   1379                                 R.string.preferred_network_mode_lte_summary);
   1380                     }
   1381                     break;
   1382                 case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1383                 case Phone.NT_MODE_GLOBAL:
   1384                     mButtonPreferredNetworkMode.setSummary(
   1385                             R.string.preferred_network_mode_cdma_evdo_gsm_wcdma_summary);
   1386                     break;
   1387                 case Phone.NT_MODE_LTE_TDSCDMA_WCDMA:
   1388                 case Phone.NT_MODE_LTE_WCDMA:
   1389                     mButtonPreferredNetworkMode.setSummary(
   1390                             R.string.preferred_network_mode_lte_wcdma_summary);
   1391                     break;
   1392                 default:
   1393                     mButtonPreferredNetworkMode.setSummary(
   1394                             R.string.preferred_network_mode_global_summary);
   1395             }
   1396         }
   1397 
   1398         private void UpdateEnabledNetworksValueAndSummary(int NetworkMode) {
   1399             switch (NetworkMode) {
   1400                 case Phone.NT_MODE_TDSCDMA_WCDMA:
   1401                 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA:
   1402                 case Phone.NT_MODE_TDSCDMA_GSM:
   1403                     mButtonEnabledNetworks.setValue(
   1404                             Integer.toString(Phone.NT_MODE_TDSCDMA_GSM_WCDMA));
   1405                     mButtonEnabledNetworks.setSummary(R.string.network_3G);
   1406                     break;
   1407                 case Phone.NT_MODE_WCDMA_ONLY:
   1408                 case Phone.NT_MODE_GSM_UMTS:
   1409                 case Phone.NT_MODE_WCDMA_PREF:
   1410                     if (!mIsGlobalCdma) {
   1411                         mButtonEnabledNetworks.setValue(
   1412                                 Integer.toString(Phone.NT_MODE_WCDMA_PREF));
   1413                         mButtonEnabledNetworks.setSummary(R.string.network_3G);
   1414                     } else {
   1415                         mButtonEnabledNetworks.setValue(
   1416                                 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
   1417                         mButtonEnabledNetworks.setSummary(R.string.network_global);
   1418                     }
   1419                     break;
   1420                 case Phone.NT_MODE_GSM_ONLY:
   1421                     if (!mIsGlobalCdma) {
   1422                         mButtonEnabledNetworks.setValue(
   1423                                 Integer.toString(Phone.NT_MODE_GSM_ONLY));
   1424                         mButtonEnabledNetworks.setSummary(R.string.network_2G);
   1425                     } else {
   1426                         mButtonEnabledNetworks.setValue(
   1427                                 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
   1428                         mButtonEnabledNetworks.setSummary(R.string.network_global);
   1429                     }
   1430                     break;
   1431                 case Phone.NT_MODE_LTE_GSM_WCDMA:
   1432                     if (isWorldMode()) {
   1433                         mButtonEnabledNetworks.setSummary(
   1434                                 R.string.preferred_network_mode_lte_gsm_umts_summary);
   1435                         controlCdmaOptions(false);
   1436                         controlGsmOptions(true);
   1437                         break;
   1438                     }
   1439                 case Phone.NT_MODE_LTE_ONLY:
   1440                 case Phone.NT_MODE_LTE_WCDMA:
   1441                     if (!mIsGlobalCdma) {
   1442                         mButtonEnabledNetworks.setValue(
   1443                                 Integer.toString(Phone.NT_MODE_LTE_GSM_WCDMA));
   1444                         mButtonEnabledNetworks.setSummary((mShow4GForLTE == true)
   1445                                 ? R.string.network_4G : R.string.network_lte);
   1446                     } else {
   1447                         mButtonEnabledNetworks.setValue(
   1448                                 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
   1449                         mButtonEnabledNetworks.setSummary(R.string.network_global);
   1450                     }
   1451                     break;
   1452                 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
   1453                     if (isWorldMode()) {
   1454                         mButtonEnabledNetworks.setSummary(
   1455                                 R.string.preferred_network_mode_lte_cdma_summary);
   1456                         controlCdmaOptions(true);
   1457                         controlGsmOptions(false);
   1458                     } else {
   1459                         mButtonEnabledNetworks.setValue(
   1460                                 Integer.toString(Phone.NT_MODE_LTE_CDMA_AND_EVDO));
   1461                         mButtonEnabledNetworks.setSummary(R.string.network_lte);
   1462                     }
   1463                     break;
   1464                 case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1465                     mButtonEnabledNetworks.setValue(
   1466                             Integer.toString(Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA));
   1467                     mButtonEnabledNetworks.setSummary(R.string.network_3G);
   1468                     break;
   1469                 case Phone.NT_MODE_CDMA:
   1470                 case Phone.NT_MODE_EVDO_NO_CDMA:
   1471                 case Phone.NT_MODE_GLOBAL:
   1472                     mButtonEnabledNetworks.setValue(
   1473                             Integer.toString(Phone.NT_MODE_CDMA));
   1474                     mButtonEnabledNetworks.setSummary(R.string.network_3G);
   1475                     break;
   1476                 case Phone.NT_MODE_CDMA_NO_EVDO:
   1477                     mButtonEnabledNetworks.setValue(
   1478                             Integer.toString(Phone.NT_MODE_CDMA_NO_EVDO));
   1479                     mButtonEnabledNetworks.setSummary(R.string.network_1x);
   1480                     break;
   1481                 case Phone.NT_MODE_TDSCDMA_ONLY:
   1482                     mButtonEnabledNetworks.setValue(
   1483                             Integer.toString(Phone.NT_MODE_TDSCDMA_ONLY));
   1484                     mButtonEnabledNetworks.setSummary(R.string.network_3G);
   1485                     break;
   1486                 case Phone.NT_MODE_LTE_TDSCDMA_GSM:
   1487                 case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA:
   1488                 case Phone.NT_MODE_LTE_TDSCDMA:
   1489                 case Phone.NT_MODE_LTE_TDSCDMA_WCDMA:
   1490                 case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
   1491                 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
   1492                     if (isSupportTdscdma()) {
   1493                         mButtonEnabledNetworks.setValue(
   1494                                 Integer.toString(Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA));
   1495                         mButtonEnabledNetworks.setSummary(R.string.network_lte);
   1496                     } else {
   1497                         if (isWorldMode()) {
   1498                             controlCdmaOptions(true);
   1499                             controlGsmOptions(false);
   1500                         }
   1501                         mButtonEnabledNetworks.setValue(
   1502                                 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
   1503                         if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA ||
   1504                                 mIsGlobalCdma ||
   1505                                 isWorldMode()) {
   1506                             mButtonEnabledNetworks.setSummary(R.string.network_global);
   1507                         } else {
   1508                             mButtonEnabledNetworks.setSummary((mShow4GForLTE == true)
   1509                                     ? R.string.network_4G : R.string.network_lte);
   1510                         }
   1511                     }
   1512                     break;
   1513                 default:
   1514                     String errMsg = "Invalid Network Mode (" + NetworkMode + "). Ignore.";
   1515                     loge(errMsg);
   1516                     mButtonEnabledNetworks.setSummary(errMsg);
   1517             }
   1518         }
   1519 
   1520         @Override
   1521         public void onActivityResult(int requestCode, int resultCode, Intent data) {
   1522             switch(requestCode) {
   1523                 case REQUEST_CODE_EXIT_ECM:
   1524                     Boolean isChoiceYes = data.getBooleanExtra(
   1525                             EmergencyCallbackModeExitDialog.EXTRA_EXIT_ECM_RESULT, false);
   1526                     if (isChoiceYes) {
   1527                         // If the phone exits from ECM mode, show the CDMA Options
   1528                         mCdmaOptions.showDialog(mClickedPreference);
   1529                     } else {
   1530                         // do nothing
   1531                     }
   1532                     break;
   1533 
   1534                 default:
   1535                     break;
   1536             }
   1537         }
   1538 
   1539         private void updateWiFiCallState() {
   1540             if (mWiFiCallingPref == null || mCallingCategory == null) {
   1541                 return;
   1542             }
   1543 
   1544             boolean removePref = false;
   1545             final PhoneAccountHandle simCallManager =
   1546                     TelecomManager.from(getContext()).getSimCallManager();
   1547 
   1548             if (simCallManager != null) {
   1549                 Intent intent = PhoneAccountSettingsFragment.buildPhoneAccountConfigureIntent(
   1550                         getContext(), simCallManager);
   1551                 if (intent != null) {
   1552                     PackageManager pm = mPhone.getContext().getPackageManager();
   1553                     List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0);
   1554                     if (!resolutions.isEmpty()) {
   1555                         mWiFiCallingPref.setTitle(resolutions.get(0).loadLabel(pm));
   1556                         mWiFiCallingPref.setSummary(null);
   1557                         mWiFiCallingPref.setIntent(intent);
   1558                     } else {
   1559                         removePref = true;
   1560                     }
   1561                 } else {
   1562                     removePref = true;
   1563                 }
   1564             } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext())
   1565                     || !ImsManager.isWfcProvisionedOnDevice(mPhone.getContext())) {
   1566                 removePref = true;
   1567             } else {
   1568                 int resId = com.android.internal.R.string.wifi_calling_off_summary;
   1569                 if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
   1570                     boolean isRoaming = mButtonDataRoam.isChecked();
   1571                     int wfcMode = ImsManager.getWfcMode(mPhone.getContext(), isRoaming);
   1572                     switch (wfcMode) {
   1573                         case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
   1574                             resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
   1575                             break;
   1576                         case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED:
   1577                             resId = com.android.internal.R.string
   1578                                     .wfc_mode_cellular_preferred_summary;
   1579                             break;
   1580                         case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED:
   1581                             resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary;
   1582                             break;
   1583                         default:
   1584                             if (DBG) log("Unexpected WFC mode value: " + wfcMode);
   1585                     }
   1586                 }
   1587                 mWiFiCallingPref.setSummary(resId);
   1588             }
   1589 
   1590             if (removePref) {
   1591                 mCallingCategory.removePreference(mWiFiCallingPref);
   1592             } else {
   1593                 mCallingCategory.addPreference(mWiFiCallingPref);
   1594             }
   1595         }
   1596 
   1597         private void updateVideoCallState() {
   1598             if (mVideoCallingPref == null || mCallingCategory == null) {
   1599                 return;
   1600             }
   1601 
   1602             PersistableBundle carrierConfig = PhoneGlobals.getInstance()
   1603                     .getCarrierConfigForSubId(mPhone.getSubId());
   1604 
   1605             boolean removePref = false;
   1606 
   1607             if (ImsManager.isVtEnabledByPlatform(mPhone.getContext())
   1608                     && ImsManager.isVtProvisionedOnDevice(mPhone.getContext())
   1609                     && (carrierConfig.getBoolean(
   1610                             CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
   1611                             || mPhone.mDcTracker.isDataEnabled())) {
   1612                 boolean enhanced4gLteEnabled = mButton4glte.isChecked();
   1613                 mVideoCallingPref.setEnabled(enhanced4gLteEnabled);
   1614                 boolean currentValue = enhanced4gLteEnabled
   1615                         ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
   1616                         getContext().getOpPackageName()) : false;
   1617                 mVideoCallingPref.setChecked(currentValue);
   1618                 if (enhanced4gLteEnabled) {
   1619                     mVideoCallingPref.setOnPreferenceChangeListener(this);
   1620                 }
   1621             } else {
   1622                 removePref = true;
   1623             }
   1624 
   1625             if (removePref) {
   1626                 mCallingCategory.removePreference(mVideoCallingPref);
   1627             } else {
   1628                 mCallingCategory.addPreference(mVideoCallingPref);
   1629             }
   1630         }
   1631 
   1632         private void updateCallingCategory() {
   1633             if (mCallingCategory == null) {
   1634                 return;
   1635             }
   1636 
   1637             updateWiFiCallState();
   1638             updateVideoCallState();
   1639 
   1640             // If all items in calling category is removed, we remove it from
   1641             // the screen. Otherwise we'll see title of the category but nothing
   1642             // is in there.
   1643             if (mCallingCategory.getPreferenceCount() == 0) {
   1644                 getPreferenceScreen().removePreference(mCallingCategory);
   1645             } else {
   1646                 getPreferenceScreen().addPreference(mCallingCategory);
   1647             }
   1648         }
   1649 
   1650         private static void log(String msg) {
   1651             Log.d(LOG_TAG, msg);
   1652         }
   1653 
   1654         private static void loge(String msg) {
   1655             Log.e(LOG_TAG, msg);
   1656         }
   1657 
   1658         @Override
   1659         public boolean onOptionsItemSelected(MenuItem item) {
   1660             final int itemId = item.getItemId();
   1661             if (itemId == android.R.id.home) {  // See ActionBar#setDisplayHomeAsUpEnabled()
   1662                 // Commenting out "logical up" capability. This is a workaround for issue 5278083.
   1663                 //
   1664                 // Settings app may not launch this activity via UP_ACTIVITY_CLASS but the other
   1665                 // Activity that looks exactly same as UP_ACTIVITY_CLASS ("SubSettings" Activity).
   1666                 // At that moment, this Activity launches UP_ACTIVITY_CLASS on top of the Activity.
   1667                 // which confuses users.
   1668                 // TODO: introduce better mechanism for "up" capability here.
   1669             /*Intent intent = new Intent(Intent.ACTION_MAIN);
   1670             intent.setClassName(UP_ACTIVITY_PACKAGE, UP_ACTIVITY_CLASS);
   1671             intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
   1672             startActivity(intent);*/
   1673                 getActivity().finish();
   1674                 return true;
   1675             }
   1676             return super.onOptionsItemSelected(item);
   1677         }
   1678 
   1679         private boolean isWorldMode() {
   1680             boolean worldModeOn = false;
   1681             final String configString = getResources().getString(R.string.config_world_mode);
   1682 
   1683             if (!TextUtils.isEmpty(configString)) {
   1684                 String[] configArray = configString.split(";");
   1685                 // Check if we have World mode configuration set to True only or config is set to True
   1686                 // and SIM GID value is also set and matches to the current SIM GID.
   1687                 if (configArray != null &&
   1688                         ((configArray.length == 1 && configArray[0].equalsIgnoreCase("true"))
   1689                                 || (configArray.length == 2 && !TextUtils.isEmpty(configArray[1])
   1690                                 && mTelephonyManager != null
   1691                                 && configArray[1].equalsIgnoreCase(
   1692                                         mTelephonyManager.getGroupIdLevel1())))) {
   1693                     worldModeOn = true;
   1694                 }
   1695             }
   1696 
   1697             Log.d(LOG_TAG, "isWorldMode=" + worldModeOn);
   1698 
   1699             return worldModeOn;
   1700         }
   1701 
   1702         private void controlGsmOptions(boolean enable) {
   1703             PreferenceScreen prefSet = getPreferenceScreen();
   1704             if (prefSet == null) {
   1705                 return;
   1706             }
   1707 
   1708             updateGsmUmtsOptions(this, prefSet, mPhone.getSubId(), mNetworkQueryService);
   1709 
   1710             PreferenceCategory apnExpand =
   1711                     (PreferenceCategory) prefSet.findPreference(CATEGORY_GSM_APN_EXPAND_KEY);
   1712             PreferenceCategory networkOperatorCategory =
   1713                     (PreferenceCategory) prefSet.findPreference(
   1714                             NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
   1715             Preference carrierSettings = prefSet.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
   1716             if (apnExpand != null) {
   1717                 apnExpand.setEnabled(isWorldMode() || enable);
   1718             }
   1719             if (networkOperatorCategory != null) {
   1720                 if (enable) {
   1721                     networkOperatorCategory.setEnabled(true);
   1722                 } else {
   1723                     prefSet.removePreference(networkOperatorCategory);
   1724                 }
   1725             }
   1726             if (carrierSettings != null) {
   1727                 prefSet.removePreference(carrierSettings);
   1728             }
   1729         }
   1730 
   1731         private void controlCdmaOptions(boolean enable) {
   1732             PreferenceScreen prefSet = getPreferenceScreen();
   1733             if (prefSet == null) {
   1734                 return;
   1735             }
   1736             updateCdmaOptions(this, prefSet, mPhone);
   1737             CdmaSystemSelectListPreference systemSelect =
   1738                     (CdmaSystemSelectListPreference)prefSet.findPreference
   1739                             (BUTTON_CDMA_SYSTEM_SELECT_KEY);
   1740             if (systemSelect != null) {
   1741                 systemSelect.setEnabled(enable);
   1742             }
   1743         }
   1744 
   1745         private boolean isSupportTdscdma() {
   1746             if (getResources().getBoolean(R.bool.config_support_tdscdma)) {
   1747                 return true;
   1748             }
   1749 
   1750             String operatorNumeric = mPhone.getServiceState().getOperatorNumeric();
   1751             String[] numericArray = getResources().getStringArray(
   1752                     R.array.config_support_tdscdma_roaming_on_networks);
   1753             if (numericArray.length == 0 || operatorNumeric == null) {
   1754                 return false;
   1755             }
   1756             for (String numeric : numericArray) {
   1757                 if (operatorNumeric.equals(numeric)) {
   1758                     return true;
   1759                 }
   1760             }
   1761             return false;
   1762         }
   1763 
   1764         private void sendMetricsEventPreferenceClicked(
   1765                 PreferenceScreen preferenceScreen, Preference preference) {
   1766             if (preference == mMobileDataPref) {
   1767                 MetricsLogger.action(getContext(),
   1768                         MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE,
   1769                         ((MobileDataPreference) preference).mChecked);
   1770             } else if (preference == mDataUsagePref) {
   1771                 MetricsLogger.action(getContext(),
   1772                         MetricsEvent.ACTION_MOBILE_NETWORK_DATA_USAGE);
   1773             }
   1774             // TODO: add Metrics constants for other preferences and send events here accordingly.
   1775         }
   1776 
   1777         private void updateGsmUmtsOptions(PreferenceFragment prefFragment,
   1778                 PreferenceScreen prefScreen, final int subId, INetworkQueryService queryService) {
   1779             // We don't want to re-create GsmUmtsOptions if already exists. Otherwise, the
   1780             // preferences inside it will also be re-created which causes unexpected behavior.
   1781             // For example, the open dialog gets dismissed or detached after pause / resume.
   1782             if (mGsmUmtsOptions == null) {
   1783                 mGsmUmtsOptions = new GsmUmtsOptions(prefFragment, prefScreen, subId, queryService);
   1784             } else {
   1785                 mGsmUmtsOptions.update(subId, queryService);
   1786             }
   1787         }
   1788 
   1789         private void updateCdmaOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen,
   1790                 Phone phone) {
   1791             // We don't want to re-create CdmaOptions if already exists. Otherwise, the preferences
   1792             // inside it will also be re-created which causes unexpected behavior. For example,
   1793             // the open dialog gets dismissed or detached after pause / resume.
   1794             if (mCdmaOptions == null) {
   1795                 mCdmaOptions = new CdmaOptions(prefFragment, prefScreen, phone);
   1796             } else {
   1797                 mCdmaOptions.update(phone);
   1798             }
   1799         }
   1800     }
   1801 }
   1802 
   1803