Merge "Remove old CellBroadcastProvider"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d5c379b..4ae9acf 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -107,12 +107,6 @@
android:multiprocess="false"
android:writePermission="android.permission.MODIFY_PHONE_STATE" />
- <provider android:name="CellBroadcastProvider"
- android:authorities="cellbroadcasts"
- android:exported="true"
- android:singleUser="true"
- android:multiprocess="false" />
-
<provider android:name="HbpcdLookupProvider"
android:authorities="hbpcd_lookup"
android:exported="true"
diff --git a/src/com/android/providers/telephony/CellBroadcastProvider.java b/src/com/android/providers/telephony/CellBroadcastProvider.java
deleted file mode 100644
index 3c200bd..0000000
--- a/src/com/android/providers/telephony/CellBroadcastProvider.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.providers.telephony;
-
-import android.app.AppOpsManager;
-import android.content.ContentProvider;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.UriMatcher;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.Process;
-import android.provider.Telephony;
-import android.provider.Telephony.CellBroadcasts;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.util.Arrays;
-
-/**
- * The content provider that provides access of cell broadcast message to application.
- * Permission {@link android.permission.READ_CELL_BROADCASTS} is required for querying the cell
- * broadcast message. Only phone process has the permission to write/update the database via this
- * provider.
- */
-public class CellBroadcastProvider extends ContentProvider {
- /** Interface for read/write permission check. */
- public interface PermissionChecker {
- /** Return {@code True} if the caller has the permission to write/update the database. */
- boolean hasWritePermission();
-
- /** Return {@code True} if the caller has the permission to query the complete database. */
- boolean hasReadPermission();
-
- /**
- * Return {@code True} if the caller has the permission to query the database for
- * cell broadcast message history.
- */
- boolean hasReadPermissionForHistory();
- }
-
- private static final String TAG = CellBroadcastProvider.class.getSimpleName();
-
- private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
-
- /** Database name. */
- private static final String DATABASE_NAME = "cellbroadcasts.db";
-
- /** Database version. */
- private static final int DATABASE_VERSION = 2;
-
- /** URI matcher for ContentProvider queries. */
- private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
- /** URI matcher type to get all cell broadcasts. */
- private static final int ALL = 0;
-
- /**
- * URI matcher type for get all message history, this is used primarily for default
- * cellbroadcast app or messaging app to display message history. some information is not
- * exposed for messaging history, e.g, messages which are out of broadcast geometrics will not
- * be delivered to end users thus will not be returned as message history query result.
- */
- private static final int MESSAGE_HISTORY = 1;
-
- /** MIME type for the list of all cell broadcasts. */
- private static final String LIST_TYPE = "vnd.android.cursor.dir/cellbroadcast";
-
- /** Table name of cell broadcast message. */
- @VisibleForTesting
- public static final String CELL_BROADCASTS_TABLE_NAME = "cell_broadcasts";
-
- /** Authority string for content URIs. */
- @VisibleForTesting
- public static final String AUTHORITY = "cellbroadcasts";
-
- /** Content uri of this provider. */
- public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts");
-
- @VisibleForTesting
- public PermissionChecker mPermissionChecker;
-
- /** The database helper for this content provider. */
- @VisibleForTesting
- public SQLiteOpenHelper mDbHelper;
-
- static {
- sUriMatcher.addURI(AUTHORITY, null, ALL);
- sUriMatcher.addURI(AUTHORITY, "history", MESSAGE_HISTORY);
- }
-
- public CellBroadcastProvider() {}
-
- @VisibleForTesting
- public CellBroadcastProvider(PermissionChecker permissionChecker) {
- mPermissionChecker = permissionChecker;
- }
-
- @Override
- public boolean onCreate() {
- mDbHelper = new CellBroadcastDatabaseHelper(getContext());
- mPermissionChecker = new CellBroadcastPermissionChecker();
- setAppOps(AppOpsManager.OP_READ_CELL_BROADCASTS, AppOpsManager.OP_NONE);
- return true;
- }
-
- /**
- * Return the MIME type of the data at the specified URI.
- *
- * @param uri the URI to query.
- * @return a MIME type string, or null if there is no type.
- */
- @Override
- public String getType(Uri uri) {
- int match = sUriMatcher.match(uri);
- switch (match) {
- case ALL:
- return LIST_TYPE;
- default:
- return null;
- }
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- checkReadPermission(uri);
-
- if (DBG) {
- Log.d(TAG, "query:"
- + " uri = " + uri
- + " projection = " + Arrays.toString(projection)
- + " selection = " + selection
- + " selectionArgs = " + Arrays.toString(selectionArgs)
- + " sortOrder = " + sortOrder);
- }
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- qb.setStrict(true); // a little protection from injection attacks
- qb.setTables(CELL_BROADCASTS_TABLE_NAME);
-
- String orderBy;
- if (!TextUtils.isEmpty(sortOrder)) {
- orderBy = sortOrder;
- } else {
- orderBy = CellBroadcasts.RECEIVED_TIME + " DESC";
- }
-
- int match = sUriMatcher.match(uri);
- switch (match) {
- case ALL:
- return getReadableDatabase().query(
- CELL_BROADCASTS_TABLE_NAME, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, orderBy);
- case MESSAGE_HISTORY:
- // limit projections to certain columns. limit result to broadcasted messages only.
- qb.appendWhere(CellBroadcasts.MESSAGE_BROADCASTED + "=1");
- return qb.query(getReadableDatabase(), projection, selection, selectionArgs, null,
- null, orderBy);
- default:
- throw new IllegalArgumentException(
- "Query method doesn't support this uri = " + uri);
- }
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- checkWritePermission();
-
- if (DBG) {
- Log.d(TAG, "insert:"
- + " uri = " + uri
- + " contentValue = " + values);
- }
-
- switch (sUriMatcher.match(uri)) {
- case ALL:
- long row = getWritableDatabase().insertOrThrow(CELL_BROADCASTS_TABLE_NAME, null,
- values);
- if (row > 0) {
- Uri newUri = ContentUris.withAppendedId(CONTENT_URI, row);
- getContext().getContentResolver()
- .notifyChange(CONTENT_URI, null /* observer */);
- return newUri;
- } else {
- Log.e(TAG, "Insert record failed because of unknown reason, uri = " + uri);
- return null;
- }
- default:
- throw new IllegalArgumentException(
- "Insert method doesn't support this uri = " + uri);
- }
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- checkWritePermission();
-
- if (DBG) {
- Log.d(TAG, "delete:"
- + " uri = " + uri
- + " selection = " + selection
- + " selectionArgs = " + Arrays.toString(selectionArgs));
- }
-
- switch (sUriMatcher.match(uri)) {
- case ALL:
- return getWritableDatabase().delete(CELL_BROADCASTS_TABLE_NAME,
- selection, selectionArgs);
- default:
- throw new IllegalArgumentException(
- "Delete method doesn't support this uri = " + uri);
- }
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- checkWritePermission();
-
- if (DBG) {
- Log.d(TAG, "update:"
- + " uri = " + uri
- + " values = {" + values + "}"
- + " selection = " + selection
- + " selectionArgs = " + Arrays.toString(selectionArgs));
- }
-
- switch (sUriMatcher.match(uri)) {
- case ALL:
- int rowCount = getWritableDatabase().update(
- CELL_BROADCASTS_TABLE_NAME,
- values,
- selection,
- selectionArgs);
- if (rowCount > 0) {
- getContext().getContentResolver().notifyChange(uri, null /* observer */);
- }
- return rowCount;
- default:
- throw new IllegalArgumentException(
- "Update method doesn't support this uri = " + uri);
- }
- }
-
- @VisibleForTesting
- public static String getStringForCellBroadcastTableCreation(String tableName) {
- return "CREATE TABLE " + tableName + " ("
- + CellBroadcasts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
- + CellBroadcasts.SUB_ID + " INTEGER,"
- + CellBroadcasts.SLOT_INDEX + " INTEGER DEFAULT 0,"
- + CellBroadcasts.GEOGRAPHICAL_SCOPE + " INTEGER,"
- + CellBroadcasts.PLMN + " TEXT,"
- + CellBroadcasts.LAC + " INTEGER,"
- + CellBroadcasts.CID + " INTEGER,"
- + CellBroadcasts.SERIAL_NUMBER + " INTEGER,"
- + CellBroadcasts.SERVICE_CATEGORY + " INTEGER,"
- + CellBroadcasts.LANGUAGE_CODE + " TEXT,"
- + CellBroadcasts.MESSAGE_BODY + " TEXT,"
- + CellBroadcasts.MESSAGE_FORMAT + " INTEGER,"
- + CellBroadcasts.MESSAGE_PRIORITY + " INTEGER,"
- + CellBroadcasts.ETWS_WARNING_TYPE + " INTEGER,"
- + CellBroadcasts.CMAS_MESSAGE_CLASS + " INTEGER,"
- + CellBroadcasts.CMAS_CATEGORY + " INTEGER,"
- + CellBroadcasts.CMAS_RESPONSE_TYPE + " INTEGER,"
- + CellBroadcasts.CMAS_SEVERITY + " INTEGER,"
- + CellBroadcasts.CMAS_URGENCY + " INTEGER,"
- + CellBroadcasts.CMAS_CERTAINTY + " INTEGER,"
- + CellBroadcasts.RECEIVED_TIME + " BIGINT,"
- + CellBroadcasts.MESSAGE_BROADCASTED + " BOOLEAN DEFAULT 0,"
- + CellBroadcasts.GEOMETRIES + " TEXT,"
- + CellBroadcasts.MAXIMUM_WAIT_TIME + " INTEGER);";
- }
-
- private SQLiteDatabase getWritableDatabase() {
- return mDbHelper.getWritableDatabase();
- }
-
- private SQLiteDatabase getReadableDatabase() {
- return mDbHelper.getReadableDatabase();
- }
-
- private void checkWritePermission() {
- if (!mPermissionChecker.hasWritePermission()) {
- throw new SecurityException(
- "No permission to write CellBroadcast provider");
- }
- }
-
- private void checkReadPermission(Uri uri) {
- int match = sUriMatcher.match(uri);
- switch (match) {
- case ALL:
- if (!mPermissionChecker.hasReadPermission()) {
- throw new SecurityException(
- "No permission to read CellBroadcast provider");
- }
- break;
- case MESSAGE_HISTORY:
- // TODO: if we plan to allow apps to query db in framework, we should migrate data
- // first before deprecating app's database. otherwise users will lose all history.
- if (!mPermissionChecker.hasReadPermissionForHistory()) {
- throw new SecurityException(
- "No permission to read CellBroadcast provider for message history");
- }
- default:
- return;
- }
- }
-
- private class CellBroadcastDatabaseHelper extends SQLiteOpenHelper {
- CellBroadcastDatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null /* factory */, DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL(getStringForCellBroadcastTableCreation(CELL_BROADCASTS_TABLE_NAME));
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (DBG) {
- Log.d(TAG, "onUpgrade: oldV=" + oldVersion + " newV=" + newVersion);
- }
- if (newVersion == 2) {
- db.execSQL("ALTER TABLE " + CELL_BROADCASTS_TABLE_NAME + " ADD COLUMN "
- + CellBroadcasts.SLOT_INDEX + " INTEGER DEFAULT 0;");
- Log.d(TAG, "add slotIndex column");
- }
- }
- }
-
- private class CellBroadcastPermissionChecker implements PermissionChecker {
- @Override
- public boolean hasWritePermission() {
- // Only the phone and network statck process has the write permission to modify this
- // provider.
- return Binder.getCallingUid() == Process.PHONE_UID
- || Binder.getCallingUid() == Process.NETWORK_STACK_UID;
- }
-
- @Override
- public boolean hasReadPermission() {
- // Only the phone and network stack process has the read permission to query data from
- // this provider.
- return Binder.getCallingUid() == Process.PHONE_UID
- || Binder.getCallingUid() == Process.NETWORK_STACK_UID;
- }
-
- @Override
- public boolean hasReadPermissionForHistory() {
- int status = getContext().checkCallingOrSelfPermission(
- "android.permission.RECEIVE_EMERGENCY_BROADCAST");
- if (status == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
- return false;
- }
- }
-}
diff --git a/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java b/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java
deleted file mode 100644
index bd92643..0000000
--- a/tests/src/com/android/providers/telephony/CellBroadcastProviderTest.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.providers.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-
-import junit.framework.TestCase;
-
-import android.content.ContentValues;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.Telephony.CellBroadcasts;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.util.Log;
-
-import com.android.providers.telephony.CellBroadcastProvider.PermissionChecker;
-
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-public class CellBroadcastProviderTest extends TestCase {
- private static final String TAG = CellBroadcastProviderTest.class.getSimpleName();
-
- public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts");
-
- private static final int GEO_SCOPE = 1;
- private static final String PLMN = "123456";
- private static final int LAC = 13;
- private static final int CID = 123;
- private static final int SERIAL_NUMBER = 17984;
- private static final int SERVICE_CATEGORY = 4379;
- private static final String LANGUAGE_CODE = "en";
- private static final String MESSAGE_BODY = "AMBER Alert: xxxx";
- private static final int MESSAGE_FORMAT = 1;
- private static final int MESSAGE_PRIORITY = 3;
- private static final int ETWS_WARNING_TYPE = 1;
- private static final int CMAS_MESSAGE_CLASS = 1;
- private static final int CMAS_CATEGORY = 6;
- private static final int CMAS_RESPONSE_TYPE = 1;
- private static final int CMAS_SEVERITY = 2;
- private static final int CMAS_URGENCY = 3;
- private static final int CMAS_CERTAINTY = 4;
- private static final int RECEIVED_TIME = 1562792637;
- private static final int MESSAGE_BROADCASTED = 1;
- private static final String GEOMETRIES_COORDINATES
- = "polygon|0,0|0,1|1,1|1,0;circle|0,0|100";
-
- private static final String SELECT_BY_ID = CellBroadcasts._ID + "=?";
-
- private static final String[] QUERY_COLUMNS = {
- CellBroadcasts._ID,
- CellBroadcasts.GEOGRAPHICAL_SCOPE,
- CellBroadcasts.PLMN,
- CellBroadcasts.LAC,
- CellBroadcasts.CID,
- CellBroadcasts.SERIAL_NUMBER,
- CellBroadcasts.SERVICE_CATEGORY,
- CellBroadcasts.LANGUAGE_CODE,
- CellBroadcasts.MESSAGE_BODY,
- CellBroadcasts.MESSAGE_FORMAT,
- CellBroadcasts.MESSAGE_PRIORITY,
- CellBroadcasts.ETWS_WARNING_TYPE,
- CellBroadcasts.CMAS_MESSAGE_CLASS,
- CellBroadcasts.CMAS_CATEGORY,
- CellBroadcasts.CMAS_RESPONSE_TYPE,
- CellBroadcasts.CMAS_SEVERITY,
- CellBroadcasts.CMAS_URGENCY,
- CellBroadcasts.CMAS_CERTAINTY,
- CellBroadcasts.RECEIVED_TIME,
- CellBroadcasts.MESSAGE_BROADCASTED,
- CellBroadcasts.GEOMETRIES
- };
-
- private CellBroadcastProviderTestable mCellBroadcastProviderTestable;
- private MockContextWithProvider mContext;
- private MockContentResolver mContentResolver;
-
- @Mock
- private PermissionChecker mMockPermissionChecker;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- MockitoAnnotations.initMocks(this);
- doReturn(true).when(mMockPermissionChecker).hasReadPermission();
- doReturn(true).when(mMockPermissionChecker).hasWritePermission();
-
- mCellBroadcastProviderTestable = new CellBroadcastProviderTestable(mMockPermissionChecker);
- mContext = new MockContextWithProvider(mCellBroadcastProviderTestable);
- mContentResolver = mContext.getContentResolver();
- }
-
- @Override
- protected void tearDown() throws Exception {
- mCellBroadcastProviderTestable.closeDatabase();
- super.tearDown();
- }
-
- @Test
- public void testUpdate() {
- // Insert a cellbroadcast to the database.
- ContentValues cv = fakeCellBroadcast();
- Uri uri = mContentResolver.insert(CONTENT_URI, cv);
- assertThat(uri).isNotNull();
-
- // Change some fields of this cell broadcast.
- int messageBroadcasted = 1 - cv.getAsInteger(CellBroadcasts.MESSAGE_BROADCASTED);
- int receivedTime = 1234555555;
- cv.put(CellBroadcasts.MESSAGE_BROADCASTED, messageBroadcasted);
- cv.put(CellBroadcasts.RECEIVED_TIME, receivedTime);
- mContentResolver.update(CONTENT_URI, cv, SELECT_BY_ID,
- new String[] { uri.getLastPathSegment() });
-
- // Query and check if the update is successed.
- Cursor cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- SELECT_BY_ID, new String[] { uri.getLastPathSegment() }, null /* orderBy */);
- cursor.moveToNext();
-
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.RECEIVED_TIME)))
- .isEqualTo(receivedTime);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_BROADCASTED)))
- .isEqualTo(messageBroadcasted);
- cursor.close();
- }
-
- @Test
- public void testUpdate_WithoutWritePermission_fail() {
- ContentValues cv = fakeCellBroadcast();
- Uri uri = mContentResolver.insert(CONTENT_URI, cv);
- assertThat(uri).isNotNull();
-
- // Revoke the write permission
- doReturn(false).when(mMockPermissionChecker).hasWritePermission();
-
- try {
- mContentResolver.update(CONTENT_URI, cv, SELECT_BY_ID,
- new String[] { uri.getLastPathSegment() });
- fail();
- } catch (SecurityException ex) {
- // pass the test
- }
- }
-
- @Test
- public void testGetAllCellBroadcast() {
- // Insert some cell broadcasts which message_broadcasted is false
- int messageNotBroadcastedCount = 5;
- ContentValues cv = fakeCellBroadcast();
- cv.put(CellBroadcasts.MESSAGE_BROADCASTED, 0);
- for (int i = 0; i < messageNotBroadcastedCount; i++) {
- mContentResolver.insert(CONTENT_URI, cv);
- }
-
- // Insert some cell broadcasts which message_broadcasted is true
- int messageBroadcastedCount = 6;
- cv.put(CellBroadcasts.MESSAGE_BROADCASTED, 1);
- for (int i = 0; i < messageBroadcastedCount; i++) {
- mContentResolver.insert(CONTENT_URI, cv);
- }
-
- // Query the broadcast with message_broadcasted is false
- Cursor cursor = mContentResolver.query(
- CONTENT_URI,
- QUERY_COLUMNS,
- String.format("%s=?", CellBroadcasts.MESSAGE_BROADCASTED), /* selection */
- new String[] {"0"}, /* selectionArgs */
- null /* sortOrder */);
- assertThat(cursor.getCount()).isEqualTo(messageNotBroadcastedCount);
- }
-
- @Test
- public void testDelete_withoutWritePermission_throwSecurityException() {
- Uri uri = mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
- assertThat(uri).isNotNull();
-
- // Revoke the write permission
- doReturn(false).when(mMockPermissionChecker).hasWritePermission();
-
- try {
- mContentResolver.delete(CONTENT_URI, SELECT_BY_ID,
- new String[] { uri.getLastPathSegment() });
- fail();
- } catch (SecurityException ex) {
- // pass the test
- }
- }
-
-
- @Test
- public void testDelete_oneRecord_success() {
- // Insert a cellbroadcast to the database.
- ContentValues cv = fakeCellBroadcast();
- Uri uri = mContentResolver.insert(CONTENT_URI, cv);
- assertThat(uri).isNotNull();
-
- String[] selectionArgs = new String[] { uri.getLastPathSegment() };
-
- // Ensure the cell broadcast is inserted.
- Cursor cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- SELECT_BY_ID, selectionArgs, null /* orderBy */);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor.close();
-
- // Delete the cell broadcast
- int rowCount = mContentResolver.delete(CONTENT_URI, SELECT_BY_ID,
- selectionArgs);
- assertThat(rowCount).isEqualTo(1);
-
- // Ensure the cell broadcast is deleted.
- cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS, SELECT_BY_ID,
- selectionArgs, null /* orderBy */);
- assertThat(cursor.getCount()).isEqualTo(0);
- cursor.close();
- }
-
- @Test
- public void testDelete_all_success() {
- // Insert a cellbroadcast to the database.
- mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
- mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
-
- // Ensure the cell broadcast are inserted.
- Cursor cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- null /* selection */, null /* selectionArgs */, null /* orderBy */);
- assertThat(cursor.getCount()).isEqualTo(2);
- cursor.close();
-
- // Delete all cell broadcasts.
- int rowCount = mContentResolver.delete(
- CONTENT_URI, null /* selection */, null /* selectionArgs */);
- assertThat(rowCount).isEqualTo(2);
- cursor.close();
-
- // Ensure all cell broadcasts are deleted.
- cursor = mContentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- null /* selection */, null /* selectionArgs */, null /* orderBy */);
- assertThat(cursor.getCount()).isEqualTo(0);
- cursor.close();
- }
-
- @Test
- public void testInsert_withoutWritePermission_fail() {
- doReturn(false).when(mMockPermissionChecker).hasWritePermission();
-
- try {
- mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
- fail();
- } catch (SecurityException ex) {
- // pass the test
- }
- }
-
- @Test
- public void testInsertAndQuery() {
- // Insert a cell broadcast message
- Uri uri = mContentResolver.insert(CONTENT_URI, fakeCellBroadcast());
-
- // Verify that the return uri is not null and the record is inserted into the database
- // correctly.
- assertThat(uri).isNotNull();
- Cursor cursor = mContentResolver.query(
- CONTENT_URI, QUERY_COLUMNS, SELECT_BY_ID,
- new String[] { uri.getLastPathSegment() }, null /* orderBy */);
- assertThat(cursor.getCount()).isEqualTo(1);
-
- cursor.moveToNext();
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.GEOGRAPHICAL_SCOPE)))
- .isEqualTo(GEO_SCOPE);
- assertThat(cursor.getString(cursor.getColumnIndexOrThrow(CellBroadcasts.PLMN)))
- .isEqualTo(PLMN);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.LAC))).isEqualTo(LAC);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CID))).isEqualTo(CID);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.SERIAL_NUMBER)))
- .isEqualTo(SERIAL_NUMBER);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.SERVICE_CATEGORY)))
- .isEqualTo(SERVICE_CATEGORY);
- assertThat(cursor.getString(cursor.getColumnIndexOrThrow(CellBroadcasts.LANGUAGE_CODE)))
- .isEqualTo(LANGUAGE_CODE);
- assertThat(cursor.getString(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_BODY)))
- .isEqualTo(MESSAGE_BODY);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_FORMAT)))
- .isEqualTo(MESSAGE_FORMAT);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_PRIORITY)))
- .isEqualTo(MESSAGE_PRIORITY);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.ETWS_WARNING_TYPE)))
- .isEqualTo(ETWS_WARNING_TYPE);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CMAS_MESSAGE_CLASS)))
- .isEqualTo(CMAS_MESSAGE_CLASS);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CMAS_CATEGORY)))
- .isEqualTo(CMAS_CATEGORY);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CMAS_RESPONSE_TYPE)))
- .isEqualTo(CMAS_RESPONSE_TYPE);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CMAS_SEVERITY)))
- .isEqualTo(CMAS_SEVERITY);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CMAS_URGENCY)))
- .isEqualTo(CMAS_URGENCY);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.CMAS_CERTAINTY)))
- .isEqualTo(CMAS_CERTAINTY);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.RECEIVED_TIME)))
- .isEqualTo(RECEIVED_TIME);
- assertThat(cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_BROADCASTED)))
- .isEqualTo(MESSAGE_BROADCASTED);
- assertThat(cursor.getString(cursor.getColumnIndexOrThrow(
- CellBroadcasts.GEOMETRIES))).isEqualTo(GEOMETRIES_COORDINATES);
- }
-
- /**
- * This is used to give the CellBroadcastProviderTest a mocked context which takes a
- * CellBroadcastProvider and attaches it to the ContentResolver.
- */
- private class MockContextWithProvider extends MockContext {
- private final MockContentResolver mResolver;
-
- public MockContextWithProvider(CellBroadcastProviderTestable cellBroadcastProvider) {
- mResolver = new MockContentResolver();
- cellBroadcastProvider.initializeForTesting(this);
-
- // Add given cellBroadcastProvider to mResolver, so that mResolver can send queries
- // to the provider.
- mResolver.addProvider(CellBroadcastProvider.AUTHORITY, cellBroadcastProvider);
- }
-
- @Override
- public MockContentResolver getContentResolver() {
- return mResolver;
- }
-
-
- @Override
- public Object getSystemService(String name) {
- Log.d(TAG, "getSystemService: returning null");
- return null;
- }
-
- @Override
- public int checkCallingOrSelfPermission(String permission) {
- return PackageManager.PERMISSION_GRANTED;
- }
- }
-
- private static ContentValues fakeCellBroadcast() {
- ContentValues cv = new ContentValues();
- cv.put(CellBroadcasts.GEOGRAPHICAL_SCOPE, GEO_SCOPE);
- cv.put(CellBroadcasts.PLMN, PLMN);
- cv.put(CellBroadcasts.LAC, LAC);
- cv.put(CellBroadcasts.CID, CID);
- cv.put(CellBroadcasts.SERIAL_NUMBER, SERIAL_NUMBER);
- cv.put(CellBroadcasts.SERVICE_CATEGORY, SERVICE_CATEGORY);
- cv.put(CellBroadcasts.LANGUAGE_CODE, LANGUAGE_CODE);
- cv.put(CellBroadcasts.MESSAGE_BODY, MESSAGE_BODY);
- cv.put(CellBroadcasts.MESSAGE_FORMAT, MESSAGE_FORMAT);
- cv.put(CellBroadcasts.MESSAGE_PRIORITY, MESSAGE_PRIORITY);
- cv.put(CellBroadcasts.ETWS_WARNING_TYPE, ETWS_WARNING_TYPE);
- cv.put(CellBroadcasts.CMAS_MESSAGE_CLASS, CMAS_MESSAGE_CLASS);
- cv.put(CellBroadcasts.CMAS_CATEGORY, CMAS_CATEGORY);
- cv.put(CellBroadcasts.CMAS_RESPONSE_TYPE, CMAS_RESPONSE_TYPE);
- cv.put(CellBroadcasts.CMAS_SEVERITY, CMAS_SEVERITY);
- cv.put(CellBroadcasts.CMAS_URGENCY, CMAS_URGENCY);
- cv.put(CellBroadcasts.CMAS_CERTAINTY, CMAS_CERTAINTY);
- cv.put(CellBroadcasts.RECEIVED_TIME, RECEIVED_TIME);
- cv.put(CellBroadcasts.MESSAGE_BROADCASTED, MESSAGE_BROADCASTED);
- cv.put(CellBroadcasts.GEOMETRIES, GEOMETRIES_COORDINATES);
- return cv;
- }
-}
diff --git a/tests/src/com/android/providers/telephony/CellBroadcastProviderTestable.java b/tests/src/com/android/providers/telephony/CellBroadcastProviderTestable.java
deleted file mode 100644
index 8334312..0000000
--- a/tests/src/com/android/providers/telephony/CellBroadcastProviderTestable.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.providers.telephony;
-
-import android.content.Context;
-import android.content.pm.ProviderInfo;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-import androidx.test.InstrumentationRegistry;
-
-public class CellBroadcastProviderTestable extends CellBroadcastProvider {
- private static final String TAG = CellBroadcastProviderTestable.class.getSimpleName();
-
- public CellBroadcastProviderTestable(PermissionChecker permissionChecker) {
- super(permissionChecker);
- }
-
- @Override
- public boolean onCreate() {
- // DO NOT call super.onCreate(), otherwise the permission checker will be override.
- Log.d(TAG, "CellBroadcastProviderTestable onCreate");
- mDbHelper = new InMemoryCellBroadcastProviderDbHelper();
- return true;
- }
-
- public void closeDatabase() {
- mDbHelper.close();
- }
-
- public static class InMemoryCellBroadcastProviderDbHelper extends SQLiteOpenHelper {
- public InMemoryCellBroadcastProviderDbHelper() {
- super(InstrumentationRegistry.getTargetContext(),
- null, // db file name is null for in-memory db
- null, // CursorFactory is null by default
- 1); // db version is no-op for tests
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- Log.d(TAG, "IN MEMORY DB CREATED");
- db.execSQL(getStringForCellBroadcastTableCreation(CELL_BROADCASTS_TABLE_NAME));
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
- }
-
- public void initializeForTesting(Context context) {
- ProviderInfo providerInfo = new ProviderInfo();
- providerInfo.authority = CellBroadcastProvider.AUTHORITY;
-
- // Add context to given carrierIdProvider
- attachInfoForTesting(context, providerInfo);
- }
-}