diff --git a/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java b/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java
index 30d8381..d963a55 100644
--- a/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java
+++ b/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java
@@ -128,7 +128,12 @@
         mLogHandler.post(() -> {
             mSettingsLogList.add(settingsLog);
         });
-        mLogHandler.scheduleSendLog();
+        if (action == SettingsEnums.ACTION_CONTEXTUAL_CARD_DISMISS) {
+            // Directly send this event to notify SI instantly that the card is dismissed
+            mLogHandler.sendLog();
+        } else {
+            mLogHandler.scheduleSendLog();
+        }
     }
 
     @VisibleForTesting
@@ -136,7 +141,7 @@
         final int size = settingsLogs.size();
         final ByteArrayOutputStream bout = new ByteArrayOutputStream();
         final DataOutputStream output = new DataOutputStream(bout);
-        // Data is "size, length, bytearray, length, bytearray ..."
+        // The data format is "size, length, byte array, length, byte array ..."
         try {
             output.writeInt(size);
             for (SettingsLog settingsLog : settingsLogs) {
@@ -159,14 +164,19 @@
 
     private class SendLogHandler extends Handler {
 
-        public SendLogHandler(Looper looper) {
+        SendLogHandler(Looper looper) {
             super(looper);
         }
 
-        public void scheduleSendLog() {
+        void scheduleSendLog() {
             removeCallbacks(mSendLogsRunnable);
             postDelayed(mSendLogsRunnable, MESSAGE_DELAY);
         }
+
+        void sendLog() {
+            removeCallbacks(mSendLogsRunnable);
+            post(mSendLogsRunnable);
+        }
     }
 
     private final Runnable mSendLogsRunnable = () -> {
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 886a12d..744bb4e 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -57,7 +57,7 @@
     static final int CARD_CONTENT_LOADER_ID = 1;
 
     private static final String TAG = "ContextualCardLoader";
-    private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 250;
+    private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 300;
 
     private final ContentObserver mObserver = new ContentObserver(
             new Handler(Looper.getMainLooper())) {
diff --git a/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java b/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
index 7fd8a2f..90b7f36 100644
--- a/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
+++ b/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
@@ -18,8 +18,6 @@
 
 import static android.app.slice.Slice.HINT_ERROR;
 
-import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.STICKY_VALUE;
-
 import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -43,7 +41,7 @@
 public class EligibleCardChecker implements Callable<ContextualCard> {
 
     private static final String TAG = "EligibleCardChecker";
-    private static final long LATCH_TIMEOUT_MS = 200;
+    private static final long LATCH_TIMEOUT_MS = 300;
 
     private final Context mContext;
 
@@ -96,11 +94,6 @@
             return false;
         }
 
-        if (card.getCategory() == STICKY_VALUE) {
-            Log.d(TAG, "Sticky card, skip checking. Uri = " + card.getSliceUri());
-            return true;
-        }
-
         final Slice slice = bindSlice(uri);
 
         if (isSliceToggleable(slice)) {
diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
index 779802a..1d82f65 100644
--- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
+++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
@@ -34,6 +34,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.network.SubscriptionUtil;
 import com.android.settings.network.SubscriptionsChangeListener;
@@ -64,7 +65,6 @@
     public DefaultSubscriptionController(Context context, String preferenceKey) {
         super(context, preferenceKey);
         mManager = context.getSystemService(SubscriptionManager.class);
-        mTelecomManager = mContext.getSystemService(TelecomManager.class);
         mChangeListener = new SubscriptionsChangeListener(context, this);
     }
 
@@ -184,12 +184,12 @@
      */
     public PhoneAccountHandle getDefaultCallingAccountHandle() {
         final PhoneAccountHandle currentSelectPhoneAccount =
-                mTelecomManager.getUserSelectedOutgoingPhoneAccount();
+                getTelecomManager().getUserSelectedOutgoingPhoneAccount();
         if (currentSelectPhoneAccount == null) {
             return null;
         }
         final List<PhoneAccountHandle> accountHandles =
-                mTelecomManager.getCallCapablePhoneAccounts(false);
+                getTelecomManager().getCallCapablePhoneAccounts(false);
         final PhoneAccountHandle emergencyAccountHandle = new PhoneAccountHandle(
                 PSTN_CONNECTION_SERVICE_COMPONENT, EMERGENCY_ACCOUNT_HANDLE_ID);
         if (currentSelectPhoneAccount.equals(emergencyAccountHandle)) {
@@ -203,14 +203,30 @@
         return null;
     }
 
+    @VisibleForTesting
+    TelecomManager getTelecomManager() {
+        if (mTelecomManager == null) {
+            mTelecomManager = mContext.getSystemService(TelecomManager.class);
+        }
+        return mTelecomManager;
+    }
+
+    @VisibleForTesting
+    PhoneAccount getPhoneAccount(PhoneAccountHandle handle) {
+        return getTelecomManager().getPhoneAccount(handle);
+    }
+
     /**
      * Check if calling account bind to subscription
      *
      * @param handle {@link PhoneAccountHandle} for specific calling account
      */
     public boolean isCallingAccountBindToSubscription(PhoneAccountHandle handle) {
-        return mTelecomManager.getPhoneAccount(handle)
-                .hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION);
+        final PhoneAccount account = getPhoneAccount(handle);
+        if (account == null) {
+            return false;
+        }
+        return account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION);
     }
 
     /**
@@ -220,7 +236,11 @@
      * @return label of calling account
      */
     public CharSequence getLabelFromCallingAccount(PhoneAccountHandle handle) {
-        CharSequence label = mTelecomManager.getPhoneAccount(handle).getLabel();
+        CharSequence label = null;
+        final PhoneAccount account = getPhoneAccount(handle);
+        if (account != null) {
+            label = account.getLabel();
+        }
         if (label != null) {
             label = mContext.getPackageManager().getUserBadgedLabel(label, handle.getUserHandle());
         }
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 26c206d..d6f66a1 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -168,7 +168,6 @@
         private Context mContext;
         private TelephonyManager mTelephonyManager;
 
-        private boolean mAllowed5gNetworkType;
         private boolean mIsGlobalCdma;
         private boolean mIs5gEntryDisplayed;
         private boolean mShow4gForLTE;
@@ -206,9 +205,6 @@
             final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
             final boolean isNrEnabledFromCarrierConfig = carrierConfig != null
                     && carrierConfig.getBoolean(CarrierConfigManager.KEY_NR_ENABLED_BOOL);
-            mAllowed5gNetworkType = checkSupportedRadioBitmask(
-                    mTelephonyManager.getAllowedNetworkTypes(),
-                    TelephonyManager.NETWORK_TYPE_BITMASK_NR);
             mSupported5gRadioAccessFamily = isNrEnabledFromCarrierConfig
                     && checkSupportedRadioBitmask(mTelephonyManager.getSupportedRadioAccessFamily(),
                     TelephonyManager.NETWORK_TYPE_BITMASK_NR);
@@ -572,7 +568,7 @@
         }
 
         /**
-         * Add 5G option. Only show the UI when device supported 5G and allowed 5G.
+         * Add 5G option. Only show the UI when device supported 5G.
          */
         private void add5gEntry(int value) {
             boolean isNRValue = value >= TelephonyManagerConstants.NETWORK_MODE_NR_ONLY;
@@ -585,15 +581,13 @@
                 mIs5gEntryDisplayed = false;
                 Log.d(LOG_TAG, "Hide 5G option. "
                         + " supported5GRadioAccessFamily: " + mSupported5gRadioAccessFamily
-                        + " allowed5GNetworkType: " + mAllowed5gNetworkType
                         + " isNRValue: " + isNRValue);
             }
         }
 
         private void addGlobalEntry() {
             Log.d(LOG_TAG, "addGlobalEntry. "
-                    + " supported5GRadioAccessFamily: " + mSupported5gRadioAccessFamily
-                    + " allowed5GNetworkType: " + mAllowed5gNetworkType);
+                    + " supported5GRadioAccessFamily: " + mSupported5gRadioAccessFamily);
             mEntries.add(mContext.getString(R.string.network_global));
             if (showNrList()) {
                 mEntriesValue.add(
@@ -605,7 +599,7 @@
         }
 
         private boolean showNrList() {
-            return mSupported5gRadioAccessFamily && mAllowed5gNetworkType;
+            return mSupported5gRadioAccessFamily;
         }
 
         /**
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/EligibleCardCheckerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/EligibleCardCheckerTest.java
index e236919..23ae2f3 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/EligibleCardCheckerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/EligibleCardCheckerTest.java
@@ -18,15 +18,11 @@
 
 import static android.app.slice.Slice.HINT_ERROR;
 
-import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.STICKY_VALUE;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
 
 import android.content.Context;
 import android.net.Uri;
@@ -69,32 +65,6 @@
     }
 
     @Test
-    public void isCardEligibleToDisplay_stickyCard_returnTrue() {
-        final ContextualCard card = new ContextualCard.Builder()
-                .setName("test_card")
-                .setCardType(ContextualCard.CardType.SLICE)
-                .setCategory(STICKY_VALUE)
-                .setSliceUri(CustomSliceRegistry.FLASHLIGHT_SLICE_URI)
-                .build();
-
-        assertThat(mEligibleCardChecker.isCardEligibleToDisplay(card)).isTrue();
-    }
-
-    @Test
-    public void isCardEligibleToDisplay_stickyCard_shouldNotPrebind() {
-        final ContextualCard card = new ContextualCard.Builder()
-                .setName("test_card")
-                .setCardType(ContextualCard.CardType.SLICE)
-                .setCategory(STICKY_VALUE)
-                .setSliceUri(CustomSliceRegistry.FLASHLIGHT_SLICE_URI)
-                .build();
-
-        mEligibleCardChecker.isCardEligibleToDisplay(card);
-
-        verify(mEligibleCardChecker, never()).bindSlice(CustomSliceRegistry.FLASHLIGHT_SLICE_URI);
-    }
-
-    @Test
     public void isCardEligibleToDisplay_toggleSlice_hasInlineActionShouldBeTrue() {
         final ContextualWifiSlice wifiSlice = new ContextualWifiSlice(mContext);
         final Slice slice = wifiSlice.getSlice();
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
index dbdad50..e20241b 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
@@ -21,6 +21,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
@@ -32,6 +33,9 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
 import com.android.settings.R;
 import com.android.settings.network.SubscriptionUtil;
 
@@ -46,9 +50,6 @@
 
 import java.util.Arrays;
 
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceScreen;
-
 @RunWith(RobolectricTestRunner.class)
 public class DefaultSubscriptionControllerTest {
     @Mock
@@ -92,6 +93,20 @@
     }
 
     @Test
+    public void isCallingAccountBindToSubscription_invalidAccount_withoutCrash() {
+        doReturn(null).when(mController).getPhoneAccount(any());
+
+        mController.isCallingAccountBindToSubscription(null);
+    }
+
+    @Test
+    public void getLabelFromCallingAccount_invalidAccount_emptyString() {
+        doReturn(null).when(mController).getPhoneAccount(any());
+
+        assertThat(mController.getLabelFromCallingAccount(null)).isEqualTo("");
+    }
+
+    @Test
     public void displayPreference_twoSubscriptionsSub1Default_correctListPreferenceValues() {
         final SubscriptionInfo sub1 = createMockSub(111, "sub1");
         final SubscriptionInfo sub2 = createMockSub(222, "sub2");
diff --git a/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
index a818852..7f4b33c 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
@@ -60,7 +60,6 @@
     private static final int SUB_ID = 2;
     public static final String KEY = "enabled_network";
 
-    private static final long ALLOWED_ALL_NETWORK_TYPE = -1;
     private static final long DISABLED_5G_NETWORK_TYPE = ~TelephonyManager.NETWORK_TYPE_BITMASK_NR;
 
     @Mock
@@ -98,7 +97,6 @@
         doReturn(mPersistableBundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
         mPreference = new ListPreference(mContext);
         mController = new EnabledNetworkModePreferenceController(mContext, KEY);
-        mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE);
         mockAccessFamily(TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA);
         mController.init(mLifecycle, SUB_ID);
         mPreference.setKey(mController.getPreferenceKey());
@@ -185,76 +183,6 @@
     }
 
     @Test
-    public void updateState_disAllowed5g_5gOptionHidden() {
-        mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
-        mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
-        mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
-        mController.init(mLifecycle, SUB_ID);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
-                TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
-
-        mController.updateState(mPreference);
-
-        assertThat(mPreference.getEntryValues())
-                .asList()
-                .doesNotContain(
-                        String.valueOf(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA));
-    }
-
-    @Test
-    public void updateState_disAllowed5g_selectOn4gOption() {
-        mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
-        mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
-        mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
-        mController.init(mLifecycle, SUB_ID);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
-                TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
-
-        mController.updateState(mPreference);
-
-        assertThat(mPreference.getValue()).isEqualTo(
-                String.valueOf(
-                        TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA));
-    }
-
-    @Test
-    public void updateState_GlobalDisAllowed5g_GlobalWithoutNR() {
-        mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
-        mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
-        mController.init(mLifecycle, SUB_ID);
-        mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
-                TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
-
-        mController.updateState(mPreference);
-
-        assertThat(mPreference.getEntryValues())
-                .asList()
-                .doesNotContain(
-                        String.valueOf(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA));
-    }
-
-    @Test
-    public void updateState_GlobalDisAllowed5g_SelectOnGlobal() {
-        mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
-        mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
-        mController.init(mLifecycle, SUB_ID);
-        mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
-                TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
-
-        mController.updateState(mPreference);
-
-        assertThat(mPreference.getValue()).isEqualTo(
-                String.valueOf(
-                        TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
-    }
-
-    @Test
     public void updateState_updateByNetworkMode() {
         mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA);
         Settings.Global.putInt(mContext.getContentResolver(),
@@ -351,10 +279,6 @@
         }
     }
 
-    private void mockAllowedNetworkTypes(long allowedNetworkType) {
-        doReturn(allowedNetworkType).when(mTelephonyManager).getAllowedNetworkTypes();
-    }
-
     private void mockAccessFamily(int networkMode) {
         doReturn(MobileNetworkUtils.getRafFromNetworkType(networkMode))
                 .when(mTelephonyManager)
