blob: cba6293b09848e6952bf9676816867b15bd1934f [file] [log] [blame]
/*
* 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.TvSingletons;
import com.android.tv.data.api.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 =
TvSingletons.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);
}
static DetailsContent createFromFailedScheduledRecording(
Context context, ScheduledRecording scheduledRecording, String errMsg) {
Channel channel =
TvSingletons.getSingletons(context)
.getChannelDataManager()
.getChannel(scheduledRecording.getChannelId());
String description;
if (scheduledRecording.getState() == ScheduledRecording.STATE_RECORDING_FAILED
&& errMsg != null) {
description = errMsg
+ " (Error code: " + scheduledRecording.getFailedReason() + ")";
} else {
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 =
TvSingletons.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;
}
}
}