Merge "Improve CarrierPrivilegesTracker logging and dump."
diff --git a/src/java/com/android/internal/telephony/NetworkTypeController.java b/src/java/com/android/internal/telephony/NetworkTypeController.java
index 9859f69..2a8f74b 100644
--- a/src/java/com/android/internal/telephony/NetworkTypeController.java
+++ b/src/java/com/android/internal/telephony/NetworkTypeController.java
@@ -505,6 +505,8 @@
                         transitionTo(mNrConnectedState);
                     } else if (isLte(rat) && isNrNotRestricted()) {
                         transitionWithTimerTo(isDataActive() ? mLteConnectedState : mIdleState);
+                    } else {
+                        updateOverrideNetworkType();
                     }
                     break;
                 case EVENT_NR_STATE_CHANGED:
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 5afce92..cc4b0fc 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -209,8 +209,10 @@
     //***** Instance Variables
 
     @UnsupportedAppUsage
-    final WakeLock mWakeLock;           // Wake lock associated with request/response
-    final WakeLock mAckWakeLock;        // Wake lock associated with ack sent
+    @VisibleForTesting
+    public final WakeLock mWakeLock;           // Wake lock associated with request/response
+    @VisibleForTesting
+    public final WakeLock mAckWakeLock;        // Wake lock associated with ack sent
     final int mWakeLockTimeout;         // Timeout associated with request/response
     final int mAckWakeLockTimeout;      // Timeout associated with ack sent
     // The number of wakelock requests currently active.  Don't release the lock
diff --git a/src/java/com/android/internal/telephony/TelephonyTester.java b/src/java/com/android/internal/telephony/TelephonyTester.java
index 5e9a621..e1ada1d 100644
--- a/src/java/com/android/internal/telephony/TelephonyTester.java
+++ b/src/java/com/android/internal/telephony/TelephonyTester.java
@@ -144,6 +144,7 @@
     private static final String EXTRA_NR_FREQUENCY_RANGE = "nr_frequency_range";
     private static final String EXTRA_NR_STATE = "nr_state";
     private static final String EXTRA_OPERATOR = "operator";
+    private static final String EXTRA_OPERATOR_RAW = "operator_raw";
 
     private static final String ACTION_RESET = "reset";
 
@@ -403,6 +404,12 @@
             ss.setOperatorName(operator, operator, "");
             log("Override operator with " + operator);
         }
+        if (mServiceStateTestIntent.hasExtra(EXTRA_OPERATOR_RAW)) {
+            String operator_raw = mServiceStateTestIntent.getStringExtra(EXTRA_OPERATOR_RAW);
+            ss.setOperatorAlphaLongRaw(operator_raw);
+            ss.setOperatorAlphaShortRaw(operator_raw);
+            log("Override operator_raw with " + operator_raw);
+        }
         if (mServiceStateTestIntent.hasExtra(EXTRA_NR_FREQUENCY_RANGE)) {
             ss.setNrFrequencyRange(mServiceStateTestIntent.getIntExtra(EXTRA_NR_FREQUENCY_RANGE,
                     ServiceState.FREQUENCY_RANGE_UNKNOWN));
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index 719712b..9e0f3f1 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -454,8 +454,26 @@
         return mApnSetting;
     }
 
-    void setLinkPropertiesHttpProxy(ProxyInfo proxy) {
-        mLinkProperties.setHttpProxy(proxy);
+    /**
+     * Update http proxy of link properties based on current apn setting
+     */
+    private void updateLinkPropertiesHttpProxy() {
+        if (mApnSetting == null
+                || TextUtils.isEmpty(mApnSetting.getProxyAddressAsString())) {
+            return;
+        }
+        try {
+            int port = mApnSetting.getProxyPort();
+            if (port == -1) {
+                port = 8080;
+            }
+            ProxyInfo proxy = ProxyInfo.buildDirectProxy(
+                    mApnSetting.getProxyAddressAsString(), port);
+            mLinkProperties.setHttpProxy(proxy);
+        } catch (NumberFormatException e) {
+            loge("onDataSetupComplete: NumberFormatException making ProxyProperties ("
+                    + mApnSetting.getProxyPort() + "): " + e);
+        }
     }
 
     public static class UpdateLinkPropertyResult {
@@ -2189,7 +2207,7 @@
                 final NetworkProvider provider = (null == factory) ? null : factory.getProvider();
 
                 mDisabledApnTypeBitMask |= getDisallowedApnTypes();
-
+                updateLinkPropertiesHttpProxy();
                 mNetworkAgent = new DcNetworkAgent(DataConnection.this,
                         mPhone, mNetworkInfo, mScore, configBuilder.build(), provider,
                         mTransportType);
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
index 31a1ccf..7319ad4 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
@@ -48,7 +48,6 @@
 import android.net.NetworkCapabilities;
 import android.net.NetworkPolicyManager;
 import android.net.NetworkRequest;
-import android.net.ProxyInfo;
 import android.net.TrafficStats;
 import android.net.Uri;
 import android.os.AsyncResult;
@@ -654,6 +653,7 @@
     private final int mTransportType;
 
     private DataStallRecoveryHandler mDsRecoveryHandler;
+    private HandlerThread mHandlerThread;
 
     /**
      * Request network completion message map. Key is the APN type, value is the list of completion
@@ -710,9 +710,9 @@
                 .getSystemService(Context.NETWORK_POLICY_SERVICE);
         mNetworkPolicyManager.registerSubscriptionCallback(mSubscriptionCallback);
 
-        HandlerThread dcHandlerThread = new HandlerThread("DcHandlerThread");
-        dcHandlerThread.start();
-        Handler dcHandler = new Handler(dcHandlerThread.getLooper());
+        mHandlerThread = new HandlerThread("DcHandlerThread");
+        mHandlerThread.start();
+        Handler dcHandler = new Handler(mHandlerThread.getLooper());
         mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager, dcHandler, tagSuffix);
         mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);
 
@@ -829,6 +829,16 @@
         destroyDataConnections();
     }
 
+    /**
+     * Stop the internal handler thread
+     *
+     * TESTING ONLY
+     */
+    @VisibleForTesting
+    public void stopHandlerThread() {
+        mHandlerThread.quit();
+    }
+
     private void unregisterForAllEvents() {
          //Unregister for all events
         if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
@@ -2828,20 +2838,6 @@
                     log("onDataSetupComplete: success apn=" + (apn == null ? "unknown"
                             : apn.getApnName()));
                 }
-                if (apn != null && !TextUtils.isEmpty(apn.getProxyAddressAsString())) {
-                    try {
-                        int port = apn.getProxyPort();
-                        if (port == -1) {
-                            port = 8080;
-                        }
-                        ProxyInfo proxy = ProxyInfo.buildDirectProxy(
-                                apn.getProxyAddressAsString(), port);
-                        dataConnection.setLinkPropertiesHttpProxy(proxy);
-                    } catch (NumberFormatException e) {
-                        loge("onDataSetupComplete: NumberFormatException making ProxyProperties ("
-                                + apn.getProxyPort() + "): " + e);
-                    }
-                }
 
                 // everything is setup
                 if (TextUtils.equals(apnContext.getApnType(), PhoneConstants.APN_TYPE_DEFAULT)
diff --git a/src/java/com/android/internal/telephony/uicc/UiccController.java b/src/java/com/android/internal/telephony/uicc/UiccController.java
index 496d2f3..235bf43 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccController.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccController.java
@@ -1028,6 +1028,9 @@
                 boolean defaultEuiccCardIdIsStillInserted = false;
                 String cardString = mCardStrings.get(mDefaultEuiccCardId);
                 for (UiccSlot slot : mUiccSlots) {
+                    if (slot.getUiccCard() == null) {
+                        continue;
+                    }
                     if (cardString.equals(
                             IccUtils.stripTrailingFs(slot.getUiccCard().getCardId()))) {
                         defaultEuiccCardIdIsStillInserted = true;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkServiceTest.java b/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkServiceTest.java
index f80cf04..e2bacc2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkServiceTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkServiceTest.java
@@ -89,6 +89,9 @@
 
     @After
     public void tearDown() throws Exception {
+        if (mCellularNetworkService != null) {
+            mCellularNetworkService.onDestroy();
+        }
         super.tearDown();
     }
 
diff --git a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
index e080820..52cb5ac 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
@@ -311,6 +311,8 @@
 
     @After
     public void tearDown() throws Exception {
+        mRILUnderTest.mWakeLock.release();
+        mRILUnderTest.mAckWakeLock.release();
         super.tearDown();
     }
 
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index 184ab54..0d6ff15 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -334,6 +334,9 @@
         sst = null;
         mSSTTestHandler.quit();
         mSSTTestHandler.join();
+        if (mCellularNetworkService != null) {
+            mCellularNetworkService.onDestroy();
+        }
         super.tearDown();
     }
 
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java
index 32b98d1..7111a14 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SmsDispatchersControllerTest.java
@@ -64,6 +64,7 @@
 
     @After
     public void tearDown() throws Exception {
+        mSmsDispatchersController.dispose();
         mSmsDispatchersController = null;
         super.tearDown();
     }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
index 87804b0..9f00c7b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
@@ -670,6 +670,7 @@
         for (TestableLooper looper : mTestableLoopers) {
             looper.destroy();
         }
+        TestableLooper.remove(TelephonyTest.this);
 
         mSimulatedCommands.dispose();
         SharedPreferences sharedPreferences = mContext.getSharedPreferences((String) null, 0);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java
index 15127d0..8b35d31 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java
@@ -102,6 +102,7 @@
     private DataConnection mDc;
     private DataConnectionTestHandler mDataConnectionTestHandler;
     private DcController mDcc;
+    private CellularDataService mCellularDataService;
 
     private ApnSetting mApn1 = ApnSetting.makeApnSetting(
             2163,                   // id
@@ -264,7 +265,7 @@
     }
 
     private void addDataService() {
-        CellularDataService cellularDataService = new CellularDataService();
+        mCellularDataService = new CellularDataService();
         ServiceInfo serviceInfo = new ServiceInfo();
         serviceInfo.packageName = "com.android.phone";
         serviceInfo.permission = "android.permission.BIND_TELEPHONY_DATA_SERVICE";
@@ -273,7 +274,7 @@
                 DataService.SERVICE_INTERFACE,
                 null,
                 "com.android.phone",
-                cellularDataService.mBinder,
+                mCellularDataService.mBinder,
                 serviceInfo,
                 filter);
     }
@@ -327,6 +328,7 @@
         mDc = null;
         mDcc = null;
         mDataConnectionTestHandler.quit();
+        mCellularDataService.onDestroy();
         super.tearDown();
     }
 
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
index f79e511..0cb1954 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java
@@ -166,8 +166,10 @@
 
     private Message mMessage;
 
+    private CellularDataService mCellularDataService;
+
     private void addDataService() {
-        CellularDataService cellularDataService = new CellularDataService();
+        mCellularDataService = new CellularDataService();
         ServiceInfo serviceInfo = new ServiceInfo();
         serviceInfo.packageName = "com.android.phone";
         serviceInfo.permission = "android.permission.BIND_TELEPHONY_DATA_SERVICE";
@@ -176,7 +178,7 @@
                 DataService.SERVICE_INTERFACE,
                 null,
                 "com.android.phone",
-                cellularDataService.mBinder,
+                mCellularDataService.mBinder,
                 serviceInfo,
                 filter);
     }
@@ -542,8 +544,10 @@
     public void tearDown() throws Exception {
         logd("DcTrackerTest -tearDown");
         mDct.removeCallbacksAndMessages(null);
+        mDct.stopHandlerThread();
         mDct = null;
         mDcTrackerTestHandler.quit();
+        mCellularDataService.onDestroy();
         waitForMs(100);
         super.tearDown();
     }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java
index b99749c..6f0a170 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java
@@ -244,6 +244,7 @@
             i++;
         }
         assertFalse(mGsmInboundSmsHandler.getWakeLock().isHeld());
+        mGsmInboundSmsHandler.quit();
         mGsmInboundSmsHandler = null;
         mContentProvider.shutdown();
         super.tearDown();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ims/ImsManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ims/ImsManagerTest.java
index f09140e..7088024 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ims/ImsManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ims/ImsManagerTest.java
@@ -873,6 +873,7 @@
             fail("failed with " + ex);
         }
 
+        ((ImsManager.ImsExecutorFactory) imsManager.mExecutorFactory).destroy();
         imsManager.mExecutorFactory = Runnable::run;
 
         return imsManager;