Fix where country change results in emergency number update failure.

Clearing the current database version on emergency country ISO change
ensures that when the emergency numbers are updated from the database that
we will refresh the most recent values.

Bug: 173456532
Test: unit test; phone screen verified
Change-Id: I377fa53111dfcffd92d050b652b3ed29c8354492
Merged-In: I377fa53111dfcffd92d050b652b3ed29c8354492
(cherry picked from commit a8d6cbf4953400c36cfcee4b4d05a0689973f666)
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
index 3b55008..e6f7699 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
@@ -129,9 +129,11 @@
     /** Event indicating the update for the emergency number prefix from carrier config. */
     private static final int EVENT_UPDATE_EMERGENCY_NUMBER_PREFIX = 4;
     /** Event indicating the update for the OTA emergency number database. */
-    private static final int EVENT_UPDATE_OTA_EMERGENCY_NUMBER_DB = 5;
+    @VisibleForTesting
+    public static final int EVENT_UPDATE_OTA_EMERGENCY_NUMBER_DB = 5;
     /** Event indicating the override for the test OTA emergency number database. */
-    private static final int EVENT_OVERRIDE_OTA_EMERGENCY_NUMBER_DB_FILE_PATH = 6;
+    @VisibleForTesting
+    public static final int EVENT_OVERRIDE_OTA_EMERGENCY_NUMBER_DB_FILE_PATH = 6;
 
     private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
         @Override
@@ -819,6 +821,7 @@
 
     private synchronized void updateEmergencyCountryIso(String countryIso) {
         mCountryIso = countryIso;
+        mCurrentDatabaseVersion = INVALID_DATABASE_VERSION;
     }
 
     /**
diff --git a/tests/telephonytests/assets/eccdata_ota b/tests/telephonytests/assets/eccdata_ota
new file mode 100644
index 0000000..69ddb46
--- /dev/null
+++ b/tests/telephonytests/assets/eccdata_ota
Binary files differ
diff --git a/tests/telephonytests/assets/eccdata_ota_input.txt b/tests/telephonytests/assets/eccdata_ota_input.txt
new file mode 100644
index 0000000..43795ce
--- /dev/null
+++ b/tests/telephonytests/assets/eccdata_ota_input.txt
@@ -0,0 +1,11 @@
+revision: 999999
+countries {
+  iso_code: "US"
+  eccs {
+    phone_number: "98765"
+    types: POLICE
+    types: AMBULANCE
+    types: FIRE
+  }
+  ecc_fallback: "911"
+}
\ No newline at end of file
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 7a637cf..6c62500 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
@@ -22,6 +22,8 @@
 import static org.mockito.Mockito.doReturn;
 
 import android.os.AsyncResult;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
 import android.telephony.emergency.EmergencyNumber;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
@@ -39,6 +41,14 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -50,6 +60,13 @@
 @TestableLooper.RunWithLooper
 public class EmergencyNumberTrackerTest extends TelephonyTest {
 
+    private static final String LOCAL_DOWNLOAD_DIRECTORY = "Download/Emergency_number_db_unit_test";
+    private static final String EMERGENCY_NUMBER_DB_OTA_FILE = "eccdata_ota";
+    private static final int CONFIG_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 99999;
+    private static final String CONFIG_EMERGENCY_NUMBER_ADDRESS = "54321";
+    private static final int OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 999999;
+    private static final String OTA_EMERGENCY_NUMBER_ADDRESS = "98765";
+
     @Mock
     private Phone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest.
 
@@ -62,6 +79,8 @@
     private EmergencyNumber mUsEmergencyNumber;
     private String[] mEmergencyNumberPrefixTestSample = {"123", "456"};
 
+    private File mLocalDownloadDirectory;
+
     @Before
     public void setUp() throws Exception {
         logd("EmergencyNumberTrackerTest +Setup!");
@@ -79,6 +98,10 @@
         mEmergencyNumberTrackerMock2 = new EmergencyNumberTracker(mPhone2, mSimulatedCommands);
         doReturn(mEmergencyNumberTrackerMock2).when(mPhone2).getEmergencyNumberTracker();
         mEmergencyNumberTrackerMock.DBG = true;
+
+        // Copy an OTA file to the test directory to similate the OTA mechanism
+        simulateOtaEmergencyNumberDb(mPhone);
+
         processAllMessages();
         logd("EmergencyNumberTrackerTest -Setup!");
     }
@@ -87,6 +110,9 @@
     public void tearDown() throws Exception {
         // Set back to single sim mode
         setSinglePhone();
+        Path target = Paths.get(mLocalDownloadDirectory.getPath(), EMERGENCY_NUMBER_DB_OTA_FILE);
+        Files.deleteIfExists(target);
+        mLocalDownloadDirectory.delete();
         super.tearDown();
     }
 
@@ -125,6 +151,71 @@
         processAllMessages();
     }
 
+    private void setOtaEmergencyNumberDbFileFolderForTesting(
+            EmergencyNumberTracker emergencyNumberTrackerMock, Phone phone) {
+        // Override the OTA emergency number database file path for testing
+        File file = new File(Environment.getExternalStorageDirectory(), LOCAL_DOWNLOAD_DIRECTORY
+                + "/" + EMERGENCY_NUMBER_DB_OTA_FILE);
+        try {
+            final ParcelFileDescriptor otaParcelFileDescriptor = ParcelFileDescriptor.open(
+                    file, ParcelFileDescriptor.MODE_READ_ONLY);
+            emergencyNumberTrackerMock.obtainMessage(
+                EmergencyNumberTracker.EVENT_OVERRIDE_OTA_EMERGENCY_NUMBER_DB_FILE_PATH,
+                otaParcelFileDescriptor).sendToTarget();
+            logd("Changed emergency number db file folder for testing ");
+        } catch (FileNotFoundException e) {
+            logd("Failed to open emergency number db file folder for testing " + e.toString());
+        }
+        processAllMessages();
+    }
+
+    private void resetOtaEmergencyNumberDbFileFolderForTesting(
+            EmergencyNumberTracker emergencyNumberTrackerMock) {
+        emergencyNumberTrackerMock.obtainMessage(
+                EmergencyNumberTracker.EVENT_OVERRIDE_OTA_EMERGENCY_NUMBER_DB_FILE_PATH, null)
+                        .sendToTarget();
+        processAllMessages();
+    }
+
+    private void sendOtaEmergencyNumberDb(EmergencyNumberTracker emergencyNumberTrackerMock) {
+        emergencyNumberTrackerMock.obtainMessage(
+                EmergencyNumberTracker.EVENT_UPDATE_OTA_EMERGENCY_NUMBER_DB).sendToTarget();
+        processAllMessages();
+    }
+
+    /**
+     * Copy an OTA file to the test directory to similate the OTA mechanism.
+     *
+     * Version: 999999
+     * Number: US, 98765, POLICE | AMBULANCE | FIRE
+     */
+    private void simulateOtaEmergencyNumberDb(Phone phone) {
+        try {
+            mLocalDownloadDirectory = new File(
+                    Environment.getExternalStorageDirectory(), LOCAL_DOWNLOAD_DIRECTORY);
+            mLocalDownloadDirectory.mkdir();
+            final Path target = Paths.get(
+                    mLocalDownloadDirectory.getPath(), EMERGENCY_NUMBER_DB_OTA_FILE);
+            Files.deleteIfExists(target);
+            final InputStream source = new BufferedInputStream(
+                    phone.getContext().getAssets().open(EMERGENCY_NUMBER_DB_OTA_FILE));
+            Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
+            logd("Copied test OTA database file to " + target);
+        } catch (Exception e) {
+            logd("Unable to copy downloaded file " + e);
+        }
+    }
+
+    private boolean hasDbEmergencyNumber(String number, List<EmergencyNumber> list) {
+        boolean foundDbNumber = false;
+        for (EmergencyNumber num : list) {
+            if (num.getNumber().equals(number)) {
+                foundDbNumber = true;
+            }
+        }
+        return foundDbNumber;
+    }
+
     private void setDsdsPhones() throws Exception {
         mPhones = new Phone[] {mPhone, mPhone2};
         replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
@@ -237,6 +328,51 @@
         assertTrue(hasDatabaseNumber);
     }
 
+    /**
+     * Test OTA Emergency Number Database Update Status.
+     */
+    @Test
+    public void testOtaEmergencyNumberDatabase() {
+        // Set up the Hal version as 1.4 to apply emergency number database
+        doReturn(new HalVersion(1, 4)).when(mPhone).getHalVersion();
+
+        sendEmergencyNumberPrefix(mEmergencyNumberTrackerMock);
+        mEmergencyNumberTrackerMock.updateEmergencyCountryIsoAllPhones("");
+        processAllMessages();
+
+        // Emergency Number Db is cached per country, given the country is empty at this time,
+        // we should not expect any db number there.
+        assertFalse(hasDbEmergencyNumber(CONFIG_EMERGENCY_NUMBER_ADDRESS,
+                mEmergencyNumberTrackerMock.getEmergencyNumberList()));
+
+        // Set up the OTA database file folder as sdcard for testing purposes
+        setOtaEmergencyNumberDbFileFolderForTesting(mEmergencyNumberTrackerMock, mPhone);
+        // Notify EmergerncyNumberTracker OTA database is installed.
+        sendOtaEmergencyNumberDb(mEmergencyNumberTrackerMock);
+        processAllMessages();
+
+        assertEquals(OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION,
+                mEmergencyNumberTrackerMock.getEmergencyNumberDbVersion());
+
+        // Emergency Number Db is cached per country, given the country is empty at this time,
+        // we should not expect any db number there.
+        assertFalse(hasDbEmergencyNumber(OTA_EMERGENCY_NUMBER_ADDRESS,
+                mEmergencyNumberTrackerMock.getEmergencyNumberList()));
+
+        mEmergencyNumberTrackerMock.updateEmergencyCountryIsoAllPhones("us");
+        processAllMessages();
+        assertEquals(OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION,
+                mEmergencyNumberTrackerMock.getEmergencyNumberDbVersion());
+
+        // Emergency Number Db is cached per country, given the country is 'us' at this time,
+        // we should expect the 'us' db number there.
+        assertTrue(hasDbEmergencyNumber(OTA_EMERGENCY_NUMBER_ADDRESS,
+                mEmergencyNumberTrackerMock.getEmergencyNumberList()));
+
+        // Reset the OTA database file to default after testing completion
+        resetOtaEmergencyNumberDbFileFolderForTesting(mEmergencyNumberTrackerMock);
+    }
+
     @Test
     public void testEmergencyNumberListPrefix() throws Exception {
         sendEmergencyNumberListFromRadio();