add support to query carrier list version

Bug: 64131637
Test: run test --path CarrierIdProvider#testGetVersion
Change-Id: I88df8789c28929d387d954d524cfdeeb22d9a2e9
diff --git a/src/com/android/providers/telephony/CarrierIdProvider.java b/src/com/android/providers/telephony/CarrierIdProvider.java
index 7acea68..95b17e4 100644
--- a/src/com/android/providers/telephony/CarrierIdProvider.java
+++ b/src/com/android/providers/telephony/CarrierIdProvider.java
@@ -23,6 +23,7 @@
 import android.content.SharedPreferences;
 import android.content.UriMatcher;
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;
@@ -70,12 +71,13 @@
     private static final int DATABASE_VERSION = 3;
 
     private static final String ASSETS_PB_FILE = "carrier_list.pb";
-    private static final String VERSION_PREF_KEY = "version";
+    private static final String VERSION_KEY = "version";
     private static final String OTA_UPDATED_PB_PATH = "misc/carrierid/" + ASSETS_PB_FILE;
     private static final String PREF_FILE = CarrierIdProvider.class.getSimpleName();
 
     private static final UriMatcher s_urlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
     private static final int URL_UPDATE_FROM_PB = 1;
+    private static final int URL_GET_VERSION    = 2;
 
     /**
      * index 0: {@link CarrierIdentification#MCCMNC}
@@ -162,6 +164,7 @@
         mDbHelper = new CarrierIdDatabaseHelper(getContext());
         mDbHelper.getReadableDatabase();
         s_urlMatcher.addURI(AUTHORITY, "update_db", URL_UPDATE_FROM_PB);
+        s_urlMatcher.addURI(AUTHORITY, "get_version", URL_GET_VERSION);
         initDatabaseFromPb(mDbHelper.getWritableDatabase());
         return true;
     }
@@ -182,11 +185,20 @@
                     + " selection=" + selection
                     + " selectionArgs=" + Arrays.toString(selectionArgs));
         }
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        qb.setTables(CARRIER_ID_TABLE);
 
-        SQLiteDatabase db = getReadableDatabase();
-        return qb.query(db, projectionIn, selection, selectionArgs, null, null, sortOrder);
+        final int match = s_urlMatcher.match(uri);
+        switch (match) {
+            case URL_GET_VERSION:
+                final MatrixCursor cursor = new MatrixCursor(new String[] {VERSION_KEY});
+                cursor.addRow(new Object[] {getAppliedVersion()});
+                return cursor;
+            default:
+                SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+                qb.setTables(CARRIER_ID_TABLE);
+
+                SQLiteDatabase db = getReadableDatabase();
+                return qb.query(db, projectionIn, selection, selectionArgs, null, null, sortOrder);
+        }
     }
 
     @Override
@@ -454,13 +466,13 @@
 
     private int getAppliedVersion() {
         final SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
-        return sp.getInt(VERSION_PREF_KEY, -1);
+        return sp.getInt(VERSION_KEY, -1);
     }
 
     private void setAppliedVersion(int version) {
         final SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sp.edit();
-        editor.putInt(VERSION_PREF_KEY, version);
+        editor.putInt(VERSION_KEY, version);
         editor.apply();
     }
 
diff --git a/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java b/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java
index 2bf069b..be600f6 100644
--- a/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java
+++ b/tests/src/com/android/providers/telephony/CarrierIdProviderTest.java
@@ -17,6 +17,7 @@
 package com.android.providers.telephony;
 
 import android.content.ContentValues;
+import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.database.ContentObserver;
@@ -24,6 +25,7 @@
 import android.database.SQLException;
 import android.net.Uri;
 import android.os.Handler;
+import android.provider.Telephony;
 import android.provider.Telephony.CarrierIdentification;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
@@ -34,6 +36,11 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
 /**
  * Tests for testing CRUD operations of CarrierIdProvider.
  * Uses CarrierIdProviderTestable to set up in-memory database
@@ -64,6 +71,7 @@
     private MockContentResolver mContentResolver;
     private CarrierIdProviderTestable mCarrierIdProviderTestable;
     private FakeContentObserver mContentObserver;
+    private SharedPreferences mSharedPreferences = mock(SharedPreferences.class);
 
     private class FakeContentResolver extends MockContentResolver {
         @Override
@@ -124,6 +132,11 @@
         public int checkCallingOrSelfPermission(String permission) {
             return PackageManager.PERMISSION_GRANTED;
         }
+
+        @Override
+        public SharedPreferences getSharedPreferences(String name, int mode) {
+            return mSharedPreferences;
+        }
     }
 
     @Override
@@ -297,6 +310,22 @@
         assertEquals(dummy_iccid_prefix, findEntry.getString(1));
     }
 
+    @Test
+    public void testGetVersion() {
+        doReturn(5).when(mSharedPreferences).getInt(eq("version"), anyInt());
+        int version = 0;
+        try {
+            Cursor cursor = mContext.getContentResolver().query(
+                    Uri.withAppendedPath(Telephony.CarrierIdentification.CONTENT_URI,
+                            "get_version"), null, null, null);
+            cursor.moveToFirst();
+            version = cursor.getInt(0);
+        } catch (Exception e) {
+            Log.d(TAG, "Error querying carrier list version:" + e);
+        }
+        assertEquals(5, version);
+    }
+
     private static ContentValues createCarrierInfoInternal() {
         ContentValues contentValues = new ContentValues();
         contentValues.put(CarrierIdentification.MCCMNC, dummy_mccmnc);