Merge "fix carrierIdentifierTest"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 48387ba..e57b3b4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -109,9 +109,7 @@
                   android:authorities="carrier_identification"
                   android:exported="true"
                   android:singleUser="true"
-                  android:multiprocess="false"
-                  android:readPermission="android.permission.READ_PRIVILEGED_PHONE_STATE"
-                  android:writePermission="android.permission.MODIFY_PHONE_STATE" />
+                  android:multiprocess="false" />
 
         <service
             android:name=".TelephonyBackupAgent$DeferredSmsMmsRestoreService"
diff --git a/src/com/android/providers/telephony/CarrierIdProvider.java b/src/com/android/providers/telephony/CarrierIdProvider.java
index 4b4ce8f..ed590fc 100644
--- a/src/com/android/providers/telephony/CarrierIdProvider.java
+++ b/src/com/android/providers/telephony/CarrierIdProvider.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.UriMatcher;
+import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteDatabase;
@@ -178,6 +179,7 @@
     @Override
     public Cursor query(Uri uri, String[] projectionIn, String selection,
                         String[] selectionArgs, String sortOrder) {
+        checkReadPermission();
         if (VDBG) {
             Log.d(TAG, "query:"
                     + " uri=" + uri
@@ -203,6 +205,7 @@
 
     @Override
     public Uri insert(Uri uri, ContentValues values) {
+        checkWritePermission();
         final long row = getWritableDatabase().insertOrThrow(CARRIER_ID_TABLE, null, values);
         if (row > 0) {
             final Uri newUri = ContentUris.withAppendedId(CarrierIdentification.CONTENT_URI, row);
@@ -214,6 +217,7 @@
 
     @Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
+        checkWritePermission();
         if (VDBG) {
             Log.d(TAG, "delete:"
                     + " uri=" + uri
@@ -231,6 +235,7 @@
 
     @Override
     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        checkWritePermission();
         if (VDBG) {
             Log.d(TAG, "update:"
                     + " uri=" + uri
@@ -510,4 +515,22 @@
         buffer.flush();
         return buffer.toByteArray();
     }
+
+    private void checkReadPermission() {
+        int status = getContext().checkCallingOrSelfPermission(
+                "android.permission.READ_PRIVILEGED_PHONE_STATE");
+        if (status == PackageManager.PERMISSION_GRANTED) {
+            return;
+        }
+        throw new SecurityException("No permission to read Carrier Identification provider");
+    }
+
+    private void checkWritePermission() {
+        int status = getContext().checkCallingOrSelfPermission(
+                "android.permission.MODIFY_PHONE_STATE");
+        if (status == PackageManager.PERMISSION_GRANTED) {
+            return;
+        }
+        throw new SecurityException("No permission to write Carrier Identification provider");
+    }
 }