Merge "Added global retry support"
diff --git a/jarjar-rules-shared.txt b/jarjar-rules-shared.txt
index 2bac95f..5635b18 100644
--- a/jarjar-rules-shared.txt
+++ b/jarjar-rules-shared.txt
@@ -1,5 +1,5 @@
 rule android.net.NetworkFactory* com.android.internal.telephony.NetworkFactory@1
-rule android.os.BasicShellCommandHandler* com.android.internal.telephony.BasicShellCommandHandler@1
+rule com.android.modules.utils.** com.android.internal.telephony.@1
 rule android.os.RegistrantList* com.android.internal.telephony.RegistrantList@1
 rule android.os.Registrant* com.android.internal.telephony.Registrant@1
 rule android.hidl.** android.internal.hidl.@1
diff --git a/src/java/com/android/internal/telephony/NetworkTypeController.java b/src/java/com/android/internal/telephony/NetworkTypeController.java
index 14b38da..25b6fc0 100644
--- a/src/java/com/android/internal/telephony/NetworkTypeController.java
+++ b/src/java/com/android/internal/telephony/NetworkTypeController.java
@@ -50,6 +50,7 @@
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.IntStream;
 
 /**
  * The NetworkTypeController evaluates the override network type of {@link TelephonyDisplayInfo}
@@ -135,6 +136,7 @@
     private boolean mIsPrimaryTimerActive;
     private boolean mIsSecondaryTimerActive;
     private boolean mIsTimerResetEnabledForLegacyStateRRCIdle;
+    private int mLtePlusThresholdBandwidth;
     private String mPrimaryTimerState;
     private String mSecondaryTimerState;
     private String mPreviousState;
@@ -215,6 +217,8 @@
         mIsTimerResetEnabledForLegacyStateRRCIdle =
                 CarrierConfigManager.getDefaultConfig().getBoolean(
                         CarrierConfigManager.KEY_NR_TIMERS_RESET_IF_NON_ENDC_AND_RRC_IDLE_BOOL);
+        mLtePlusThresholdBandwidth = CarrierConfigManager.getDefaultConfig().getInt(
+                CarrierConfigManager.KEY_LTE_PLUS_THRESHOLD_BANDWIDTH_KHZ_INT);
 
         CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext()
                 .getSystemService(Context.CARRIER_CONFIG_SERVICE);
@@ -242,6 +246,9 @@
                 }
                 mIsTimerResetEnabledForLegacyStateRRCIdle = b.getBoolean(
                         CarrierConfigManager.KEY_NR_TIMERS_RESET_IF_NON_ENDC_AND_RRC_IDLE_BOOL);
+                mLtePlusThresholdBandwidth = b.getInt(
+                        CarrierConfigManager.KEY_LTE_PLUS_THRESHOLD_BANDWIDTH_KHZ_INT,
+                        mLtePlusThresholdBandwidth);
             }
         }
         createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule);
@@ -400,8 +407,10 @@
 
     private @Annotation.OverrideNetworkType int getLteDisplayType() {
         int value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
-        if (mPhone.getServiceState().getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE_CA
-                || mPhone.getServiceState().isUsingCarrierAggregation()) {
+        if ((mPhone.getServiceState().getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE_CA
+                || mPhone.getServiceState().isUsingCarrierAggregation())
+                && (IntStream.of(mPhone.getServiceState().getCellBandwidths()).sum()
+                        > mLtePlusThresholdBandwidth)) {
             value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA;
         }
         if (isLteEnhancedAvailable()) {
@@ -497,7 +506,8 @@
                     break;
                 case EVENT_PREFERRED_NETWORK_MODE_CHANGED:
                     resetAllTimers();
-                    transitionToCurrentState();
+                    // Don't transition to current state. If anything significant changes,
+                    // a new broadcast will be sent to update the state then.
                     break;
                 default:
                     throw new RuntimeException("Received invalid event: " + msg.what);
@@ -1059,9 +1069,13 @@
         pw.println("mIsPhysicalChannelConfigOn=" + mIsPhysicalChannelConfigOn);
         pw.println("mIsPrimaryTimerActive=" + mIsPrimaryTimerActive);
         pw.println("mIsSecondaryTimerActive=" + mIsSecondaryTimerActive);
+        pw.println("mIsTimerRestEnabledForLegacyStateRRCIdle="
+                + mIsTimerResetEnabledForLegacyStateRRCIdle);
+        pw.println("mLtePlusThresholdBandwidth=" + mLtePlusThresholdBandwidth);
         pw.println("mPrimaryTimerState=" + mPrimaryTimerState);
         pw.println("mSecondaryTimerState=" + mSecondaryTimerState);
         pw.println("mPreviousState=" + mPreviousState);
+        pw.println("mPhysicalLinkState=" + mPhysicalLinkState);
         pw.decreaseIndent();
         pw.flush();
     }
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 031a07a..44870e8 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -2130,15 +2130,24 @@
     }
 
     /**
-     *  Query the CDMA roaming preference setting
+     * Query the CDMA roaming preference setting.
      *
-     * @param response is callback message to report one of  CDMA_RM_*
+     * @param response is callback message to report one of TelephonyManager#CDMA_ROAMING_MODE_*
      */
     public void queryCdmaRoamingPreference(Message response) {
         mCi.queryCdmaRoamingPreference(response);
     }
 
     /**
+     * Get the CDMA subscription mode setting.
+     *
+     * @param response is callback message to report one of TelephonyManager#CDMA_SUBSCRIPTION_*
+     */
+    public void queryCdmaSubscriptionMode(Message response) {
+        mCi.getCdmaSubscriptionSource(response);
+    }
+
+    /**
      * Get current signal strength. No change notification available on this
      * interface. Use <code>PhoneStateNotifier</code> or an equivalent.
      * An ASU is 0-31 or -1 if unknown (for GSM, dBm = -113 - 2 * asu).
@@ -2167,8 +2176,8 @@
     }
 
     /**
-     *  Requests to set the CDMA roaming preference
-     * @param cdmaRoamingType one of  CDMA_RM_*
+     * Requests to set the CDMA roaming preference
+     * @param cdmaRoamingType one of TelephonyManager#CDMA_ROAMING_MODE_*
      * @param response is callback message
      */
     public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
@@ -2176,11 +2185,11 @@
     }
 
     /**
-     *  Requests to set the CDMA subscription mode
-     * @param cdmaSubscriptionType one of  CDMA_SUBSCRIPTION_*
+     * Requests to set the CDMA subscription mode
+     * @param cdmaSubscriptionType one of TelephonyManager#CDMA_SUBSCRIPTION_*
      * @param response is callback message
      */
-    public void setCdmaSubscription(int cdmaSubscriptionType, Message response) {
+    public void setCdmaSubscriptionMode(int cdmaSubscriptionType, Message response) {
         mCi.setCdmaSubscriptionSource(cdmaSubscriptionType, response);
     }
 
diff --git a/src/java/com/android/internal/telephony/cdma/EriInfo.java b/src/java/com/android/internal/telephony/cdma/EriInfo.java
index bd27f94..bff4b0e 100644
--- a/src/java/com/android/internal/telephony/cdma/EriInfo.java
+++ b/src/java/com/android/internal/telephony/cdma/EriInfo.java
@@ -16,16 +16,16 @@
 
 package com.android.internal.telephony.cdma;
 
-import android.telephony.CdmaEriInformation;
+import android.telephony.TelephonyManager;
 
 public final class EriInfo {
 
-    public static final int ROAMING_INDICATOR_ON    = CdmaEriInformation.ERI_ON;
-    public static final int ROAMING_INDICATOR_OFF   = CdmaEriInformation.ERI_OFF;
-    public static final int ROAMING_INDICATOR_FLASH = CdmaEriInformation.ERI_FLASH;
+    public static final int ROAMING_INDICATOR_ON    = TelephonyManager.ERI_ON;
+    public static final int ROAMING_INDICATOR_OFF   = TelephonyManager.ERI_OFF;
+    public static final int ROAMING_INDICATOR_FLASH = TelephonyManager.ERI_FLASH;
 
-    public static final int ROAMING_ICON_MODE_NORMAL    = CdmaEriInformation.ERI_ICON_MODE_NORMAL;
-    public static final int ROAMING_ICON_MODE_FLASH     = CdmaEriInformation.ERI_ICON_MODE_FLASH;
+    public static final int ROAMING_ICON_MODE_NORMAL    = TelephonyManager.ERI_ICON_MODE_NORMAL;
+    public static final int ROAMING_ICON_MODE_FLASH     = TelephonyManager.ERI_ICON_MODE_FLASH;
 
     public int roamingIndicator;
     public int iconIndex;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
index 001ba39..244839f 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
@@ -150,8 +150,15 @@
         assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
                 mNetworkTypeController.getOverrideNetworkType());
 
-        // LTE CA
+        // LTE CA at bandwidth threshold
         doReturn(true).when(mServiceState).isUsingCarrierAggregation();
+        doReturn(new int[] {20000}).when(mServiceState).getCellBandwidths();
+        updateOverrideNetworkType();
+        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
+                mNetworkTypeController.getOverrideNetworkType());
+
+        // LTE CA above bandwidth threshold
+        doReturn(new int[] {20000, 1400}).when(mServiceState).getCellBandwidths();
         updateOverrideNetworkType();
         assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA,
                 mNetworkTypeController.getOverrideNetworkType());
@@ -343,6 +350,11 @@
 
         mNetworkTypeController.sendMessage(EVENT_PREFERRED_NETWORK_MODE_CHANGED);
         processAllMessages();
+        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
+                mNetworkTypeController.getOverrideNetworkType());
+
+        mNetworkTypeController.sendMessage(EVENT_DATA_RAT_CHANGED);
+        processAllMessages();
         assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
                 mNetworkTypeController.getOverrideNetworkType());
     }