summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2019-10-25 10:28:08 -0700
committerXin Li <delphij@google.com>2019-10-25 10:28:08 -0700
commitcc84481fa5d673b0e0ec6a9358945b2be25079f1 (patch)
tree917323ec76b06ba99a2f6d78437cb9971e969848
parente9f5fb6e81add65eef873116cccbc9312f3ee605 (diff)
parentb5bd26e2c5d116ec0a962b9b1c1d7771c5449c2c (diff)
downloadTvProvider-cc84481fa5d673b0e0ec6a9358945b2be25079f1.tar.gz
Merge Coral/Flame into AOSP master
Bug: 141248619 Change-Id: If2c19a75ca1ed019fc36520d802b696fb140c146 Merged-In: Ia24d73d2213c9859bf059598aa58d2e309e451c0
-rw-r--r--res/values-ja/strings.xml2
-rw-r--r--src/com/android/providers/tv/TvProvider.java27
-rw-r--r--tests/src/com/android/providers/tv/TvProviderForTesting.java4
-rw-r--r--tests/src/com/android/providers/tv/UnrecognizedColumnsTest.java116
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;
+ }
+}