Java 类android.media.tv.TvContract 实例源码
项目:androidtv-sample
文件:TvContractUtils.java
public static LongSparseArray<XmlTvParser.XmlTvChannel> buildChannelMap(
ContentResolver resolver, String inputId, List<XmlTvParser.XmlTvChannel> channels) {
Uri uri = TvContract.buildChannelsUriForInput(inputId);
String[] projection = {
TvContract.Channels._ID,
TvContract.Channels.COLUMN_DISPLAY_NUMBER
};
LongSparseArray<XmlTvParser.XmlTvChannel> channelMap = new LongSparseArray<>();
try (Cursor cursor = resolver.query(uri, projection, null, null, null)) {
if (cursor == null || cursor.getCount() == 0) {
return null;
}
while (cursor.moveToNext()) {
long channelId = cursor.getLong(0);
String channelNumber = cursor.getString(1);
channelMap.put(channelId, getChannelByNumber(channelNumber, channels));
}
} catch (Exception e) {
Log.d(TAG, "Content provider query: " + Arrays.toString(e.getStackTrace()));
return null;
}
return channelMap;
}
项目:androidtv-sample
文件:TvContractUtils.java
public static List<Program> getPrograms(ContentResolver resolver, Uri channelUri) {
Uri uri = TvContract.buildProgramsUriForChannel(channelUri);
List<Program> programs = new ArrayList<>();
// TvProvider returns programs in chronological order by default.
try (Cursor cursor = resolver.query(uri, null, null, null, null)) {
if (cursor == null || cursor.getCount() == 0) {
return programs;
}
while (cursor.moveToNext()) {
programs.add(Program.fromCursor(cursor));
}
} catch (Exception e) {
Log.w(TAG, "Unable to get programs for " + channelUri, e);
}
return programs;
}
项目:android_packages_apps_tv
文件:RecordingTask.java
private void handleStartRecording() {
if (DEBUG) Log.d(TAG, "handleStartRecording " + mScheduledRecording);
long programId = mScheduledRecording.getProgramId();
mRecordingSession.startRecording(programId == ScheduledRecording.ID_NOT_SET ? null
: TvContract.buildProgramUri(programId));
updateRecordingState(ScheduledRecording.STATE_RECORDING_IN_PROGRESS);
// If it starts late, it's clipped.
if (mScheduledRecording.getStartTimeMs() + CLIPPED_THRESHOLD_MS
< mClock.currentTimeMillis()) {
mStartedWithClipping = true;
}
mState = State.RECORDING_STARTED;
if (!sendEmptyMessageAtAbsoluteTime(MSG_STOP_RECORDING,
mScheduledRecording.getEndTimeMs())) {
failAndQuit();
}
}
项目:android_packages_apps_tv
文件:DvrStorageStatusManager.java
@Override
protected Void doInBackground(Void... params) {
@DvrStorageStatusManager.StorageStatus int storageStatus = getDvrStorageStatus();
if (storageStatus == DvrStorageStatusManager.STORAGE_STATUS_MISSING) {
return null;
}
List<ContentProviderOperation> ops = getDeleteOps(storageStatus
== DvrStorageStatusManager.STORAGE_STATUS_TOTAL_CAPACITY_TOO_SMALL);
if (ops == null || ops.isEmpty()) {
return null;
}
Log.i(TAG, "New device storage mounted. # of recordings to be forgotten : "
+ ops.size());
for (int i = 0 ; i < ops.size() && !isCancelled() ; i += BATCH_OPERATION_COUNT) {
int toIndex = (i + BATCH_OPERATION_COUNT) > ops.size()
? ops.size() : (i + BATCH_OPERATION_COUNT);
ArrayList<ContentProviderOperation> batchOps =
new ArrayList<>(ops.subList(i, toIndex));
try {
mContext.getContentResolver().applyBatch(TvContract.AUTHORITY, batchOps);
} catch (RemoteException | OperationApplicationException e) {
Log.e(TAG, "Failed to clean up RecordedPrograms.", e);
}
}
return null;
}
项目:android_packages_apps_tv
文件:ScheduledRecordingPresenter.java
private void setTitleAndImage(RecordingCardView cardView, ScheduledRecording recording) {
Channel channel = mChannelDataManager.getChannel(recording.getChannelId());
SpannableString title = recording.getProgramTitleWithEpisodeNumber(mContext) == null ?
null : new SpannableString(recording.getProgramTitleWithEpisodeNumber(mContext));
if (TextUtils.isEmpty(title)) {
title = new SpannableString(channel != null ? channel.getDisplayName()
: mContext.getResources().getString(R.string.no_program_information));
} else {
String programTitle = recording.getProgramTitle();
title.setSpan(new TextAppearanceSpan(mContext,
R.style.text_appearance_card_view_episode_number),
programTitle == null ? 0 : programTitle.length(), title.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
String imageUri = recording.getProgramPosterArtUri();
boolean isChannelLogo = false;
if (TextUtils.isEmpty(imageUri)) {
imageUri = channel != null ?
TvContract.buildChannelLogoUri(channel.getId()).toString() : null;
isChannelLogo = true;
}
cardView.setTitle(title);
cardView.setImageUri(imageUri, isChannelLogo);
}
项目:android_packages_apps_tv
文件:DetailsContent.java
/**
* Sets background image and logo image URI and channel is used for fallback images.
*/
public Builder setImageUris(@Nullable String posterArtUri,
@Nullable String thumbnailUri, @Nullable Channel channel) {
mDetailsContent.mLogoImageUri = null;
mDetailsContent.mBackgroundImageUri = null;
if (!TextUtils.isEmpty(posterArtUri) && !TextUtils.isEmpty(thumbnailUri)) {
mDetailsContent.mLogoImageUri = posterArtUri;
mDetailsContent.mBackgroundImageUri = thumbnailUri;
} else if (!TextUtils.isEmpty(posterArtUri)) {
// thumbnailUri is empty
mDetailsContent.mLogoImageUri = posterArtUri;
mDetailsContent.mBackgroundImageUri = posterArtUri;
} else if (!TextUtils.isEmpty(thumbnailUri)) {
// posterArtUri is empty
mDetailsContent.mLogoImageUri = thumbnailUri;
mDetailsContent.mBackgroundImageUri = thumbnailUri;
}
if (TextUtils.isEmpty(mDetailsContent.mLogoImageUri) && channel != null) {
String channelLogoUri = TvContract.buildChannelLogoUri(channel.getId())
.toString();
mDetailsContent.mLogoImageUri = channelLogoUri;
mDetailsContent.mBackgroundImageUri = channelLogoUri;
}
return this;
}
项目:android_packages_apps_tv
文件:DvrPlaybackMediaSessionHelper.java
private void setupMediaSession(RecordedProgram program) {
mProgramDurationMs = program.getDurationMillis();
String cardTitleText = program.getTitle();
if (TextUtils.isEmpty(cardTitleText)) {
Channel channel = mChannelDataManager.getChannel(program.getChannelId());
cardTitleText = (channel != null) ? channel.getDisplayName()
: mActivity.getString(R.string.no_program_information);
}
updateMediaMetadata(program.getId(), cardTitleText, program.getDescription(),
mProgramDurationMs, null, 0);
String posterArtUri = program.getPosterArtUri();
if (posterArtUri == null) {
posterArtUri = TvContract.buildChannelLogoUri(program.getChannelId()).toString();
}
updatePosterArt(program, cardTitleText, program.getDescription(),
mProgramDurationMs, null, posterArtUri);
mMediaSession.setActive(true);
}
项目:android_packages_apps_tv
文件:RecommendationDataManager.java
private void onStart() {
if (!mStarted) {
mStarted = true;
mCancelLoadTask = false;
if (!PermissionUtils.hasAccessWatchedHistory(mContext)) {
mWatchedHistoryManager = new WatchedHistoryManager(mContext);
mWatchedHistoryManager.setListener(this);
mWatchedHistoryManager.start();
} else {
mContext.getContentResolver().registerContentObserver(
TvContract.WatchedPrograms.CONTENT_URI, true, mContentObserver);
mHandler.obtainMessage(MSG_UPDATE_WATCH_HISTORY,
TvContract.WatchedPrograms.CONTENT_URI)
.sendToTarget();
}
mTvInputManager = (TvInputManager) mContext.getSystemService(Context.TV_INPUT_SERVICE);
mTvInputManager.registerCallback(mInternalCallback, mHandler);
for (TvInputInfo input : mTvInputManager.getTvInputList()) {
mInputs.add(input.getId());
}
}
if (mChannelRecordMapLoaded) {
mHandler.sendEmptyMessage(MSG_NOTIFY_CHANNEL_RECORD_MAP_LOADED);
}
}
项目:android_packages_apps_tv
文件:ChannelDataManager.java
/**
* Updates a column {@code columnName} of DB table {@code uri} with the value
* {@code columnValue}. The selective rows in the ID list {@code ids} will be updated.
* The DB operations will run on {@link AsyncDbTask#getExecutor()}.
*/
private void updateOneColumnValue(
final String columnName, final int columnValue, final List<Long> ids) {
if (!PermissionUtils.hasAccessAllEpg(mContext)) {
// TODO: support this feature for non-system LC app. b/23939816
return;
}
AsyncDbTask.execute(new Runnable() {
@Override
public void run() {
String selection = Utils.buildSelectionForIds(Channels._ID, ids);
ContentValues values = new ContentValues();
values.put(columnName, columnValue);
mContentResolver.update(TvContract.Channels.CONTENT_URI, values, selection, null);
}
});
}
项目:android_packages_apps_tv
文件:SetupUtils.java
private SetupUtils(TvApplication tvApplication) {
mTvApplication = tvApplication;
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(tvApplication);
mSetUpInputs = new ArraySet<>();
mSetUpInputs.addAll(mSharedPreferences.getStringSet(PREF_KEY_SET_UP_INPUTS,
Collections.emptySet()));
mKnownInputs = new ArraySet<>();
mKnownInputs.addAll(mSharedPreferences.getStringSet(PREF_KEY_KNOWN_INPUTS,
Collections.emptySet()));
mRecognizedInputs = new ArraySet<>();
mRecognizedInputs.addAll(mSharedPreferences.getStringSet(PREF_KEY_RECOGNIZED_INPUTS,
mKnownInputs));
mIsFirstTune = mSharedPreferences.getBoolean(PREF_KEY_IS_FIRST_TUNE, true);
mTunerInputId = TvContract.buildInputId(new ComponentName(tvApplication,
TunerTvInputService.class));
}
项目:android_packages_apps_tv
文件:SetupUtils.java
/**
* Grants permission for writing EPG data to a given package.
*
* @param context The Context used for granting permission.
* @param packageName The name of the package to give permission.
*/
public static void grantEpgPermission(Context context, String packageName) {
if (DEBUG) {
Log.d(TAG, "grantEpgPermission(context=" + context + ", packageName=" + packageName
+ ")");
}
try {
int modeFlags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION;
context.grantUriPermission(packageName, TvContract.Channels.CONTENT_URI, modeFlags);
context.grantUriPermission(packageName, TvContract.Programs.CONTENT_URI, modeFlags);
} catch (SecurityException e) {
Log.e(TAG, "Either TvProvider does not allow granting of Uri permissions or the app"
+ " does not have permission.", e);
}
}
项目:android_packages_apps_tv
文件:Utils.java
/**
* Gets the info of the program on particular time.
*/
@WorkerThread
public static Program getProgramAt(Context context, long channelId, long timeMs) {
if (channelId == Channel.INVALID_ID) {
Log.e(TAG, "getCurrentProgramAt - channelId is invalid");
return null;
}
if (context.getMainLooper().getThread().equals(Thread.currentThread())) {
String message = "getCurrentProgramAt called on main thread";
if (DEBUG) {
// Generating a stack trace can be expensive, only do it in debug mode.
Log.w(TAG, message, new IllegalStateException(message));
} else {
Log.w(TAG, message);
}
}
Uri uri = TvContract.buildProgramsUriForChannel(TvContract.buildChannelUri(channelId),
timeMs, timeMs);
try (Cursor cursor = context.getContentResolver().query(uri, Program.PROJECTION,
null, null, null)) {
if (cursor != null && cursor.moveToNext()) {
return Program.fromCursor(cursor);
}
}
return null;
}
项目:android_packages_apps_tv
文件:TunerRecordingSessionWorker.java
private Program getRecordedProgram() {
ContentResolver resolver = mContext.getContentResolver();
Uri programUri = mProgramUri;
if (mProgramUri == null) {
long avg = mRecordStartTime / 2 + mRecordEndTime / 2;
programUri = TvContract.buildProgramsUriForChannel(mChannel.getChannelId(), avg, avg);
}
try (Cursor c = resolver.query(programUri, Program.PROJECTION, null, null, SORT_BY_TIME)) {
if (c != null) {
Program result = Program.onQuery(c);
if (DEBUG) {
Log.v(TAG, "Finished query for " + this);
}
return result;
} else {
if (c == null) {
Log.e(TAG, "Unknown query error for " + this);
} else {
if (DEBUG) Log.d(TAG, "Canceled query for " + this);
}
return null;
}
}
}
项目:android_packages_apps_tv
文件:TunerRecordingSessionWorker.java
private Uri insertRecordedProgram(Program program, long channelId, String storageUri,
long totalBytes, long startTime, long endTime) {
// TODO: Set title even though program is null.
RecordedProgram recordedProgram = RecordedProgram.builder()
.setInputId(mInputId)
.setChannelId(channelId)
.setDataUri(storageUri)
.setDurationMillis(endTime - startTime)
.setDataBytes(totalBytes)
// startTime and endTime could be overridden by program's start and end value.
.setStartTimeUtcMillis(startTime)
.setEndTimeUtcMillis(endTime)
.build();
ContentValues values = RecordedProgram.toValues(recordedProgram);
if (program != null) {
values.putAll(program.buildValues());
}
return mContext.getContentResolver().insert(TvContract.RecordedPrograms.CONTENT_URI,
values);
}
项目:android_packages_apps_tv
文件:ChannelDataManager.java
public TunerChannel getChannel(long channelId) {
TunerChannel channel = mTunerChannelMap.get(channelId);
if (channel != null) {
return channel;
}
mHandler.sendEmptyMessage(MSG_BUILD_CHANNEL_MAP);
byte[] data = null;
try (Cursor cursor = mContext.getContentResolver().query(TvContract.buildChannelUri(
channelId), CHANNEL_DATA_SELECTION_ARGS, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
data = cursor.getBlob(1);
}
}
if (data == null) {
return null;
}
channel = TunerChannel.parseFrom(data);
if (channel == null) {
return null;
}
channel.setChannelId(channelId);
return channel;
}
项目:android_packages_apps_tv
文件:ChannelDataManager.java
public void scannedChannelHandlingCompleted() {
mIsScanning.set(false);
if (!mPreviousScannedChannels.isEmpty()) {
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
for (TunerChannel channel : mPreviousScannedChannels) {
ops.add(ContentProviderOperation.newDelete(
TvContract.buildChannelUri(channel.getChannelId())).build());
}
try {
mContext.getContentResolver().applyBatch(TvContract.AUTHORITY, ops);
} catch (RemoteException | OperationApplicationException e) {
Log.e(TAG, "Error deleting obsolete channels", e);
}
}
if (mChannelScanListener != null && mChannelScanHandler != null) {
mChannelScanHandler.post(new Runnable() {
@Override
public void run() {
mChannelScanListener.onChannelHandlingDone();
}
});
} else {
Log.e(TAG, "Error. mChannelScanListener is null.");
}
}
项目:android_packages_apps_tv
文件:ChannelDataManager.java
private ContentProviderOperation buildContentProviderOperation(
ContentProviderOperation.Builder builder, EitItem item, Long channelId) {
if (channelId != null) {
builder.withValue(TvContract.Programs.COLUMN_CHANNEL_ID, channelId);
}
if (item != null) {
builder.withValue(TvContract.Programs.COLUMN_TITLE, item.getTitleText())
.withValue(TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS,
item.getStartTimeUtcMillis())
.withValue(TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS,
item.getEndTimeUtcMillis())
.withValue(TvContract.Programs.COLUMN_CONTENT_RATING,
item.getContentRating())
.withValue(TvContract.Programs.COLUMN_AUDIO_LANGUAGE,
item.getAudioLanguage())
.withValue(TvContract.Programs.COLUMN_SHORT_DESCRIPTION,
item.getDescription())
.withValue(TvContract.Programs.COLUMN_VERSION_NUMBER,
item.getEventId());
}
return builder.build();
}
项目:android_packages_apps_tv
文件:ChannelDataManagerTest.java
@Override
protected void setUp() throws Exception {
super.setUp();
assertTrue("More than 2 channels to test", Constants.UNIT_TEST_CHANNEL_COUNT > 2);
mContentProvider = new FakeContentProvider(getContext());
mContentResolver = new FakeContentResolver();
mContentResolver.addProvider(TvContract.AUTHORITY, mContentProvider);
mListener = new TestChannelDataManagerListener();
Utils.runOnMainSync(new Runnable() {
@Override
public void run() {
TvInputManagerHelper mockHelper = Mockito.mock(TvInputManagerHelper.class);
Mockito.when(mockHelper.hasTvInputInfo(Matchers.anyString())).thenReturn(true);
mChannelDataManager = new ChannelDataManager(getContext(), mockHelper,
mContentResolver);
mChannelDataManager.addListener(mListener);
}
});
}
项目:android_packages_apps_tv
文件:ProgramDataManagerTest.java
@Override
protected void setUp() throws Exception {
super.setUp();
mClock = FakeClock.createWithCurrentTime();
mListener = new TestProgramDataManagerListener();
mContentProvider = new FakeContentProvider(getContext());
mContentResolver = new FakeContentResolver();
mContentResolver.addProvider(TvContract.AUTHORITY, mContentProvider);
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
mProgramDataManager = new ProgramDataManager(
mContentResolver, mClock, mHandlerThread.getLooper(), null);
mProgramDataManager.setPrefetchEnabled(true);
mProgramDataManager.addListener(mListener);
}
项目:android_packages_apps_tv
文件:ProgramDataManagerTest.java
/**
* Simulate program data appends at the end of the existing programs.
* This appends programs until the maximum program query range
* ({@link ProgramDataManager#PROGRAM_GUIDE_MAX_TIME_RANGE})
* where we started with the inserting half of it.
*/
public void simulateAppend(long channelId) {
long endTimeMs =
mClock.currentTimeMillis() + ProgramDataManager.PROGRAM_GUIDE_MAX_TIME_RANGE;
List<ProgramInfoWrapper> programList = mProgramInfoList.get((int) channelId);
if (mProgramInfoList == null) {
return;
}
ProgramInfo stub = ProgramInfo.create();
ProgramInfoWrapper last = programList.get(programList.size() - 1);
while (last.startTimeMs < endTimeMs) {
ProgramInfo nextProgramInfo = stub.build(getContext(), last.index + 1);
ProgramInfoWrapper next = new ProgramInfoWrapper(last.index + 1,
last.startTimeMs + last.programInfo.durationMs, nextProgramInfo);
programList.add(next);
last = next;
}
mContentResolver.notifyChange(TvContract.Programs.CONTENT_URI, null);
}
项目:android_packages_apps_tv
文件:ProgramDataManagerTest.java
@Override
public long getLong(int columnIndex) {
String columnName = getColumnName(columnIndex);
switch (columnName) {
case TvContract.Programs.COLUMN_CHANNEL_ID:
return mChannelId;
case TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS:
return mCurrentProgram.startTimeMs;
case TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS:
return mCurrentProgram.startTimeMs + mCurrentProgram.programInfo.durationMs;
}
if (DEBUG) {
Log.d(TAG, "Column (" + columnName + ") is ignored in getLong()");
}
return 0;
}
项目:android_packages_apps_tv
文件:ProgramDataManagerTest.java
@Override
public String getString(int columnIndex) {
String columnName = getColumnName(columnIndex);
switch (columnName) {
case TvContract.Programs.COLUMN_TITLE:
return mCurrentProgram.programInfo.title;
case TvContract.Programs.COLUMN_SHORT_DESCRIPTION:
return mCurrentProgram.programInfo.description;
case TvContract.Programs.COLUMN_EPISODE_TITLE:
return mCurrentProgram.programInfo.episode;
}
if (DEBUG) {
Log.d(TAG, "Column (" + columnName + ") is ignored in getString()");
}
return null;
}
项目:android_packages_apps_tv
文件:TestTvInputSetupActivity.java
public static void registerChannels(Context context, String inputId, boolean updateBrowsable,
int channelCount) {
Log.i(TAG, "Registering " + channelCount + " channels");
List<ChannelInfo> channels = new ArrayList<>();
for (int i = 1; i <= channelCount; i++) {
channels.add(ChannelInfo.create(context, i));
}
ChannelUtils.updateChannels(context, inputId, channels);
if (updateBrowsable) {
updateChannelsBrowsable(context.getContentResolver(), inputId);
}
// Reload channels so we have the ids.
Map<Long, ChannelInfo> channelIdToInfoMap =
ChannelUtils.queryChannelInfoMapForTvInput(context, inputId);
for (Long channelId : channelIdToInfoMap.keySet()) {
// TODO: http://b/21705569 Create better program info for tests
ProgramInfo programInfo = ProgramInfo.create();
ProgramUtils.populatePrograms(context, TvContract.buildChannelUri(channelId),
programInfo);
}
}
项目:android_packages_apps_tv
文件:ProgramInfo.java
public static ProgramInfo fromCursor(Cursor c) {
// TODO: Fill other fields.
Builder builder = new Builder();
int index = c.getColumnIndex(TvContract.Programs.COLUMN_TITLE);
if (index >= 0) {
builder.setTitle(c.getString(index));
}
index = c.getColumnIndex(TvContract.Programs.COLUMN_SHORT_DESCRIPTION);
if (index >= 0) {
builder.setDescription(c.getString(index));
}
index = c.getColumnIndex(TvContract.Programs.COLUMN_EPISODE_TITLE);
if (index >= 0) {
builder.setEpisode(c.getString(index));
}
return builder.build();
}
项目:android_packages_apps_tv
文件:ChannelUtils.java
/**
* Query and return the map of (channel_id, ChannelInfo).
* See: {@link ChannelInfo#fromCursor(Cursor)}.
*/
@WorkerThread
public static Map<Long, ChannelInfo> queryChannelInfoMapForTvInput(
Context context, String inputId) {
Uri uri = TvContract.buildChannelsUriForInput(inputId);
Map<Long, ChannelInfo> map = new HashMap<>();
String[] projections = new String[ChannelInfo.PROJECTION.length + 1];
projections[0] = Channels._ID;
System.arraycopy(ChannelInfo.PROJECTION, 0, projections, 1, ChannelInfo.PROJECTION.length);
try (Cursor cursor = context.getContentResolver()
.query(uri, projections, null, null, null)) {
if (cursor != null) {
while (cursor.moveToNext()) {
map.put(cursor.getLong(0), ChannelInfo.fromCursor(cursor));
}
}
return map;
}
}
项目:android_packages_apps_tv
文件:ChannelInfo.java
public static ChannelInfo fromCursor(Cursor c) {
// TODO: Fill other fields.
Builder builder = new Builder();
int index = c.getColumnIndex(TvContract.Channels.COLUMN_DISPLAY_NUMBER);
if (index >= 0) {
builder.setNumber(c.getString(index));
}
index = c.getColumnIndex(TvContract.Channels.COLUMN_DISPLAY_NAME);
if (index >= 0) {
builder.setName(c.getString(index));
}
index = c.getColumnIndex(TvContract.Channels.COLUMN_ORIGINAL_NETWORK_ID);
if (index >= 0) {
builder.setOriginalNetworkId(c.getInt(index));
}
return builder.build();
}
项目:ChannelSurfer
文件:TvContractUtils.java
public static List<Program> getPrograms(ContentResolver resolver, Uri channelUri) {
Uri uri = TvContract.buildProgramsUriForChannel(channelUri);
Cursor cursor = null;
List<Program> programs = new ArrayList<>();
try {
// TvProvider returns programs chronological order by default.
cursor = resolver.query(uri, null, null, null, null);
if (cursor == null || cursor.getCount() == 0) {
return programs;
}
while (cursor.moveToNext()) {
programs.add(Program.fromCursor(cursor));
}
} catch (Exception e) {
Log.w(TAG, "Unable to get programs for " + channelUri, e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return programs;
}
项目:ChannelSurfer
文件:TvContractUtils.java
public static long getLastProgramEndTimeMillis(ContentResolver resolver, Uri channelUri) {
Uri uri = TvContract.buildProgramsUriForChannel(channelUri);
String[] projection = {Programs.COLUMN_END_TIME_UTC_MILLIS};
Cursor cursor = null;
try {
// TvProvider returns programs chronological order by default.
cursor = resolver.query(uri, projection, null, null, null);
if (cursor == null || cursor.getCount() == 0) {
return 0;
}
cursor.moveToLast();
return cursor.getLong(0);
} catch (Exception e) {
Log.w(TAG, "Unable to get last program end time for " + channelUri, e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return 0;
}
项目:ChannelSurfer
文件:TvInputProvider.java
/**
* Finds already existing programs for a given channel
* @param mContext The context of this application
* @param channelUri The URI of the channel
* @return
*/
public List<Program> getPrograms(Context mContext, Uri channelUri) {
ContentResolver resolver = mContext.getContentResolver();
Uri uri = TvContract.buildProgramsUriForChannel(channelUri);
Cursor cursor = null;
List<Program> programs = new ArrayList<>();
try {
// TvProvider returns programs chronological order by default.
cursor = resolver.query(uri, null, null, null, null);
if (cursor == null || cursor.getCount() == 0) {
return programs;
}
while (cursor.moveToNext()) {
programs.add(Program.fromCursor(cursor));
}
} catch (Exception e) {
Log.w(TAG, "Unable to get programs for " + channelUri, e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return programs;
}
项目:ChannelSurfer
文件:TvInputProvider.java
/**
* If you don't have access to an EPG or don't want to supply programs, you can simply
* add several instances of this generic program object.
*
* Note you will have to set the start and end times manually.
* @param channel The channel for which the program will be displayed
* @return A very generic program object
*/
public Program getGenericProgram(Channel channel) {
TvContentRating rating = RATING_PG;
return new Program.Builder()
.setTitle(channel.getName() + " Live")
.setProgramId(channel.getServiceId())
// .setEpisodeNumber(1)
// .setSeasonNumber(1)
// .setEpisodeTitle("Streaming")
.setDescription("Currently streaming")
.setLongDescription(channel.getName() + " is currently streaming live.")
.setCanonicalGenres(new String[]{TvContract.Programs.Genres.ENTERTAINMENT})
.setThumbnailUri(channel.getLogoUrl())
.setPosterArtUri(channel.getLogoUrl())
.setInternalProviderData(channel.getName())
.setContentRatings(new TvContentRating[] {rating})
.setVideoHeight(1080)
.setVideoWidth(1920)
.build();
}
项目:danish-media-license
文件:DmlTvInputService.java
@Override
public boolean onTune(Uri channelUri) {
Log.d(TAG, "onTune " + channelUri);
notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING);
String[] projection = {TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA};
try (Cursor cursor = context.getContentResolver().query(
channelUri,
projection,
null, // selection
null, // selectionArgs
null // sortOrder
)) {
if (cursor == null || !cursor.moveToNext()) {
Log.e(TAG, "Channel not found: " + channelUri);
return false;
}
String url = cursor.getString(0);
play(url);
return true;
}
}
项目:iWediaSimpleTvInputService
文件:EpgRunnable.java
/**
* This method is used to check if the current event is already present in the DB
*
* @param program Program to check in DB
* @return True if the program is present in the DB, false otherwise
*/
protected boolean checkifExist(long channelID, long startTime, long endTime) {
Uri uri = TvContract.buildProgramsUriForChannel(channelID, startTime, endTime);
Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null);
if (cursor == null || cursor.getCount() == 0) {
cursor.close();
mLog.w("[checkifExist][item does not exist in DB][[uri: " + uri.toString() + "]");
return false;
} else {
cursor.close();
return true;
}
/**
* TODO Implement program update
*/
}
项目:iWediaSimpleTvInputService
文件:ChannelManager.java
private ArrayList<ChannelDescriptor> loadChannels(String inputId) {
ArrayList<ChannelDescriptor> ret = new ArrayList<ChannelDescriptor>();
final String[] projection = {
Channels._ID,
Channels.COLUMN_DISPLAY_NAME, Channels.COLUMN_DISPLAY_NUMBER,
Channels.COLUMN_SERVICE_ID, Channels.COLUMN_TYPE, Channels.COLUMN_SERVICE_TYPE
};
Cursor cursor = mContext.getContentResolver().query(
TvContract.buildChannelsUriForInput(mInputId), projection,
null, null, null);
if (cursor == null) {
return ret;
}
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ChannelDescriptor cd = new ChannelDescriptor(cursor);
mLog.d("[loadChannels] index=" + cd.getChannelId() + " info=" + cd);
ret.add(cd);
cursor.moveToNext();
}
cursor.close();
return ret;
}
项目:CumulusTV
文件:ActivityUtils.java
private static void actuallyWriteData(final Context context, GoogleApiClient gapi) {
DriveSettingsManager sm = new DriveSettingsManager(context);
sm.setGoogleDriveSyncable(gapi, new DriveSettingsManager.GoogleDriveListener() {
@Override
public void onActionFinished(boolean cloudToLocal) {
Log.d(TAG, "Action finished " + cloudToLocal);
}
});
try {
sm.writeToGoogleDrive(DriveId.decodeFromString(sm.getString(R.string.sm_google_drive_id)),
ChannelDatabase.getInstance(context).toString());
GoogleDriveBroadcastReceiver.changeStatus(context,
GoogleDriveBroadcastReceiver.EVENT_UPLOAD_COMPLETE);
final String info = TvContract.buildInputId(TV_INPUT_SERVICE);
CumulusJobService.requestImmediateSync1(context, info, CumulusJobService.DEFAULT_IMMEDIATE_EPG_DURATION_MILLIS,
new ComponentName(context, CumulusJobService.class));
Log.d(TAG, "Data actually written");
// Toast.makeText(context, "Channels uploaded", Toast.LENGTH_SHORT).show();
} catch(Exception e) {
// Probably invalid drive id. No worries, just let someone know
Log.e(TAG, e.getMessage() + "");
Toast.makeText(context, R.string.invalid_file,
Toast.LENGTH_SHORT).show();
}
}
项目:CumulusTV
文件:JsonChannel.java
public String[] getGenres() {
if(getGenresString() == null) {
return new String[]{TvContract.Programs.Genres.MOVIES};
}
if(getGenresString().isEmpty()) {
return new String[]{TvContract.Programs.Genres.MOVIES};
}
else {
//Parse genres
CommaArray ca = new CommaArray(getGenresString());
Iterator<String> it = ca.getIterator();
ArrayList<String> arrayList = new ArrayList<>();
while(it.hasNext()) {
String i = it.next();
arrayList.add(i);
}
return arrayList.toArray(new String[arrayList.size()]);
}
}
项目:CumulusTV
文件:TifDatabaseIntegrationTest.java
@Before
public void insertChannels() {
Context context = getActivity();
ContentValues contentValues = new ContentValues();
contentValues.put(TvContract.Channels.COLUMN_ORIGINAL_NETWORK_ID, 1);
contentValues.put(TvContract.Channels.COLUMN_DISPLAY_NAME, "Hello");
contentValues.put(TvContract.Channels.COLUMN_DISPLAY_NUMBER, "123");
contentValues.put(TvContract.Channels.COLUMN_INPUT_ID,
ActivityUtils.TV_INPUT_SERVICE.flattenToString());
contentValues.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, MEDIA_URL);
Uri databaseUri = context.getContentResolver().insert(TvContract.Channels.CONTENT_URI,
contentValues);
Log.d(TAG, "Inserted in Uri " + databaseUri);
// Make sure we actually inserted something
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(TvContract.Channels.CONTENT_URI,
null, null, null, null);
assertNotNull(cursor);
assertEquals(1, cursor.getCount());
assertTrue(cursor.moveToNext());
assertEquals(1, cursor.getLong(cursor.getColumnIndex(
TvContract.Channels.COLUMN_ORIGINAL_NETWORK_ID)));
cursor.close();
}
项目:androidtv-sample-inputs
文件:BaseTvInputService.java
@Override
public void onCreate() {
super.onCreate();
// Create background thread
mDbHandlerThread = new HandlerThread(getClass().getSimpleName());
mDbHandlerThread.start();
// Initialize the channel map and set observer for changes
mContentResolver = BaseTvInputService.this.getContentResolver();
updateChannelMap();
mChannelObserver = new ContentObserver(new Handler(mDbHandlerThread.getLooper())) {
@Override
public void onChange(boolean selfChange) {
updateChannelMap();
}
};
mContentResolver.registerContentObserver(TvContract.Channels.CONTENT_URI, true,
mChannelObserver);
// Setup our BroadcastReceiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(TvInputManager.ACTION_BLOCKED_RATINGS_CHANGED);
intentFilter.addAction(TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED);
registerReceiver(mParentalControlsBroadcastReceiver, intentFilter);
}
项目:androidtv-sample-inputs
文件:PeriodicEpgSyncJobServiceTest.java
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
getActivity();
// Delete all channels
getActivity().getContentResolver().delete(TvContract.buildChannelsUriForInput(mInputId),
null, null);
mSampleJobService = new TestJobService();
mSampleJobService.mContext = getActivity();
mChannelList = mSampleJobService.getChannels();
TvContractUtils.updateChannels(getActivity(), mInputId, mChannelList);
mChannelMap = TvContractUtils.buildChannelMap(getActivity().getContentResolver(), mInputId);
assertEquals(2, mChannelMap.size());
}
项目:androidtv-sample-inputs
文件:EpgSyncJobServiceTest.java
@Test
public void testChannelsProgramSync() {
// Tests that programs and channels were correctly obtained from the EpgSyncJobService
Uri channelUri = TvContract.buildChannelUri(mChannelMap.keyAt(0));
Channel firstChannel = mChannelList.get(0);
assertEquals("Test Channel", firstChannel.getDisplayName());
assertNotNull(firstChannel.getInternalProviderData());
assertTrue(firstChannel.getInternalProviderData().isRepeatable());
mProgramList = mSampleJobService.getProgramsForChannel(channelUri, firstChannel, mStartMs,
mEndMs);
assertEquals(1, mProgramList.size());
channelUri = TvContract.buildChannelUri(mChannelMap.keyAt(1));
Channel secondChannel = mChannelList.get(1);
assertEquals("XML Test Channel", secondChannel.getDisplayName());
assertNotNull(secondChannel.getInternalProviderData());
assertTrue(secondChannel.getInternalProviderData().isRepeatable());
mProgramList = mSampleJobService.getProgramsForChannel(channelUri, secondChannel, mStartMs,
mEndMs);
assertEquals(5, mProgramList.size());
}
项目:androidtv-sample-inputs
文件:EpgSyncJobServiceTest.java
@Test
public void testRequestSync() throws InterruptedException {
// Tests that a sync can be requested and complete
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
mSyncStatusChangedReceiver,
new IntentFilter(EpgSyncJobService.ACTION_SYNC_STATUS_CHANGED));
mSyncStatusLatch = new CountDownLatch(2);
EpgSyncJobService.cancelAllSyncRequests(getActivity());
EpgSyncJobService.requestImmediateSync(getActivity(), TestTvInputService.INPUT_ID,
1000 * 60 * 60, // 1 hour sync period
new ComponentName(getActivity(), TestJobService.class));
mSyncStatusLatch.await();
// Sync is completed
List<Channel> channelList = TvContractUtils.getChannels(getActivity().getContentResolver());
Log.d("TvContractUtils", channelList.toString());
assertEquals(2, channelList.size());
List<Program> programList = TvContractUtils.getPrograms(getActivity().getContentResolver(),
TvContract.buildChannelUri(channelList.get(0).getId()));
assertEquals(5, programList.size());
}