diff options
author | Xin Li <delphij@google.com> | 2019-10-25 10:28:08 -0700 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2019-10-25 10:28:08 -0700 |
commit | cc84481fa5d673b0e0ec6a9358945b2be25079f1 (patch) | |
tree | 917323ec76b06ba99a2f6d78437cb9971e969848 | |
parent | e9f5fb6e81add65eef873116cccbc9312f3ee605 (diff) | |
parent | b5bd26e2c5d116ec0a962b9b1c1d7771c5449c2c (diff) | |
download | TvProvider-cc84481fa5d673b0e0ec6a9358945b2be25079f1.tar.gz |
Merge Coral/Flame into AOSP master
Bug: 141248619
Change-Id: If2c19a75ca1ed019fc36520d802b696fb140c146
Merged-In: Ia24d73d2213c9859bf059598aa58d2e309e451c0
-rw-r--r-- | res/values-ja/strings.xml | 2 | ||||
-rw-r--r-- | src/com/android/providers/tv/TvProvider.java | 27 | ||||
-rw-r--r-- | tests/src/com/android/providers/tv/TvProviderForTesting.java | 4 | ||||
-rw-r--r-- | tests/src/com/android/providers/tv/UnrecognizedColumnsTest.java | 116 |
4 files changed, 144 insertions, 5 deletions
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index a85e674..acaedf4 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -18,5 +18,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="7454398782183407432">"TV Storage"</string> <string name="permlab_readTvListings" msgid="5272001606068276291">"すべてのテレビ番組表の読み取り"</string> - <string name="permdesc_readTvListings" msgid="1165157606059567535">"端末で利用できるすべてのテレビ番組表の読み取り"</string> + <string name="permdesc_readTvListings" msgid="1165157606059567535">"デバイスで利用できるすべてのテレビ番組表の読み取り"</string> </resources> diff --git a/src/com/android/providers/tv/TvProvider.java b/src/com/android/providers/tv/TvProvider.java index 76bdf8e..d57eb8b 100644 --- a/src/com/android/providers/tv/TvProvider.java +++ b/src/com/android/providers/tv/TvProvider.java @@ -124,7 +124,6 @@ public class TvProvider extends ContentProvider { private static final String OP_UPDATE = "update"; private static final String OP_DELETE = "delete"; - private static final UriMatcher sUriMatcher; private static final int MATCH_CHANNEL = 1; private static final int MATCH_CHANNEL_ID = 2; @@ -1660,13 +1659,33 @@ public class TvProvider extends ContentProvider { } Map<String, String> columnProjectionMap = new HashMap<>(); for (String columnName : projection) { - // Value NULL will be provided if the requested column does not exist in the database. - columnProjectionMap.put(columnName, - projectionMap.getOrDefault(columnName, "NULL as " + columnName)); + String value = projectionMap.get(columnName); + if (value != null) { + columnProjectionMap.put(columnName, value); + } else { + // Value NULL will be provided if the requested column does not exist in the + // database. + value = "NULL AS " + DatabaseUtils.sqlEscapeString(columnName); + columnProjectionMap.put(columnName, value); + + if (needEventLog(columnName)) { + android.util.EventLog.writeEvent(0x534e4554, "135269669", -1, ""); + } + } } return columnProjectionMap; } + private boolean needEventLog(String columnName) { + for (int i = 0; i < columnName.length(); i++) { + char c = columnName.charAt(i); + if (!Character.isLetterOrDigit(c) && c != '_') { + return true; + } + } + return false; + } + private void filterContentValues(ContentValues values, Map<String, String> projectionMap) { Iterator<String> iter = values.keySet().iterator(); while (iter.hasNext()) { diff --git a/tests/src/com/android/providers/tv/TvProviderForTesting.java b/tests/src/com/android/providers/tv/TvProviderForTesting.java index 0f9638e..5300756 100644 --- a/tests/src/com/android/providers/tv/TvProviderForTesting.java +++ b/tests/src/com/android/providers/tv/TvProviderForTesting.java @@ -21,6 +21,7 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.media.tv.TvContract; import android.net.Uri; +import java.io.File; class TvProviderForTesting extends TvProvider { private static final String FAKE_SESSION_TOKEN = "TvProviderForTesting"; @@ -51,7 +52,10 @@ class TvProviderForTesting extends TvProvider { super.shutdown(); if (mDatabaseHelper != null) { + SQLiteDatabase db = mDatabaseHelper.getWritableDatabase(); + File databaseFile = new File(db.getPath()); mDatabaseHelper.close(); + SQLiteDatabase.deleteDatabase(databaseFile); } } diff --git a/tests/src/com/android/providers/tv/UnrecognizedColumnsTest.java b/tests/src/com/android/providers/tv/UnrecognizedColumnsTest.java new file mode 100644 index 0000000..f552013 --- /dev/null +++ b/tests/src/com/android/providers/tv/UnrecognizedColumnsTest.java @@ -0,0 +1,116 @@ +package com.android.providers.tv; + +import android.content.pm.ProviderInfo; +import android.database.Cursor; +import android.media.tv.TvContract; +import android.media.tv.TvContract.Programs; +import android.os.Bundle; +import android.provider.Settings; +import android.test.AndroidTestCase; +import android.test.mock.MockContentProvider; +import android.test.mock.MockContentResolver; +import com.android.providers.tv.Utils.Program; +import java.util.Arrays; + +import com.google.android.collect.Sets; + +public class UnrecognizedColumnsTest extends AndroidTestCase { + private static final String PERMISSION_ACCESS_ALL_EPG_DATA = + "com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA"; + private static final String PERMISSION_READ_TV_LISTINGS = "android.permission.READ_TV_LISTINGS"; + + private static final String MY_PACKAGE = "example.my"; + private static final String ANOTHER_PACKAGE = "example.another"; + + private MockContentResolver mResolver; + private TvProviderForTesting mProvider; + private MockTvProviderContext mContext; + private Program mProgram; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + mResolver = new MockContentResolver(); + mResolver.addProvider(Settings.AUTHORITY, new MockContentProvider() { + @Override + public Bundle call(String method, String request, Bundle args) { + return new Bundle(); + } + }); + + mProvider = new TvProviderForTesting(); + mResolver.addProvider(TvContract.AUTHORITY, mProvider); + + mContext = new MockTvProviderContext(mResolver, getContext()); + // get data of the calling package only + mContext.grantOrRejectPermission(PERMISSION_ACCESS_ALL_EPG_DATA, false); + mContext.grantOrRejectPermission(PERMISSION_READ_TV_LISTINGS, false); + + setContext(mContext); + + final ProviderInfo info = new ProviderInfo(); + info.authority = TvContract.AUTHORITY; + mProvider.attachInfoForTesting(getContext(), info); + } + + + @Override + protected void tearDown() throws Exception { + Utils.clearTvProvider(mResolver); + mProvider.setOpenHelper(null, true); + mProvider.shutdown(); + super.tearDown(); + } + + public void testUnrecognizedColumns() { + insertPrograms(); + + String[] projection = new String[] { + TvContract.Programs._ID, + "_random_name", + " with spaces ", + "\' in single quotes \'", + "\" in double quotes \"", + "quotes \' inside \' this \" name \"", + }; + + Cursor cursor = + mResolver.query(TvContract.Programs.CONTENT_URI, projection, null, null, null); + assertNotNull(cursor); + cursor.moveToNext(); + assertEquals(1, cursor.getCount()); + + assertEquals( + "Column names don't match.", + Arrays.asList( + Programs._ID, + "_random_name", + " with spaces ", + "\' in single quotes \'", + "\" in double quotes \"", + "quotes \' inside \' this \" name \""), + Arrays.asList(cursor.getColumnNames())); + + assertEquals(mProgram.id, cursor.getLong(0)); + assertNull(cursor.getString(1)); + assertNull(cursor.getString(2)); + assertNull(cursor.getString(3)); + assertNull(cursor.getString(4)); + assertNull(cursor.getString(5)); + } + + private void insertPrograms() { + mProvider.callingPackage = MY_PACKAGE; + long myChannelId = Utils.insertChannel(mResolver); + mProgram = new Program(1, MY_PACKAGE); + Utils.insertPrograms(mResolver, myChannelId, mProgram); + + mProvider.callingPackage = ANOTHER_PACKAGE; + long anotherChannelId = Utils.insertChannel(mResolver); + Program anotherProgram = new Program(2, ANOTHER_PACKAGE); + Utils.insertPrograms(mResolver, anotherChannelId, anotherProgram); + + mProvider.callingPackage = MY_PACKAGE; + } +} |