diff options
Diffstat (limited to 'src/com/android/tv/dvr/ui/browse/DetailsContent.java')
-rw-r--r-- | src/com/android/tv/dvr/ui/browse/DetailsContent.java | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/src/com/android/tv/dvr/ui/browse/DetailsContent.java b/src/com/android/tv/dvr/ui/browse/DetailsContent.java new file mode 100644 index 00000000..c1fa05d7 --- /dev/null +++ b/src/com/android/tv/dvr/ui/browse/DetailsContent.java @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2016 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.dvr.ui.browse; + +import android.content.Context; +import android.media.tv.TvContract; +import android.support.annotation.Nullable; +import android.text.TextUtils; + +import com.android.tv.R; +import com.android.tv.TvApplication; +import com.android.tv.data.Channel; +import com.android.tv.dvr.data.RecordedProgram; +import com.android.tv.dvr.data.ScheduledRecording; +import com.android.tv.dvr.data.SeriesRecording; +import com.android.tv.dvr.ui.DvrUiHelper; + +/** + * A class for details content. + */ +class DetailsContent { + /** Constant for invalid time. */ + public static final long INVALID_TIME = -1; + + private CharSequence mTitle; + private long mStartTimeUtcMillis; + private long mEndTimeUtcMillis; + private String mDescription; + private String mLogoImageUri; + private String mBackgroundImageUri; + private boolean mUsingChannelLogo; + + static DetailsContent createFromRecordedProgram(Context context, + RecordedProgram recordedProgram) { + return new DetailsContent.Builder() + .setChannelId(recordedProgram.getChannelId()) + .setProgramTitle(recordedProgram.getTitle()) + .setSeasonNumber(recordedProgram.getSeasonNumber()) + .setEpisodeNumber(recordedProgram.getEpisodeNumber()) + .setStartTimeUtcMillis(recordedProgram.getStartTimeUtcMillis()) + .setEndTimeUtcMillis(recordedProgram.getEndTimeUtcMillis()) + .setDescription(TextUtils.isEmpty(recordedProgram.getLongDescription()) + ? recordedProgram.getDescription() : recordedProgram.getLongDescription()) + .setPosterArtUri(recordedProgram.getPosterArtUri()) + .setThumbnailUri(recordedProgram.getThumbnailUri()) + .build(context); + } + + static DetailsContent createFromSeriesRecording(Context context, + SeriesRecording seriesRecording) { + return new DetailsContent.Builder() + .setChannelId(seriesRecording.getChannelId()) + .setTitle(seriesRecording.getTitle()) + .setDescription(TextUtils.isEmpty(seriesRecording.getLongDescription()) + ? seriesRecording.getDescription() : seriesRecording.getLongDescription()) + .setPosterArtUri(seriesRecording.getPosterUri()) + .setThumbnailUri(seriesRecording.getPhotoUri()) + .build(context); + } + + static DetailsContent createFromScheduledRecording(Context context, + ScheduledRecording scheduledRecording) { + Channel channel = TvApplication.getSingletons(context).getChannelDataManager() + .getChannel(scheduledRecording.getChannelId()); + String description = !TextUtils.isEmpty(scheduledRecording.getProgramDescription()) ? + scheduledRecording.getProgramDescription() + : scheduledRecording.getProgramLongDescription(); + if (TextUtils.isEmpty(description)) { + description = channel != null ? channel.getDescription() : null; + } + return new DetailsContent.Builder() + .setChannelId(scheduledRecording.getChannelId()) + .setProgramTitle(scheduledRecording.getProgramTitle()) + .setSeasonNumber(scheduledRecording.getSeasonNumber()) + .setEpisodeNumber(scheduledRecording.getEpisodeNumber()) + .setStartTimeUtcMillis(scheduledRecording.getStartTimeMs()) + .setEndTimeUtcMillis(scheduledRecording.getEndTimeMs()) + .setDescription(description) + .setPosterArtUri(scheduledRecording.getProgramPosterArtUri()) + .setThumbnailUri(scheduledRecording.getProgramThumbnailUri()) + .build(context); + } + + private DetailsContent() { } + + /** + * Returns title. + */ + public CharSequence getTitle() { + return mTitle; + } + + /** + * Returns start time. + */ + public long getStartTimeUtcMillis() { + return mStartTimeUtcMillis; + } + + /** + * Returns end time. + */ + public long getEndTimeUtcMillis() { + return mEndTimeUtcMillis; + } + + /** + * Returns description. + */ + public String getDescription() { + return mDescription; + } + + /** + * Returns Logo image URI as a String. + */ + public String getLogoImageUri() { + return mLogoImageUri; + } + + /** + * Returns background image URI as a String. + */ + public String getBackgroundImageUri() { + return mBackgroundImageUri; + } + + /** + * Returns if image URIs are from its channels' logo. + */ + public boolean isUsingChannelLogo() { + return mUsingChannelLogo; + } + + /** + * Copies other details content. + */ + public void copyFrom(DetailsContent other) { + if (this == other) { + return; + } + mTitle = other.mTitle; + mStartTimeUtcMillis = other.mStartTimeUtcMillis; + mEndTimeUtcMillis = other.mEndTimeUtcMillis; + mDescription = other.mDescription; + mLogoImageUri = other.mLogoImageUri; + mBackgroundImageUri = other.mBackgroundImageUri; + mUsingChannelLogo = other.mUsingChannelLogo; + } + + /** + * A class for building details content. + */ + public static final class Builder { + private final DetailsContent mDetailsContent; + + private long mChannelId; + private String mProgramTitle; + private String mSeasonNumber; + private String mEpisodeNumber; + private String mPosterArtUri; + private String mThumbnailUri; + + public Builder() { + mDetailsContent = new DetailsContent(); + mDetailsContent.mStartTimeUtcMillis = INVALID_TIME; + mDetailsContent.mEndTimeUtcMillis = INVALID_TIME; + } + + /** + * Sets title. + */ + public Builder setTitle(CharSequence title) { + mDetailsContent.mTitle = title; + return this; + } + + /** + * Sets start time. + */ + public Builder setStartTimeUtcMillis(long startTimeUtcMillis) { + mDetailsContent.mStartTimeUtcMillis = startTimeUtcMillis; + return this; + } + + /** + * Sets end time. + */ + public Builder setEndTimeUtcMillis(long endTimeUtcMillis) { + mDetailsContent.mEndTimeUtcMillis = endTimeUtcMillis; + return this; + } + + /** + * Sets description. + */ + public Builder setDescription(String description) { + mDetailsContent.mDescription = description; + return this; + } + + /** + * Sets logo image URI as a String. + */ + public Builder setLogoImageUri(String logoImageUri) { + mDetailsContent.mLogoImageUri = logoImageUri; + return this; + } + + /** + * Sets background image URI as a String. + */ + public Builder setBackgroundImageUri(String backgroundImageUri) { + mDetailsContent.mBackgroundImageUri = backgroundImageUri; + return this; + } + + private Builder setProgramTitle(String programTitle) { + mProgramTitle = programTitle; + return this; + } + + private Builder setSeasonNumber(String seasonNumber) { + mSeasonNumber = seasonNumber; + return this; + } + + private Builder setEpisodeNumber(String episodeNumber) { + mEpisodeNumber = episodeNumber; + return this; + } + + private Builder setChannelId(long channelId) { + mChannelId = channelId; + return this; + } + + private Builder setPosterArtUri(String posterArtUri) { + mPosterArtUri = posterArtUri; + return this; + } + + private Builder setThumbnailUri(String thumbnailUri) { + mThumbnailUri = thumbnailUri; + return this; + } + + private void createStyledTitle(Context context, Channel channel) { + CharSequence title = DvrUiHelper.getStyledTitleWithEpisodeNumber(context, + mProgramTitle, mSeasonNumber, mEpisodeNumber, + R.style.text_appearance_card_view_episode_number); + if (TextUtils.isEmpty(title)) { + mDetailsContent.mTitle = channel != null ? channel.getDisplayName() + : context.getResources().getString(R.string.no_program_information); + } else { + mDetailsContent.mTitle = title; + } + } + + private void createImageUris(@Nullable Channel channel) { + mDetailsContent.mLogoImageUri = null; + mDetailsContent.mBackgroundImageUri = null; + mDetailsContent.mUsingChannelLogo = false; + if (!TextUtils.isEmpty(mPosterArtUri) && !TextUtils.isEmpty(mThumbnailUri)) { + mDetailsContent.mLogoImageUri = mPosterArtUri; + mDetailsContent.mBackgroundImageUri = mThumbnailUri; + } else if (!TextUtils.isEmpty(mPosterArtUri)) { + // thumbnailUri is empty + mDetailsContent.mLogoImageUri = mPosterArtUri; + mDetailsContent.mBackgroundImageUri = mPosterArtUri; + } else if (!TextUtils.isEmpty(mThumbnailUri)) { + // posterArtUri is empty + mDetailsContent.mLogoImageUri = mThumbnailUri; + mDetailsContent.mBackgroundImageUri = mThumbnailUri; + } + if (TextUtils.isEmpty(mDetailsContent.mLogoImageUri) && channel != null) { + String channelLogoUri = TvContract.buildChannelLogoUri(channel.getId()) + .toString(); + mDetailsContent.mLogoImageUri = channelLogoUri; + mDetailsContent.mBackgroundImageUri = channelLogoUri; + mDetailsContent.mUsingChannelLogo = true; + } + } + + /** + * Builds details content. + */ + public DetailsContent build(Context context) { + Channel channel = TvApplication.getSingletons(context).getChannelDataManager() + .getChannel(mChannelId); + if (mDetailsContent.mTitle == null) { + createStyledTitle(context, channel); + } + if (mDetailsContent.mBackgroundImageUri == null + && mDetailsContent.mLogoImageUri == null) { + createImageUris(channel); + } + DetailsContent detailsContent = new DetailsContent(); + detailsContent.copyFrom(mDetailsContent); + return detailsContent; + } + } +}
\ No newline at end of file |