merge in lmp-mr1-nova-release history after reset to lmp-mr1-dev
diff --git a/src/java/com/android/internal/telephony/MccTable.java b/src/java/com/android/internal/telephony/MccTable.java
index 95f9943..91355ae 100644
--- a/src/java/com/android/internal/telephony/MccTable.java
+++ b/src/java/com/android/internal/telephony/MccTable.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.os.RemoteException;
 import android.os.SystemProperties;
+import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Slog;
@@ -223,6 +224,29 @@
         }
     }
 
+    // Bug 19232829: It is possible to get through provisioning without setting up a persistent
+    // locale value. We don't modify the locale if the device has completed "provisioning" because
+    // we don't want to change the locale if the user inserts a new SIM or a new version of Android
+    // is better at recognizing MCC values than an older version.
+    private static boolean canUpdateLocale(Context context) {
+        return !(userHasPersistedLocale() || isDeviceProvisioned(context));
+    }
+
+    private static boolean userHasPersistedLocale() {
+        String persistSysLanguage = SystemProperties.get("persist.sys.language", "");
+        String persistSysCountry = SystemProperties.get("persist.sys.country", "");
+        return !(persistSysLanguage.isEmpty() && persistSysCountry.isEmpty());
+    }
+
+    private static boolean isDeviceProvisioned(Context context) {
+        try {
+            return Settings.Global.getInt(
+                    context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED) != 0;
+        } catch (Settings.SettingNotFoundException e) {
+            return false;
+        }
+    }
+
     /**
      * Return Locale for the language and country or null if no good match.
      *
@@ -243,22 +267,12 @@
         }
 
         // Check whether a developer is trying to test an arbitrary MCC.
-        boolean debuggingMccOverride = false;
-        if (Build.IS_DEBUGGABLE) {
-            String overrideMcc = SystemProperties.get("persist.sys.override_mcc", "");
-            if (!overrideMcc.isEmpty()) {
-                debuggingMccOverride = true;
-            }
-        }
+        boolean debuggingMccOverride = isDebuggingMccOverride();
 
         // If this is a regular user and they already have a persisted locale, we're done.
-        if (!debuggingMccOverride) {
-            String persistSysLanguage = SystemProperties.get("persist.sys.language", "");
-            String persistSysCountry = SystemProperties.get("persist.sys.country", "");
-            if (!(persistSysLanguage.isEmpty() && persistSysCountry.isEmpty())) {
-                Slog.d(LOG_TAG, "getLocaleForLanguageCountry: skipping already persisted");
-                return null;
-            }
+        if (!(debuggingMccOverride || canUpdateLocale(context))) {
+            Slog.d(LOG_TAG, "getLocaleForLanguageCountry: not permitted to update locale");
+            return null;
         }
 
         // Find the best match we actually have a localization for.
@@ -315,6 +329,16 @@
         return null;
     }
 
+    private static boolean isDebuggingMccOverride() {
+        if (Build.IS_DEBUGGABLE) {
+            String overrideMcc = SystemProperties.get("persist.sys.override_mcc", "");
+            if (!overrideMcc.isEmpty()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Utility code to set the system locale if it's not set already
      * @param context Context to act on.
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 32966ae..3d2d304 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -109,7 +109,6 @@
     static final String REASON_CONNECTED = "connected";
     static final String REASON_SINGLE_PDN_ARBITRATION = "SinglePdnArbitration";
     static final String REASON_DATA_SPECIFIC_DISABLED = "specificDisabled";
-    static final String REASON_SIM_NOT_READY = "simNotReady";
 
     // Used for band mode selection methods
     static final int BM_UNSPECIFIED = 0; // selected by baseband automatically
diff --git a/src/java/com/android/internal/telephony/PhoneBase.java b/src/java/com/android/internal/telephony/PhoneBase.java
index ce69689..e1444ee 100644
--- a/src/java/com/android/internal/telephony/PhoneBase.java
+++ b/src/java/com/android/internal/telephony/PhoneBase.java
@@ -425,7 +425,13 @@
         mUiccController = UiccController.getInstance();
         mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
 
-        // Monitor IMS service
+        // Monitor IMS service - but first poll to see if already up (could miss
+        // intent)
+        ImsManager imsManager = ImsManager.getInstance(mContext, getPhoneId());
+        if (imsManager != null && imsManager.isServiceAvailable()) {
+            mImsServiceReady = true;
+            updateImsPhone();
+        }
         IntentFilter filter = new IntentFilter();
         filter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);
         filter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);
diff --git a/src/java/com/android/internal/telephony/SubscriptionController.java b/src/java/com/android/internal/telephony/SubscriptionController.java
index 562f22b..57172bb 100644
--- a/src/java/com/android/internal/telephony/SubscriptionController.java
+++ b/src/java/com/android/internal/telephony/SubscriptionController.java
@@ -590,8 +590,6 @@
         }
 
         String nameToSet;
-        String CarrierName = mTelephonyManager.getSimOperatorNumericForSubscription(subIds[0]);
-        if (DBG) logdl("[addSubInfoRecord] CarrierName = " + CarrierName);
         String simCarrierName = mTelephonyManager.getSimOperatorNameForSubscription(subIds[0]);
 
         if (!TextUtils.isEmpty(simCarrierName)) {
@@ -618,9 +616,7 @@
                 value.put(SubscriptionManager.COLOR, color);
                 value.put(SubscriptionManager.SIM_SLOT_INDEX, slotId);
                 value.put(SubscriptionManager.DISPLAY_NAME, nameToSet);
-                value.put(SubscriptionManager.CARRIER_NAME,
-                        !TextUtils.isEmpty(simCarrierName) ? simCarrierName :
-                        mContext.getString(com.android.internal.R.string.unknownName));
+                value.put(SubscriptionManager.CARRIER_NAME, "");
                 Uri uri = resolver.insert(SubscriptionManager.CONTENT_URI, value);
                 if (DBG) logdl("[addSubInfoRecord] New record created: " + uri);
             } else {
@@ -637,10 +633,6 @@
                     value.put(SubscriptionManager.DISPLAY_NAME, nameToSet);
                 }
 
-                if (!TextUtils.isEmpty(simCarrierName)) {
-                    value.put(SubscriptionManager.CARRIER_NAME, simCarrierName);
-                }
-
                 if (value.size() > 0) {
                     resolver.update(SubscriptionManager.CONTENT_URI, value,
                             SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID +
@@ -736,9 +728,12 @@
                     SubscriptionManager.CONTENT_URI.getAuthority(), 0) == null ||
                     subIds == null ||
                     !SubscriptionManager.isValidSubscriptionId(subIds[0])) {
-                // No place to store this info, we are done.
+                // No place to store this info. Notify registrants of the change anyway as they
+                // might retrieve the SPN/PLMN text from the SST sticky broadcast.
                 // TODO: This can be removed once SubscriptionController is not running on devices
                 // that don't need it, such as TVs.
+                if (DBG) logd("[setPlmnSpn] No valid subscription to store info");
+                notifySubscriptionInfoChanged();
                 return false;
             }
             String carrierText = "";
diff --git a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
index 7adf209..736cf7c 100644
--- a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
+++ b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
@@ -328,8 +328,6 @@
 
             SubscriptionInfo subInfo = mSubscriptionManager.getActiveSubscriptionInfo(subId);
             String nameToSet;
-            String CarrierName = tm.getSimOperatorNumericForSubscription(subId);
-            logd("CarrierName = " + CarrierName);
             String simCarrierName = tm.getSimOperatorNameForSubscription(subId);
             ContentValues name = new ContentValues(1);
 
@@ -342,14 +340,10 @@
                 }
                 name.put(SubscriptionManager.DISPLAY_NAME, nameToSet);
                 logd("sim name = " + nameToSet);
+                contentResolver.update(SubscriptionManager.CONTENT_URI, name,
+                        SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID
+                        + "=" + Long.toString(subId), null);
             }
-            name.put(SubscriptionManager.CARRIER_NAME,
-                    !TextUtils.isEmpty(simCarrierName) ? simCarrierName :
-                    mContext.getString(com.android.internal.R.string.unknownName));
-            contentResolver.update(SubscriptionManager.CONTENT_URI, name,
-                    SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID
-                    + "=" + Long.toString(subId), null);
-            logd("carrier name = " + simCarrierName);
 
             /* Update preferred network type and network selection mode on SIM change.
              * Storing last subId in SharedPreference for now to detect SIM change. */
diff --git a/src/java/com/android/internal/telephony/cat/CatService.java b/src/java/com/android/internal/telephony/cat/CatService.java
index ad8b4e2..1ffe08c 100644
--- a/src/java/com/android/internal/telephony/cat/CatService.java
+++ b/src/java/com/android/internal/telephony/cat/CatService.java
@@ -362,14 +362,6 @@
     private void handleCommand(CommandParams cmdParams, boolean isProactiveCmd) {
         CatLog.d(this, cmdParams.getCommandType().name());
 
-        // Log all proactive commands.
-        if (isProactiveCmd) {
-            if (mUiccController != null) {
-                mUiccController.addCardLog("ProactiveCommand mSlotId=" + mSlotId +
-                        " cmdParams=" + cmdParams);
-            }
-        }
-
         CharSequence message;
         CatCmdMessage cmdMsg = new CatCmdMessage(cmdParams);
         switch (cmdParams.getCommandType()) {
diff --git a/src/java/com/android/internal/telephony/cat/CommandParams.java b/src/java/com/android/internal/telephony/cat/CommandParams.java
index 93520f7..2f9d0fd 100644
--- a/src/java/com/android/internal/telephony/cat/CommandParams.java
+++ b/src/java/com/android/internal/telephony/cat/CommandParams.java
@@ -57,11 +57,6 @@
         }
         return false;
     }
-
-    @Override
-    public String toString() {
-        return "TextMessage=" + mTextMsg + " " + super.toString();
-    }
 }
 
 class LaunchBrowserParams extends CommandParams {
@@ -85,11 +80,6 @@
         }
         return false;
     }
-
-    @Override
-    public String toString() {
-        return "TextMessage=" + mConfirmMsg + " " + super.toString();
-    }
 }
 
 class SetEventListParams extends CommandParams {
diff --git a/src/java/com/android/internal/telephony/cat/TextMessage.java b/src/java/com/android/internal/telephony/cat/TextMessage.java
index 926c927..515f6c5 100644
--- a/src/java/com/android/internal/telephony/cat/TextMessage.java
+++ b/src/java/com/android/internal/telephony/cat/TextMessage.java
@@ -72,12 +72,4 @@
             return new TextMessage[size];
         }
     };
-
-    @Override
-    public String toString() {
-        return "title=" + title + " text=" + text + " icon=" + icon +
-            " iconSelfExplanatory=" + iconSelfExplanatory + " isHighPriority=" +
-            isHighPriority + " responseNeeded=" + responseNeeded + " userClear=" +
-            userClear + " duration=" + duration;
-    }
-}
+}
\ No newline at end of file
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
index 5a456d0..60bc558 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
@@ -1528,14 +1528,6 @@
         setupDataOnConnectableApns(Phone.REASON_SIM_LOADED);
     }
 
-    private void onSimNotReady() {
-        if (DBG) log("onSimNotReady");
-
-        cleanUpAllConnections(true, Phone.REASON_SIM_NOT_READY);
-        mAllApnSettings = null;
-        mAutoAttachOnCreationConfig = false;
-    }
-
     @Override
     protected void onSetDependencyMet(String apnType, boolean met) {
         // don't allow users to tweak hipri to work around default dependency not met
@@ -2779,8 +2771,6 @@
                 mIccRecords.set(newIccRecords);
                 newIccRecords.registerForRecordsLoaded(
                         this, DctConstants.EVENT_RECORDS_LOADED, null);
-            } else {
-                onSimNotReady();
             }
         }
     }
diff --git a/src/java/com/android/internal/telephony/uicc/UiccCard.java b/src/java/com/android/internal/telephony/uicc/UiccCard.java
index f77a16c..e2b6689 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccCard.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccCard.java
@@ -458,25 +458,19 @@
 
     /**
      * Resets the application with the input AID. Returns true if any changes were made.
-     *
-     * A null aid implies a card level reset - all applications must be reset.
      */
     public boolean resetAppWithAid(String aid) {
         synchronized (mLock) {
-            boolean changed = false;
             for (int i = 0; i < mUiccApplications.length; i++) {
-                if (mUiccApplications[i] != null &&
-                    (aid == null || aid.equals(mUiccApplications[i].getAid()))) {
+                if (mUiccApplications[i] != null && aid.equals(mUiccApplications[i].getAid())) {
                     // Delete removed applications
                     mUiccApplications[i].dispose();
                     mUiccApplications[i] = null;
-                    changed = true;
+                    return true;
                 }
             }
-            return changed;
+            return false;
         }
-        // TODO: For a card level notification, we should delete the CarrierPrivilegeRules and the
-        // CAT service.
     }
 
     /**
diff --git a/src/java/com/android/internal/telephony/uicc/UiccController.java b/src/java/com/android/internal/telephony/uicc/UiccController.java
index 4f3b58b..80893f2 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccController.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccController.java
@@ -25,7 +25,6 @@
 import android.os.SystemProperties;
 import android.telephony.TelephonyManager;
 import android.telephony.Rlog;
-import android.text.format.Time;
 
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.PhoneConstants;
@@ -33,7 +32,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.util.LinkedList;
 
 /**
  * This class is responsible for keeping all knowledge about
@@ -100,10 +98,6 @@
 
     protected RegistrantList mIccChangedRegistrants = new RegistrantList();
 
-    // Logging for dumpsys. Useful in cases when the cards run into errors.
-    private static final int MAX_PROACTIVE_COMMANDS_TO_LOG = 20;
-    private LinkedList<String> mCardLogs = new LinkedList<String>();
-
     public static UiccController make(Context c, CommandsInterface[] ci) {
         synchronized (mLock) {
             if (mInstance != null) {
@@ -318,13 +312,12 @@
             return;
         }
 
-        if (resp.refreshResult != IccRefreshResponse.REFRESH_RESULT_RESET) {
-          Rlog.d(LOG_TAG, "Ignoring non reset refresh: " + resp);
-          return;
+        if (resp.refreshResult != IccRefreshResponse.REFRESH_RESULT_RESET ||
+            resp.aid == null) {
+            Rlog.d(LOG_TAG, "Ignoring reset: " + resp);
+            return;
         }
 
-        Rlog.d(LOG_TAG, "Handling refresh reset: " + resp);
-
         boolean changed = mUiccCards[index].resetAppWithAid(resp.aid);
         if (changed) {
             boolean requirePowerOffOnSimRefreshReset = mContext.getResources().getBoolean(
@@ -336,6 +329,8 @@
             }
             mIccChangedRegistrants.notifyRegistrants(new AsyncResult(null, index, null));
         }
+        // TODO: For a card level notification, we should delete the CarrierPrivilegeRules and the
+        // CAT service.
     }
 
     private boolean isValidCardIndex(int index) {
@@ -346,15 +341,6 @@
         Rlog.d(LOG_TAG, string);
     }
 
-    // TODO: This is hacky. We need a better way of saving the logs.
-    public void addCardLog(String data) {
-        Time t = new Time();
-        t.setToNow();
-        mCardLogs.addLast(t.format("%m-%d %H:%M:%S") + " " + data);
-        if (mCardLogs.size() > MAX_PROACTIVE_COMMANDS_TO_LOG) {
-            mCardLogs.removeFirst();
-        }
-    }
 
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("UiccController: " + this);
@@ -376,9 +362,5 @@
                 mUiccCards[i].dump(fd, pw, args);
             }
         }
-        pw.println("mCardLogs: ");
-        for (int i = 0; i < mCardLogs.size(); ++i) {
-            pw.println("  " + mCardLogs.get(i));
-        }
     }
 }