Merge "Populate 'hasKnownUserIntentEmergency' in RIL framework"
diff --git a/src/java/com/android/internal/telephony/LocaleTracker.java b/src/java/com/android/internal/telephony/LocaleTracker.java
index cae6cf5..f952ae4 100755
--- a/src/java/com/android/internal/telephony/LocaleTracker.java
+++ b/src/java/com/android/internal/telephony/LocaleTracker.java
@@ -417,16 +417,6 @@
             mLocalLog.log(msg);
             mCurrentCountryIso = countryIso;
 
-            // Inform EmergencyNumberTrack with the change of current Country ISO
-            if (mPhone != null && mPhone.getEmergencyNumberTracker() != null) {
-                mPhone.getEmergencyNumberTracker().updateEmergencyNumberDatabaseCountryChange(
-                        getCurrentCountry());
-                log("Notified EmergencyNumberTracker");
-            } else {
-                loge("Cannot notify EmergencyNumberTracker. Phone is null? "
-                        + Boolean.toString(mPhone == null));
-            }
-
             TelephonyManager.setTelephonyProperty(mPhone.getPhoneId(),
                     TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, mCurrentCountryIso);
 
diff --git a/src/java/com/android/internal/telephony/PhoneConfigurationManager.java b/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
index acb9f6c..2a7728b 100644
--- a/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
+++ b/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
@@ -162,12 +162,14 @@
      * @param numOfSims number of active sims we want to switch to
      */
     public void switchMultiSimConfig(int numOfSims) {
+        log("switchMultiSimConfig: with numOfSims = " + numOfSims);
         if (getStaticPhoneCapability().logicalModemList.size() < numOfSims) {
             log("switchMultiSimConfig: Phone is not capable of enabling "
                     + numOfSims + " sims, exiting!");
             return;
         }
-        if (getNumOfActiveSims() != numOfSims) {
+        if (getPhoneCount() != numOfSims) {
+            log("switchMultiSimConfig: sending the request for switching");
             Message callback = Message.obtain(
                     mHandler, EVENT_SWITCH_DSDS_CONFIG_DONE, numOfSims, 0 /**dummy arg*/);
             mRadioConfig.setModemsConfig(numOfSims, callback);
@@ -206,6 +208,7 @@
     public boolean isRebootRequiredForModemConfigChange() {
         String rebootRequired = SystemProperties.get(
                 TelephonyProperties.PROPERTY_REBOOT_REQUIRED_ON_MODEM_CHANGE);
+        log("isRebootRequiredForModemConfigChange: isRebootRequired = " + rebootRequired);
         return !rebootRequired.equals("false");
     }
 
@@ -234,6 +237,9 @@
                     + finalMultiSimConfig);
             PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
             pm.reboot("Switching to " + finalMultiSimConfig);
+        } else {
+            log("setMultiSimProperties: Rebooting is not required to switch multi-sim config to "
+                    + finalMultiSimConfig);
         }
     }
 
diff --git a/src/java/com/android/internal/telephony/RadioConfig.java b/src/java/com/android/internal/telephony/RadioConfig.java
index 6bfbcd3..ab9afec 100644
--- a/src/java/com/android/internal/telephony/RadioConfig.java
+++ b/src/java/com/android/internal/telephony/RadioConfig.java
@@ -419,7 +419,7 @@
 
             if (DBG) {
                 logd(rr.serialString() + "> " + requestToString(rr.mRequest)
-                        + "numOfLiveModems = " + numOfLiveModems);
+                        + ", numOfLiveModems = " + numOfLiveModems);
             }
 
             try {
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
index 9c2b863..303f6a9 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
@@ -16,6 +16,10 @@
 
 package com.android.internal.telephony.emergency;
 
+import android.content.Context;
+import android.location.Country;
+import android.location.CountryDetector;
+import android.location.CountryListener;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
@@ -70,6 +74,7 @@
 
     private final CommandsInterface mCi;
     private final Phone mPhone;
+    private CountryDetector mCountryDetector;
     private String mCountryIso;
 
     private static final String EMERGENCY_NUMBER_DB_ASSETS_FILE = "eccdata";
@@ -97,6 +102,17 @@
     public EmergencyNumberTracker(Phone phone, CommandsInterface ci) {
         mPhone = phone;
         mCi = ci;
+        if (mPhone != null) {
+            mCountryDetector = (CountryDetector) mPhone.getContext().getSystemService(
+                    Context.COUNTRY_DETECTOR);
+            if (mCountryDetector != null) {
+                mCountryDetector.addCountryListener(new CountryListener() {
+                    public void onCountryDetected(Country country) {
+                        updateEmergencyNumberDatabaseCountryChange(country.getCountryIso());
+                    }
+                }, getLooper());
+            }
+        }
         initializeDatabaseEmergencyNumberList();
         mCi.registerForEmergencyNumberList(this, EVENT_UNSOL_EMERGENCY_NUMBER_LIST, null);
     }
@@ -143,11 +159,23 @@
     }
 
     private void initializeDatabaseEmergencyNumberList() {
-        mCountryIso = getInitialCountryIso().toLowerCase();
-        cacheEmergencyDatabaseByCountry(mCountryIso);
+        // If country iso has been cached when listener is set, don't need to cache the initial
+        // country iso and initial database.
+        if (mCountryIso == null) {
+            mCountryIso = getInitialCountryIso().toLowerCase();
+            cacheEmergencyDatabaseByCountry(mCountryIso);
+        }
     }
 
     private String getInitialCountryIso() {
+        Country country = null;
+        if (mCountryDetector != null) {
+            country = mCountryDetector.detectCountry();
+            if (country != null) {
+                return country.getCountryIso();
+            }
+        }
+        // Fallback to Telephony's country detector if there are issues with CountryDetector
         if (mPhone != null) {
             ServiceStateTracker sst = mPhone.getServiceStateTracker();
             if (sst != null) {
@@ -216,7 +244,7 @@
                     mPhone.getContext().getAssets().open(EMERGENCY_NUMBER_DB_ASSETS_FILE));
             allEccMessages = ProtobufEccData.AllInfo.parseFrom(readInputStreamToByteArray(
                     new GZIPInputStream(inputStream)));
-            logd("Emergency database is loaded. ");
+            logd(countryIso + " emergency database is loaded. ");
             for (ProtobufEccData.CountryInfo countryEccInfo : allEccMessages.countries) {
                 if (countryEccInfo.isoCode.equals(countryIso.toUpperCase())) {
                     for (ProtobufEccData.EccInfo eccInfo : countryEccInfo.eccs) {
diff --git a/src/java/com/android/internal/telephony/ims/RcsEventQueryHelper.java b/src/java/com/android/internal/telephony/ims/RcsEventQueryHelper.java
index 995b413..60531e5 100644
--- a/src/java/com/android/internal/telephony/ims/RcsEventQueryHelper.java
+++ b/src/java/com/android/internal/telephony/ims/RcsEventQueryHelper.java
@@ -21,7 +21,6 @@
 import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_JOINED_EVENT_TYPE;
 import static android.provider.Telephony.RcsColumns.RcsEventTypes.PARTICIPANT_LEFT_EVENT_TYPE;
 import static android.provider.Telephony.RcsColumns.RcsGroupThreadColumns.RCS_GROUP_THREAD_URI;
-import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsParticipantColumns.RCS_PARTICIPANT_URI;
 import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.ALIAS_CHANGE_EVENT_URI_PART;
 import static android.provider.Telephony.RcsColumns.RcsParticipantEventColumns.NEW_ALIAS_COLUMN;
@@ -188,7 +187,7 @@
     private RcsParticipantAliasChangedEvent createNewParticipantAliasChangedEvent(Cursor cursor) {
         return new RcsParticipantAliasChangedEvent(
                 cursor.getLong(cursor.getColumnIndex(TIMESTAMP_COLUMN)),
-                cursor.getInt(cursor.getColumnIndex(RCS_PARTICIPANT_ID_COLUMN)),
+                cursor.getInt(cursor.getColumnIndex(SOURCE_PARTICIPANT_ID_COLUMN)),
                 cursor.getString(cursor.getColumnIndex(NEW_ALIAS_COLUMN)));
     }
 }
diff --git a/src/java/com/android/internal/telephony/ims/RcsMessageStoreController.java b/src/java/com/android/internal/telephony/ims/RcsMessageStoreController.java
index 9edec9a..b0bc024 100644
--- a/src/java/com/android/internal/telephony/ims/RcsMessageStoreController.java
+++ b/src/java/com/android/internal/telephony/ims/RcsMessageStoreController.java
@@ -63,6 +63,7 @@
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.DESTINATION_PARTICIPANT_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_ICON_URI_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.NEW_NAME_COLUMN;
+import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.SOURCE_PARTICIPANT_ID_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsThreadEventColumns.TIMESTAMP_COLUMN;
 import static android.provider.Telephony.RcsColumns.RcsUnifiedThreadColumns.THREAD_TYPE_GROUP;
 import static android.provider.Telephony.RcsColumns.TRANSACTION_FAILED;
@@ -210,10 +211,10 @@
     }
 
     @Override
-    public RcsMessageQueryResult getMessages(RcsMessageQueryParams queryParameters)
+    public RcsMessageQueryResult getMessages(RcsMessageQueryParams queryParams)
             throws RemoteException {
         Bundle bundle = new Bundle();
-        bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParameters);
+        bundle.putParcelable(MESSAGE_QUERY_PARAMETERS_KEY, queryParams);
         return mMessageQueryHelper.performMessageQuery(bundle);
     }
 
@@ -910,7 +911,7 @@
             String newAlias) throws RemoteException {
         ContentValues contentValues = new ContentValues(4);
         contentValues.put(TIMESTAMP_COLUMN, timestamp);
-        contentValues.put(RCS_PARTICIPANT_ID_COLUMN, participantId);
+        contentValues.put(SOURCE_PARTICIPANT_ID_COLUMN, participantId);
         contentValues.put(NEW_ALIAS_COLUMN, newAlias);
 
         Uri uri = mContentResolver.insert(
diff --git a/tests/telephonytests/src/com/android/internal/telephony/GsmSmsTest.java b/tests/telephonytests/src/com/android/internal/telephony/GsmSmsTest.java
index 06cd54f..ad5d0ab 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/GsmSmsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/GsmSmsTest.java
@@ -48,6 +48,14 @@
     }
 
     @SmallTest
+    public void testRecipientAddress() throws Exception {
+        String pdu = "0891683108200505F011000D91683196032930F000000006C8329BFD0E01";
+        SmsMessage sms = SmsMessage.createFromPdu(HexDump.hexStringToByteArray(pdu));
+        assertEquals("+8613800250500", sms.getServiceCenterAddress());
+        assertEquals("+8613693092030", sms.getRecipientAddress());
+    }
+
+    @SmallTest
     public void testUdh() throws Exception {
         String pdu = "07914140279510F6440A8111110301003BF56080207130138A8C0B05040B8423F"
                 + "000032A02010106276170706C69636174696F6E2F766E642E7761702E6D6D732D"
diff --git a/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java b/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java
index 379815d..a315bde 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java
@@ -115,6 +115,14 @@
     }
 
     @SmallTest
+    public void testRecipientAddress() throws Exception {
+        String pdu = "011a0000001002080d0003100160010610262d5ab500040401448888";
+        SmsMessage sms = SmsMessage.createFromEfRecord(0,
+                HexDump.hexStringToByteArray(pdu));
+        assertEquals("12222", sms.getRecipientAddress());
+    }
+
+    @SmallTest
     public void testUserData7bitGsm() throws Exception {
         String pdu = "00031040900112488ea794e074d69e1b7392c270326cde9e98";
         BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
diff --git a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
index 57c74ab..a07d648 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
@@ -17,6 +17,7 @@
 package com.android.internal.telephony.emergency;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doReturn;
 
 import android.os.AsyncResult;
 import android.os.HandlerThread;
@@ -58,6 +59,7 @@
     public void setUp() throws Exception {
         logd("EmergencyNumberTrackerTest +Setup!");
         super.setUp("EmergencyNumberTrackerTest");
+        doReturn(mContext).when(mPhone).getContext();
         initializeEmergencyNumberListTestSamples();
         mHandlerThread = new EmergencyNumberTrackerTestHandler("EmergencyNumberTrackerTestHandler");
         mHandlerThread.start();