diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c006ce3..4d4d2fb 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2420,9 +2420,9 @@
             </intent-filter>
         </receiver>
 
-        <receiver android:name=".sim.SimBootReceiver">
+        <receiver android:name=".sim.SimSelectNotification">
             <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
+                <action android:name="android.intent.action.SIM_STATE_CHANGED"></action>
             </intent-filter>
         </receiver>
 
diff --git a/src/com/android/settings/sim/SimBootReceiver.java b/src/com/android/settings/sim/SimBootReceiver.java
deleted file mode 100644
index 1e802f0..0000000
--- a/src/com/android/settings/sim/SimBootReceiver.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.sim;
-
-import com.android.settings.R;
-import com.android.settings.Settings.SimSettingsActivity;
-
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.provider.Settings;
-import android.support.v4.app.NotificationCompat;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
-
-import com.android.settings.Utils;
-
-import java.util.List;
-
-public class SimBootReceiver extends BroadcastReceiver {
-    private static final String TAG = "SimBootReceiver";
-    private static final int NOTIFICATION_ID = 1;
-
-    private TelephonyManager mTelephonyManager;
-    private Context mContext;
-    private SubscriptionManager mSubscriptionManager;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-        mContext = context;
-        mSubscriptionManager = SubscriptionManager.from(mContext);
-        mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
-    }
-
-    private void detectChangeAndNotify() {
-        final int numSlots = mTelephonyManager.getSimCount();
-        final boolean isInProvisioning = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.DEVICE_PROVISIONED, 0) == 0;
-        boolean notificationSent = false;
-        int numSIMsDetected = 0;
-        int lastSIMSlotDetected = -1;
-
-        // Do not create notifications on single SIM devices or when provisiong.
-        if (numSlots < 2 || isInProvisioning) {
-            return;
-        }
-
-        // Cancel any previous notifications
-        cancelNotification(mContext);
-
-        // Clear defaults for any subscriptions which no longer exist
-        mSubscriptionManager.clearDefaultsForInactiveSubIds();
-
-        boolean dataSelected = SubscriptionManager.isUsableSubIdValue(
-                SubscriptionManager.getDefaultDataSubId());
-        boolean smsSelected = SubscriptionManager.isUsableSubIdValue(
-                SubscriptionManager.getDefaultSmsSubId());
-
-        // If data and sms defaults are selected, dont show notification (Calls default is optional)
-        if (dataSelected && smsSelected) {
-            return;
-        }
-
-        // We wait until SubscriptionManager returns a valid list of Subscription informations
-        // by checking if the list is empty.
-        // This is not completely correct, but works for most cases.
-        // See Bug: 18377252
-        List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
-        if (sil == null || sil.size() < 1) {
-            return;
-        } else {
-            // Create a notification to tell the user that some defaults are missing
-            createNotification(mContext);
-
-            if (sil.size() == 1) {
-                // If there is only one subscription, ask if user wants to use if for everything
-                Intent intent = new Intent(mContext, SimDialogActivity.class);
-                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.PREFERRED_PICK);
-                intent.putExtra(SimDialogActivity.PREFERRED_SIM, sil.get(0).getSimSlotIndex());
-                mContext.startActivity(intent);
-            } else if (!dataSelected) {
-                // TODO(sanketpadawe): This should not be shown if the user is looking at the
-                // SimSettings page - its just annoying
-                // If there are mulitple, ensure they pick default data
-                Intent intent = new Intent(mContext, SimDialogActivity.class);
-                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.DATA_PICK);
-                mContext.startActivity(intent);
-            }
-        }
-
-    }
-
-    private void createNotification(Context context){
-        final Resources resources = context.getResources();
-
-        // TODO(sanketpadawe): This notification should not be dissmissable by the user
-        NotificationCompat.Builder builder =
-                new NotificationCompat.Builder(context)
-                .setSmallIcon(R.drawable.ic_sim_card_alert_white_48dp)
-                .setColor(context.getColor(R.color.sim_noitification))
-                .setContentTitle(resources.getString(R.string.sim_notification_title))
-                .setContentText(resources.getString(R.string.sim_notification_summary));
-        Intent resultIntent = new Intent(context, SimSettingsActivity.class);
-        resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        PendingIntent resultPendingIntent =
-                PendingIntent.getActivity(
-                context,
-                0,
-                resultIntent,
-                PendingIntent.FLAG_CANCEL_CURRENT
-                );
-        builder.setContentIntent(resultPendingIntent);
-        NotificationManager notificationManager =
-                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-        notificationManager.notify(NOTIFICATION_ID, builder.build());
-    }
-
-    public static void cancelNotification(Context context) {
-        NotificationManager notificationManager =
-                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-        notificationManager.cancel(NOTIFICATION_ID);
-    }
-
-    private final OnSubscriptionsChangedListener mSubscriptionListener =
-            new OnSubscriptionsChangedListener() {
-        @Override
-        public void onSubscriptionsChanged() {
-            detectChangeAndNotify();
-        }
-    };
-
-}
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
new file mode 100644
index 0000000..fd54e9b
--- /dev/null
+++ b/src/com/android/settings/sim/SimSelectNotification.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.sim;
+
+import com.android.internal.telephony.IccCardConstants;
+import com.android.settings.R;
+import com.android.settings.Settings.SimSettingsActivity;
+
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.provider.Settings;
+import android.support.v4.app.NotificationCompat;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import java.util.List;
+
+public class SimSelectNotification extends BroadcastReceiver {
+    private static final String TAG = "SimSelectNotification";
+    private static final int NOTIFICATION_ID = 1;
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        final TelephonyManager telephonyManager = (TelephonyManager)
+                context.getSystemService(Context.TELEPHONY_SERVICE);
+        final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
+        final int numSlots = telephonyManager.getSimCount();
+        final boolean isInProvisioning = Settings.Global.getInt(context.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0) == 0;
+
+        // Do not create notifications on single SIM devices or when provisiong i.e. Setup Wizard.
+        if (numSlots < 2 || isInProvisioning) {
+            return;
+        }
+
+        // Cancel any previous notifications
+        cancelNotification(context);
+
+        // If sim state is not ABSENT or LOADED then ignore
+        String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
+        if (!(IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(simStatus) ||
+                IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(simStatus))) {
+            Log.d(TAG, "sim state is not Absent or Loaded");
+            return;
+        } else {
+            Log.d(TAG, "simstatus = " + simStatus);
+        }
+
+        int state;
+        for (int i = 0; i < numSlots; i++) {
+            state = telephonyManager.getSimState(i);
+            if (!(state == TelephonyManager.SIM_STATE_ABSENT
+                    || state == TelephonyManager.SIM_STATE_READY
+                    || state == TelephonyManager.SIM_STATE_UNKNOWN)) {
+                Log.d(TAG, "All sims not in valid state yet");
+                return;
+            }
+        }
+
+        List<SubscriptionInfo> sil = subscriptionManager.getActiveSubscriptionInfoList();
+        if (sil == null || sil.size() < 1) {
+            Log.d(TAG, "Subscription list is empty");
+            return;
+        }
+
+        // Clear defaults for any subscriptions which no longer exist
+        subscriptionManager.clearDefaultsForInactiveSubIds();
+
+        boolean dataSelected = SubscriptionManager.isUsableSubIdValue(
+                SubscriptionManager.getDefaultDataSubId());
+        boolean smsSelected = SubscriptionManager.isUsableSubIdValue(
+                SubscriptionManager.getDefaultSmsSubId());
+
+        // If data and sms defaults are selected, dont show notification (Calls default is optional)
+        if (dataSelected && smsSelected) {
+            Log.d(TAG, "Data & SMS default sims are selected. No notification");
+            return;
+        }
+
+        // Create a notification to tell the user that some defaults are missing
+        createNotification(context);
+
+        if (sil.size() == 1) {
+            // If there is only one subscription, ask if user wants to use if for everything
+            Intent newIntent = new Intent(context, SimDialogActivity.class);
+            newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            newIntent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.PREFERRED_PICK);
+            newIntent.putExtra(SimDialogActivity.PREFERRED_SIM, sil.get(0).getSimSlotIndex());
+            context.startActivity(newIntent);
+        } else if (!dataSelected) {
+            // If there are mulitple, ensure they pick default data
+            Intent newIntent = new Intent(context, SimDialogActivity.class);
+            newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            newIntent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.DATA_PICK);
+            context.startActivity(newIntent);
+        }
+    }
+
+    private void createNotification(Context context){
+        final Resources resources = context.getResources();
+        NotificationCompat.Builder builder =
+                new NotificationCompat.Builder(context)
+                .setSmallIcon(R.drawable.ic_sim_card_alert_white_48dp)
+                .setColor(context.getColor(R.color.sim_noitification))
+                .setContentTitle(resources.getString(R.string.sim_notification_title))
+                .setContentText(resources.getString(R.string.sim_notification_summary));
+        Intent resultIntent = new Intent(context, SimSettingsActivity.class);
+        resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, resultIntent,
+                PendingIntent.FLAG_CANCEL_CURRENT);
+        builder.setContentIntent(resultPendingIntent);
+        NotificationManager notificationManager =
+                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+        notificationManager.notify(NOTIFICATION_ID, builder.build());
+    }
+
+    public static void cancelNotification(Context context) {
+        NotificationManager notificationManager =
+                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+        notificationManager.cancel(NOTIFICATION_ID);
+    }
+}
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index efc71d8..6d7ee4f 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -68,32 +68,6 @@
     private static final String KEY_CELLULAR_DATA = "sim_cellular_data";
     private static final String KEY_CALLS = "sim_calls";
     private static final String KEY_SMS = "sim_sms";
-    private static final String KEY_ACTIVITIES = "activities";
-    private static final int ID_INDEX = 0;
-    private static final int NAME_INDEX = 1;
-    private static final int APN_INDEX = 2;
-    private static final int PROXY_INDEX = 3;
-    private static final int PORT_INDEX = 4;
-    private static final int USER_INDEX = 5;
-    private static final int SERVER_INDEX = 6;
-    private static final int PASSWORD_INDEX = 7;
-    private static final int MMSC_INDEX = 8;
-    private static final int MCC_INDEX = 9;
-    private static final int MNC_INDEX = 10;
-    private static final int NUMERIC_INDEX = 11;
-    private static final int MMSPROXY_INDEX = 12;
-    private static final int MMSPORT_INDEX = 13;
-    private static final int AUTH_TYPE_INDEX = 14;
-    private static final int TYPE_INDEX = 15;
-    private static final int PROTOCOL_INDEX = 16;
-    private static final int CARRIER_ENABLED_INDEX = 17;
-    private static final int BEARER_INDEX = 18;
-    private static final int ROAMING_PROTOCOL_INDEX = 19;
-    private static final int MVNO_TYPE_INDEX = 20;
-    private static final int MVNO_MATCH_DATA_INDEX = 21;
-    private static final int DATA_PICK = 0;
-    private static final int CALLS_PICK = 1;
-    private static final int SMS_PICK = 2;
 
     /**
      * By UX design we use only one Subscription Information(SubInfo) record per SIM slot.
@@ -104,16 +78,10 @@
     private List<SubscriptionInfo> mAvailableSubInfos = null;
     private List<SubscriptionInfo> mSubInfoList = null;
     private List<SubscriptionInfo> mSelectableSubInfos = null;
-
-    private SubscriptionInfo mCellularData = null;
-    private SubscriptionInfo mCalls = null;
-    private SubscriptionInfo mSMS = null;
-
     private PreferenceScreen mSimCards = null;
-
     private SubscriptionManager mSubscriptionManager;
-    private Utils mUtils;
-
+    private int mNumSlots;
+    private Context mContext;
 
     public SimSettings() {
         super(DISALLOW_CONFIG_SIM);
@@ -127,51 +95,52 @@
     @Override
     public void onCreate(final Bundle bundle) {
         super.onCreate(bundle);
+        mContext = getActivity();
 
         mSubscriptionManager = SubscriptionManager.from(getActivity());
-
-        if (mSubInfoList == null) {
-            mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
-            // FIXME: b/18385348, needs to handle null from getActiveSubscriptionInfoList
-        }
-        if (DBG) log("[onCreate] mSubInfoList=" + mSubInfoList);
-
-        createPreferences();
-        updateAllOptions();
-
-        SimBootReceiver.cancelNotification(getActivity());
-    }
-
-    private void createPreferences() {
         final TelephonyManager tm =
-            (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
-
+                (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
         addPreferencesFromResource(R.xml.sim_settings);
 
+        mNumSlots = tm.getSimCount();
         mSimCards = (PreferenceScreen)findPreference(SIM_CARD_CATEGORY);
-
-        final int numSlots = tm.getSimCount();
-        mAvailableSubInfos = new ArrayList<SubscriptionInfo>(numSlots);
+        mAvailableSubInfos = new ArrayList<SubscriptionInfo>(mNumSlots);
         mSelectableSubInfos = new ArrayList<SubscriptionInfo>();
-        for (int i = 0; i < numSlots; ++i) {
-            // Less efficient than getActiveSubscriptionInfoList but we need to show a disable
-            // preference if the slot is empty
+        SimSelectNotification.cancelNotification(getActivity());
+    }
+
+    private final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener
+            = new SubscriptionManager.OnSubscriptionsChangedListener() {
+        @Override
+        public void onSubscriptionsChanged() {
+            if (DBG) log("onSubscriptionsChanged:");
+            updateSubscriptions();
+        }
+    };
+
+    private void updateSubscriptions() {
+        mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
+        for (int i = 0; i < mNumSlots; ++i) {
+            Preference pref = mSimCards.findPreference("sim" + i);
+            if (pref instanceof SimPreference) {
+                mSimCards.removePreference(pref);
+            }
+        }
+        mAvailableSubInfos.clear();
+        mSelectableSubInfos.clear();
+
+        for (int i = 0; i < mNumSlots; ++i) {
             final SubscriptionInfo sir = mSubscriptionManager
                     .getActiveSubscriptionInfoForSimSlotIndex(i);
-            SimPreference simPreference = new SimPreference(getActivity(), sir, i);
-            simPreference.setOrder(i-numSlots);
+            SimPreference simPreference = new SimPreference(mContext, sir, i);
+            simPreference.setOrder(i-mNumSlots);
             mSimCards.addPreference(simPreference);
             mAvailableSubInfos.add(sir);
             if (sir != null) {
                 mSelectableSubInfos.add(sir);
             }
         }
-
-        updateActivitesCategory();
-    }
-
-    private void updateAvailableSubInfos(){
-        mAvailableSubInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
+        updateAllOptions();
     }
 
     private void updateAllOptions() {
@@ -180,8 +149,6 @@
     }
 
     private void updateSimSlotValues() {
-        mSubscriptionManager.getAllSubscriptionInfoList();
-
         final int prefSize = mSimCards.getPreferenceCount();
         for (int i = 0; i < prefSize; ++i) {
             Preference pref = mSimCards.getPreference(i);
@@ -227,7 +194,7 @@
 
     private void updateCallValues() {
         final Preference simPref = findPreference(KEY_CALLS);
-        final TelecomManager telecomManager = TelecomManager.from(getActivity());
+        final TelecomManager telecomManager = TelecomManager.from(mContext);
         final PhoneAccountHandle phoneAccount =
             telecomManager.getUserSelectedOutgoingPhoneAccount();
         final List<PhoneAccountHandle> allPhoneAccounts =
@@ -235,7 +202,7 @@
 
         simPref.setTitle(R.string.calls_title);
         simPref.setSummary(phoneAccount == null
-                ? getResources().getString(R.string.sim_calls_ask_first_prefs_title)
+                ? mContext.getResources().getString(R.string.sim_calls_ask_first_prefs_title)
                 : (String)telecomManager.getPhoneAccount(phoneAccount).getLabel());
         simPref.setEnabled(allPhoneAccounts.size() > 1);
     }
@@ -243,22 +210,17 @@
     @Override
     public void onResume() {
         super.onResume();
-
-        mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
-        // FIXME: b/18385348, needs to handle null from getActiveSubscriptionInfoList
-        if (DBG) log("[onResme] mSubInfoList=" + mSubInfoList);
-
+        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
         final TelephonyManager tm =
                 (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
         tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
-
-        updateAvailableSubInfos();
-        updateAllOptions();
+        updateSubscriptions();
     }
 
     @Override
     public void onPause() {
         super.onPause();
+        mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
         final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
         tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
     }
@@ -283,7 +245,7 @@
     @Override
     public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen,
             final Preference preference) {
-        final Context context = getActivity();
+        final Context context = mContext;
         Intent intent = new Intent(context, SimDialogActivity.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
@@ -325,13 +287,13 @@
         }
 
         public void update() {
-            final Resources res = getResources();
+            final Resources res = mContext.getResources();
 
-            setTitle(String.format(getResources()
+            setTitle(String.format(mContext.getResources()
                     .getString(R.string.sim_editor_title), (mSlotId + 1)));
             if (mSubInfoRecord != null) {
                 if (TextUtils.isEmpty(getPhoneNumber(mSubInfoRecord))) {
-                   setSummary(mSubInfoRecord.getDisplayName());
+                    setSummary(mSubInfoRecord.getDisplayName());
                 } else {
                     setSummary(mSubInfoRecord.getDisplayName() + " - " +
                             getPhoneNumber(mSubInfoRecord));
@@ -350,11 +312,13 @@
         }
 
         public void createEditDialog(SimPreference simPref) {
-            final Resources res = getResources();
+            final Resources res = mContext.getResources();
 
-            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
 
-            final View dialogLayout = getActivity().getLayoutInflater().inflate(
+            LayoutInflater inflater = (LayoutInflater)mContext
+                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+            final View dialogLayout = inflater.inflate(
                     R.layout.multi_sim_dialog, null);
             builder.setView(dialogLayout);
 
@@ -397,7 +361,7 @@
             }
 
             final TelephonyManager tm =
-                        (TelephonyManager) getActivity().getSystemService(
+                        (TelephonyManager) mContext.getSystemService(
                         Context.TELEPHONY_SERVICE);
             String simCarrierName = tm.getSimOperatorNameForSubscription(mSubInfoRecord
                         .getSubscriptionId());
@@ -458,7 +422,7 @@
 
                 View rowView;
                 final ViewHolder holder;
-                Resources res = getResources();
+                Resources res = mContext.getResources();
                 int iconSize = res.getDimensionPixelSize(R.dimen.color_swatch_size);
                 int strokeWidth = res.getDimensionPixelSize(R.dimen.color_swatch_stroke_width);
 
@@ -515,7 +479,7 @@
     // be overridden for display purposes.
     private String getPhoneNumber(SubscriptionInfo info) {
         final TelephonyManager tm =
-            (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
+            (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
         return tm.getLine1NumberForSubscriber(info.getSubscriptionId());
     }
 
