/* * Copyright (C) 2015 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.tv.testing; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.media.tv.TvContract; import android.media.tv.TvContract.Programs; import android.net.Uri; import android.util.Log; import com.android.tv.common.TvContentRatingCache; import java.util.ArrayList; import java.util.concurrent.TimeUnit; public class ProgramUtils { private static final String TAG = "ProgramUtils"; private static final boolean DEBUG = false; // Populate program data for a week. private static final long PROGRAM_INSERT_DURATION_MS = TimeUnit.DAYS.toMillis(7); private static final int MAX_DB_INSERT_COUNT_AT_ONCE = 500; /** * Populate programs by repeating given program information. * This method will populate programs without any gap nor overlapping * starting from the current time. */ public static void populatePrograms(Context context, Uri channelUri, ProgramInfo program) { ContentValues values = new ContentValues(); long channelId = ContentUris.parseId(channelUri); values.put(Programs.COLUMN_CHANNEL_ID, channelId); values.put(Programs.COLUMN_SHORT_DESCRIPTION, program.description); values.put(Programs.COLUMN_CONTENT_RATING, TvContentRatingCache.contentRatingsToString(program.contentRatings)); long currentTimeMs = System.currentTimeMillis(); long targetEndTimeMs = currentTimeMs + PROGRAM_INSERT_DURATION_MS; long timeMs = getLastProgramEndTimeMs(context, channelUri, currentTimeMs, targetEndTimeMs); if (timeMs <= 0) { timeMs = currentTimeMs; } int index = program.getIndex(timeMs, channelId); timeMs = program.getStartTimeMs(index, channelId); ArrayList list = new ArrayList<>(); while (timeMs < targetEndTimeMs) { ProgramInfo programAt = program.build(context, index++); values.put(Programs.COLUMN_TITLE, programAt.title); values.put(Programs.COLUMN_EPISODE_TITLE, programAt.episode); values.put(Programs.COLUMN_SEASON_NUMBER, programAt.seasonNumber); values.put(Programs.COLUMN_EPISODE_NUMBER, programAt.episodeNumber); values.put(Programs.COLUMN_POSTER_ART_URI, programAt.posterArtUri); values.put(Programs.COLUMN_START_TIME_UTC_MILLIS, timeMs); values.put(Programs.COLUMN_END_TIME_UTC_MILLIS, timeMs + programAt.durationMs); values.put(Programs.COLUMN_CANONICAL_GENRE, programAt.genre); values.put(Programs.COLUMN_POSTER_ART_URI, programAt.posterArtUri); list.add(new ContentValues(values)); timeMs += programAt.durationMs; if (list.size() >= MAX_DB_INSERT_COUNT_AT_ONCE || timeMs >= targetEndTimeMs) { context.getContentResolver().bulkInsert(Programs.CONTENT_URI, list.toArray(new ContentValues[list.size()])); if (DEBUG) Log.d(TAG, "Inserted " + list.size() + " programs for " + channelUri); list.clear(); } } } private static long getLastProgramEndTimeMs( Context context, Uri channelUri, long startTimeMs, long endTimeMs) { Uri uri = TvContract.buildProgramsUriForChannel(channelUri, startTimeMs, endTimeMs); String[] projection = {Programs.COLUMN_END_TIME_UTC_MILLIS}; try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null)) { if (cursor != null && cursor.moveToLast()) { return cursor.getLong(0); } } return 0; } private ProgramUtils() {} }