diff options
author | Dongwon Kang <dwkang@google.com> | 2016-01-26 13:38:32 -0800 |
---|---|---|
committer | Dongwon Kang <dwkang@google.com> | 2016-01-26 15:12:53 -0800 |
commit | 4f8ad54d317ae473b9ffe0d176bc42694667d63d (patch) | |
tree | 3962df9f6f7c513ad0ffbc9fe8e2c7b9362cabcd | |
parent | ff89e80e528017e825e7ac256203ce15a0d78217 (diff) | |
download | TvProvider-4f8ad54d317ae473b9ffe0d176bc42694667d63d.tar.gz |
Add recorded_programs table
Bug: 23786643
Change-Id: I42a4fc84c4bbc8a3c36015032bdc5082c215a242
-rw-r--r-- | src/com/android/providers/tv/TvProvider.java | 142 |
1 files changed, 140 insertions, 2 deletions
diff --git a/src/com/android/providers/tv/TvProvider.java b/src/com/android/providers/tv/TvProvider.java index cba1b79..97ca2d1 100644 --- a/src/com/android/providers/tv/TvProvider.java +++ b/src/com/android/providers/tv/TvProvider.java @@ -41,6 +41,7 @@ import android.media.tv.TvContract.BaseTvColumns; import android.media.tv.TvContract.Channels; import android.media.tv.TvContract.Programs; import android.media.tv.TvContract.Programs.Genres; +import android.media.tv.TvContract.RecordedPrograms; import android.media.tv.TvContract.WatchedPrograms; import android.net.Uri; import android.os.AsyncTask; @@ -80,11 +81,12 @@ public class TvProvider extends ContentProvider { private static final String OP_UPDATE = "update"; private static final String OP_DELETE = "delete"; - private static final int DATABASE_VERSION = 26; + private static final int DATABASE_VERSION = 27; private static final String DATABASE_NAME = "tv.db"; private static final String CHANNELS_TABLE = "channels"; private static final String PROGRAMS_TABLE = "programs"; private static final String WATCHED_PROGRAMS_TABLE = "watched_programs"; + private static final String RECORDED_PROGRAMS_TABLE = "recorded_programs"; private static final String DELETED_CHANNELS_TABLE = "deleted_channels"; // Deprecated private static final String PROGRAMS_TABLE_PACKAGE_NAME_INDEX = "programs_package_name_index"; private static final String PROGRAMS_TABLE_CHANNEL_ID_INDEX = "programs_channel_id_index"; @@ -110,6 +112,8 @@ public class TvProvider extends ContentProvider { private static final int MATCH_PROGRAM_ID = 6; private static final int MATCH_WATCHED_PROGRAM = 7; private static final int MATCH_WATCHED_PROGRAM_ID = 8; + private static final int MATCH_RECORDED_PROGRAM = 9; + private static final int MATCH_RECORDED_PROGRAM_ID = 10; private static final String CHANNELS_COLUMN_LOGO = "logo"; private static final int MAX_LOGO_IMAGE_SIZE = 256; @@ -123,6 +127,7 @@ public class TvProvider extends ContentProvider { private static final Map<String, String> sChannelProjectionMap; private static final Map<String, String> sProgramProjectionMap; private static final Map<String, String> sWatchedProgramProjectionMap; + private static final Map<String, String> sRecordedProgramProjectionMap; static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -134,6 +139,8 @@ public class TvProvider extends ContentProvider { sUriMatcher.addURI(TvContract.AUTHORITY, "program/#", MATCH_PROGRAM_ID); sUriMatcher.addURI(TvContract.AUTHORITY, "watched_program", MATCH_WATCHED_PROGRAM); sUriMatcher.addURI(TvContract.AUTHORITY, "watched_program/#", MATCH_WATCHED_PROGRAM_ID); + sUriMatcher.addURI(TvContract.AUTHORITY, "recorded_program", MATCH_RECORDED_PROGRAM); + sUriMatcher.addURI(TvContract.AUTHORITY, "recorded_program/#", MATCH_RECORDED_PROGRAM_ID); sChannelProjectionMap = new HashMap<>(); sChannelProjectionMap.put(Channels._ID, CHANNELS_TABLE + "." + Channels._ID); @@ -249,6 +256,65 @@ public class TvProvider extends ContentProvider { WatchedPrograms.COLUMN_INTERNAL_SESSION_TOKEN); sWatchedProgramProjectionMap.put(WATCHED_PROGRAMS_COLUMN_CONSOLIDATED, WATCHED_PROGRAMS_COLUMN_CONSOLIDATED); + + sRecordedProgramProjectionMap = new HashMap<>(); + sRecordedProgramProjectionMap.put(RecordedPrograms._ID, RecordedPrograms._ID); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_PACKAGE_NAME, + RecordedPrograms.COLUMN_PACKAGE_NAME); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_CHANNEL_ID, + RecordedPrograms.COLUMN_CHANNEL_ID); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_SEASON_NUMBER, + RecordedPrograms.COLUMN_SEASON_NUMBER); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_EPISODE_NUMBER, + RecordedPrograms.COLUMN_EPISODE_NUMBER); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_EPISODE_TITLE, + RecordedPrograms.COLUMN_EPISODE_TITLE); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_START_TIME_UTC_MILLIS, + RecordedPrograms.COLUMN_START_TIME_UTC_MILLIS); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_END_TIME_UTC_MILLIS, + RecordedPrograms.COLUMN_END_TIME_UTC_MILLIS); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_BROADCAST_GENRE, + RecordedPrograms.COLUMN_BROADCAST_GENRE); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_CANONICAL_GENRE, + RecordedPrograms.COLUMN_CANONICAL_GENRE); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_SHORT_DESCRIPTION, + RecordedPrograms.COLUMN_SHORT_DESCRIPTION); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_LONG_DESCRIPTION, + RecordedPrograms.COLUMN_LONG_DESCRIPTION); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_VIDEO_WIDTH, + RecordedPrograms.COLUMN_VIDEO_WIDTH); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_VIDEO_HEIGHT, + RecordedPrograms.COLUMN_VIDEO_HEIGHT); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_AUDIO_LANGUAGE, + RecordedPrograms.COLUMN_AUDIO_LANGUAGE); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_CONTENT_RATING, + RecordedPrograms.COLUMN_CONTENT_RATING); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_POSTER_ART_URI, + RecordedPrograms.COLUMN_POSTER_ART_URI); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_THUMBNAIL_URI, + RecordedPrograms.COLUMN_THUMBNAIL_URI); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_SEARCHABLE, + RecordedPrograms.COLUMN_SEARCHABLE); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_RECORDING_DATA_URI, + RecordedPrograms.COLUMN_RECORDING_DATA_URI); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_RECORDING_DATA_BYTES, + RecordedPrograms.COLUMN_RECORDING_DATA_BYTES); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_RECORDING_DURATION_MILLIS, + RecordedPrograms.COLUMN_RECORDING_DURATION_MILLIS); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS, + RecordedPrograms.COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_INTERNAL_PROVIDER_DATA, + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_DATA); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG1, + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG1); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG2, + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG2); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG3, + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG3); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG4, + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG4); + sRecordedProgramProjectionMap.put(RecordedPrograms.COLUMN_VERSION_NUMBER, + RecordedPrograms.COLUMN_VERSION_NUMBER); } // Mapping from broadcast genre to canonical genre. @@ -262,6 +328,39 @@ public class TvProvider extends ContentProvider { private static final String PERMISSION_ACCESS_WATCHED_PROGRAMS = "com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS"; + private static final String CREATE_RECORDED_PROGRAMS_TABLE_SQL = + "CREATE TABLE " + RECORDED_PROGRAMS_TABLE + " (" + + RecordedPrograms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + + RecordedPrograms.COLUMN_PACKAGE_NAME + " TEXT NOT NULL," + + RecordedPrograms.COLUMN_CHANNEL_ID + " INTEGER," + + RecordedPrograms.COLUMN_TITLE + " TEXT," + + RecordedPrograms.COLUMN_SEASON_NUMBER + " INTEGER," + + RecordedPrograms.COLUMN_EPISODE_NUMBER + " INTEGER," + + RecordedPrograms.COLUMN_EPISODE_TITLE + " TEXT," + + RecordedPrograms.COLUMN_START_TIME_UTC_MILLIS + " INTEGER," + + RecordedPrograms.COLUMN_END_TIME_UTC_MILLIS + " INTEGER," + + RecordedPrograms.COLUMN_BROADCAST_GENRE + " TEXT," + + RecordedPrograms.COLUMN_CANONICAL_GENRE + " TEXT," + + RecordedPrograms.COLUMN_SHORT_DESCRIPTION + " TEXT," + + RecordedPrograms.COLUMN_LONG_DESCRIPTION + " TEXT," + + RecordedPrograms.COLUMN_VIDEO_WIDTH + " INTEGER," + + RecordedPrograms.COLUMN_VIDEO_HEIGHT + " INTEGER," + + RecordedPrograms.COLUMN_AUDIO_LANGUAGE + " TEXT," + + RecordedPrograms.COLUMN_CONTENT_RATING + " TEXT," + + RecordedPrograms.COLUMN_POSTER_ART_URI + " TEXT," + + RecordedPrograms.COLUMN_THUMBNAIL_URI + " TEXT," + + RecordedPrograms.COLUMN_SEARCHABLE + " INTEGER NOT NULL DEFAULT 1," + + RecordedPrograms.COLUMN_RECORDING_DATA_URI + " TEXT," + + RecordedPrograms.COLUMN_RECORDING_DATA_BYTES + " INTEGER," + + RecordedPrograms.COLUMN_RECORDING_DURATION_MILLIS + " INTEGER," + + RecordedPrograms.COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS + " INTEGER," + + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_DATA + " BLOB," + + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG1 + " INTEGER," + + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG2 + " INTEGER," + + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG3 + " INTEGER," + + RecordedPrograms.COLUMN_INTERNAL_PROVIDER_FLAG4 + " INTEGER," + + RecordedPrograms.COLUMN_VERSION_NUMBER + " INTEGER);"; + private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); @@ -376,6 +475,7 @@ public class TvProvider extends ContentProvider { + ");"); db.execSQL("CREATE INDEX " + WATCHED_PROGRAMS_TABLE_CHANNEL_ID_INDEX + " ON " + WATCHED_PROGRAMS_TABLE + "(" + WatchedPrograms.COLUMN_CHANNEL_ID + ");"); + db.execSQL(CREATE_RECORDED_PROGRAMS_TABLE_SQL); } @Override @@ -428,6 +528,11 @@ public class TvProvider extends ContentProvider { + Channels.COLUMN_APP_LINK_INTENT_URI + " TEXT;"); db.execSQL("ALTER TABLE " + PROGRAMS_TABLE + " ADD " + Programs.COLUMN_SEARCHABLE + " INTEGER NOT NULL DEFAULT 1;"); + oldVersion++; + } + if (oldVersion == 26) { + db.execSQL(CREATE_RECORDED_PROGRAMS_TABLE_SQL); + oldVersion++; } } } @@ -508,6 +613,10 @@ public class TvProvider extends ContentProvider { return WatchedPrograms.CONTENT_TYPE; case MATCH_WATCHED_PROGRAM_ID: return WatchedPrograms.CONTENT_ITEM_TYPE; + case MATCH_RECORDED_PROGRAM: + return RecordedPrograms.CONTENT_TYPE; + case MATCH_RECORDED_PROGRAM_ID: + return RecordedPrograms.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI " + uri); } @@ -566,11 +675,14 @@ public class TvProvider extends ContentProvider { return insertProgram(uri, values); case MATCH_WATCHED_PROGRAM: return insertWatchedProgram(uri, values); + case MATCH_RECORDED_PROGRAM: + return insertRecordedProgram(uri, values); case MATCH_CHANNEL_ID: case MATCH_CHANNEL_ID_LOGO: case MATCH_PASSTHROUGH_ID: case MATCH_PROGRAM_ID: case MATCH_WATCHED_PROGRAM_ID: + case MATCH_RECORDED_PROGRAM_ID: throw new UnsupportedOperationException("Cannot insert into that URI: " + uri); default: throw new IllegalArgumentException("Unknown URI " + uri); @@ -642,6 +754,23 @@ public class TvProvider extends ContentProvider { + " COLUMN_WATCH_END_TIME_UTC_MILLIS should be specified"); } + private Uri insertRecordedProgram(Uri uri, ContentValues values) { + // Mark the owner package of this program. + values.put(Programs.COLUMN_PACKAGE_NAME, getCallingPackage_()); + + checkAndConvertGenre(values); + + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + long rowId = db.insert(RECORDED_PROGRAMS_TABLE, null, values); + if (rowId > 0) { + Uri recordedProgramUri = TvContract.buildRecordedProgramUri(rowId); + notifyChange(recordedProgramUri); + return recordedProgramUri; + } + + throw new SQLException("Failed to insert row into " + uri); + } + @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SqlParams params = createSqlParams(OP_DELETE, uri, selection, selectionArgs); @@ -657,10 +786,12 @@ public class TvProvider extends ContentProvider { case MATCH_CHANNEL: case MATCH_PROGRAM: case MATCH_WATCHED_PROGRAM: + case MATCH_RECORDED_PROGRAM: case MATCH_CHANNEL_ID: case MATCH_PASSTHROUGH_ID: case MATCH_PROGRAM_ID: case MATCH_WATCHED_PROGRAM_ID: + case MATCH_RECORDED_PROGRAM_ID: count = db.delete(params.getTables(), params.getSelection(), params.getSelectionArgs()); break; @@ -681,7 +812,8 @@ public class TvProvider extends ContentProvider { && !callerHasModifyParentalControlsPermission()) { throw new SecurityException("Not allowed to modify Channels.COLUMN_LOCKED"); } - } else if (params.getTables().equals(PROGRAMS_TABLE)) { + } else if (params.getTables().equals(PROGRAMS_TABLE) + || params.getTables().equals(RECORDED_PROGRAMS_TABLE)) { checkAndConvertGenre(values); } SQLiteDatabase db = mOpenHelper.getWritableDatabase(); @@ -785,6 +917,12 @@ public class TvProvider extends ContentProvider { params.appendWhere(WatchedPrograms._ID + "=?", uri.getLastPathSegment()); params.appendWhere(WATCHED_PROGRAMS_COLUMN_CONSOLIDATED + "=?", "1"); break; + case MATCH_RECORDED_PROGRAM: + params.setTables(RECORDED_PROGRAMS_TABLE); + // fall-through + case MATCH_RECORDED_PROGRAM_ID: + params.appendWhere(RecordedPrograms._ID + "=?", uri.getLastPathSegment()); + break; case MATCH_CHANNEL_ID_LOGO: if (operation.equals(OP_DELETE)) { params.setTables(CHANNELS_TABLE); |