package tv.emby.embyatv.util;
import android.app.Activity;
import android.graphics.Color;
import android.text.TextUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import mediabrowser.model.dlna.StreamInfo;
import mediabrowser.model.dto.BaseItemDto;
import mediabrowser.model.entities.MediaStream;
import mediabrowser.model.entities.SeriesStatus;
import tv.emby.embyatv.R;
import tv.emby.embyatv.TvApp;
import tv.emby.embyatv.itemhandling.BaseRowItem;
/**
* Created by Eric on 4/29/2015.
*/
public class InfoLayoutHelper {
private static int textSize = 16;
public static void addInfoRow(Activity activity, BaseRowItem item, LinearLayout layout, boolean includeRuntime, boolean includeEndtime) {
switch (item.getItemType()) {
case BaseItem:
addInfoRow(activity, item.getBaseItem(), layout, includeRuntime, includeEndtime);
break;
default:
addSubText(activity, item, layout);
break;
}
}
public static void addInfoRow(Activity activity, BaseItemDto item, LinearLayout layout, boolean includeRuntime, boolean includeEndTime) {
addInfoRow(activity, item, layout, includeRuntime, includeEndTime, Utils.GetFirstAudioStream(item));
}
public static void addInfoRow(Activity activity, BaseItemDto item, LinearLayout layout, boolean includeRuntime, boolean includeEndTime, MediaStream audioStream) {
layout.removeAllViews();
addCriticInfo(activity, item, layout);
switch (item.getType()) {
case "Episode":
addSeasonEpisode(activity, item, layout);
addDate(activity, item, layout);
break;
case "BoxSet":
addBoxSetCounts(activity, item, layout);
break;
case "Series":
addSeasonCount(activity, item, layout);
addSeriesAirs(activity, item, layout);
addDate(activity, item, layout);
includeEndTime = false;
break;
case "Program":
addProgramInfo(activity, item, layout);
break;
case "RecordingGroup":
addRecordingCount(activity, item, layout);
break;
case "MusicArtist":
Integer artistAlbums = item.getAlbumCount() != null ? item.getAlbumCount() : item.getChildCount();
addCount(activity, artistAlbums, layout, artistAlbums == 1 ? activity.getResources().getString(R.string.lbl_album) : activity.getResources().getString(R.string.lbl_albums));
return;
case "MusicAlbum":
String artist = item.getAlbumArtist() != null ? item.getAlbumArtist() : item.getArtists() != null && item.getAlbumArtists().size() > 0 ? item.getArtists().get(0) : null;
if (artist != null) {
addText(activity, artist+" ", layout, 500);
}
addDate(activity, item, layout);
Integer songCount = item.getSongCount() != null ? item.getSongCount() : item.getChildCount();
addCount(activity, songCount, layout, songCount == 1 ? activity.getResources().getString(R.string.lbl_song) : activity.getResources().getString(R.string.lbl_songs));
return;
case "Playlist":
if (item.getChildCount() != null) addCount(activity, item.getChildCount(), layout, item.getChildCount() == 1 ? activity.getResources().getString(R.string.lbl_item) : activity.getResources().getString(R.string.lbl_items));
if (item.getCumulativeRunTimeTicks() != null) addText(activity, " ("+Utils.formatMillis(item.getCumulativeRunTimeTicks() / 10000)+")", layout, 300);
break;
default:
addDate(activity, item, layout);
}
if (includeRuntime) addRuntime(activity, item, layout, includeEndTime);
addSeriesStatus(activity, item, layout);
addRatingAndRes(activity, item, layout);
addMediaDetails(activity, audioStream, layout);
}
private static void addText(Activity activity, String text, LinearLayout layout, int maxWidth) {
TextView textView = new TextView(activity);
textView.setTextSize(textSize);
textView.setMaxWidth(maxWidth);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setText(text + " ");
layout.addView(textView);
}
private static void addBoxSetCounts(Activity activity, BaseItemDto item, LinearLayout layout) {
boolean hasSpecificCounts = false;
if (item.getMovieCount() != null && item.getMovieCount() > 0) {
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getMovieCount().toString()+" "+activity.getResources().getString(R.string.lbl_movies)+" ");
layout.addView(amt);
hasSpecificCounts = true;
}
if (item.getSeriesCount() != null && item.getSeriesCount() > 0) {
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getSeriesCount().toString()+" "+activity.getResources().getString(R.string.lbl_tv_series)+" ");
layout.addView(amt);
hasSpecificCounts = true;
}
if (!hasSpecificCounts && item.getChildCount() != null && item.getChildCount() > 0) {
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getChildCount().toString()+" "+ activity.getResources().getString(item.getChildCount() > 1 ? R.string.lbl_items : R.string.lbl_item) +" ");
layout.addView(amt);
}
}
private static void addCount(Activity activity, Integer count, LinearLayout layout, String label) {
if (count != null && count > 0) {
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(count.toString()+" "+ label +" ");
layout.addView(amt);
}
}
private static void addSeasonCount(Activity activity, BaseItemDto item, LinearLayout layout) {
if (item.getChildCount() != null && item.getChildCount() > 0) {
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getChildCount().toString()+" "+ (item.getChildCount() == 1 ? activity.getResources().getString(R.string.lbl_season) : activity.getResources().getString(R.string.lbl_seasons)) +" ");
layout.addView(amt);
}
}
private static void addRecordingCount(Activity activity, BaseItemDto item, LinearLayout layout) {
if (item.getRecordingCount() != null && item.getRecordingCount() > 0) {
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getRecordingCount().toString() + " " + activity.getResources().getString(item.getRecordingCount() > 1 ? R.string.lbl_recordings : R.string.lbl_recording) + " ");
layout.addView(amt);
}
}
private static void addSeriesAirs(Activity activity, BaseItemDto item, LinearLayout layout) {
if (item.getAirDays() != null && item.getAirDays().size() > 0) {
TextView textView = new TextView(activity);
textView.setTextSize(textSize);
textView.setText(item.getAirDays().get(0) + " " + Utils.NullCoalesce(item.getAirTime(), "") + " ");
layout.addView(textView);
}
}
private static void addProgramInfo(Activity activity, BaseItemDto item, LinearLayout layout) {
TextView name = new TextView(activity);
name.setTextSize(textSize);
name.setText(Utils.GetProgramSubText(item)+" ");
layout.addView(name);
}
private static void addSubText(Activity activity, BaseRowItem item, LinearLayout layout) {
layout.removeAllViews();
TextView text = new TextView(activity);
text.setTextSize(textSize);
text.setText(item.getSubText() + " ");
layout.addView(text);
}
private static void addRuntime(Activity activity, BaseItemDto item, LinearLayout layout, boolean includeEndtime) {
Long runtime = Utils.NullCoalesce(item.getRunTimeTicks(), item.getOriginalRunTimeTicks());
if (runtime != null && runtime > 0) {
long endTime = includeEndtime ? System.currentTimeMillis() + runtime / 10000 - (item.getUserData() != null && item.getCanResume() ? item.getUserData().getPlaybackPositionTicks()/10000 : 0) : 0;
String text = runtime / 600000000 + activity.getString(R.string.lbl_min) + (endTime > 0 ? " (" + activity.getResources().getString(R.string.lbl_ends) + " " + android.text.format.DateFormat.getTimeFormat(activity).format(new Date(endTime)) + ") " : " ");
TextView time = new TextView(activity);
time.setTextSize(textSize);
time.setText(text);
layout.addView(time);
}
}
private static void addSeasonEpisode(Activity activity, BaseItemDto item, LinearLayout layout) {
String text = "S"+item.getParentIndexNumber()+" E"+item.getIndexNumber() + (item.getIndexNumberEnd() != null ? "-" + item.getIndexNumberEnd() : "")+" ";
TextView time = new TextView(activity);
time.setTextSize(textSize);
time.setText(text);
layout.addView(time);
}
private static void addCriticInfo(Activity activity, BaseItemDto item, LinearLayout layout) {
int imagesize = Utils.convertDpToPixel(activity,textSize+2);
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imagesize,imagesize);
imageParams.setMargins(0, 5, 10, 0);
boolean hasSomething = false;
if (item.getCommunityRating() != null) {
ImageView star = new ImageView(activity);
star.setImageResource(R.drawable.star);
star.setLayoutParams(imageParams);
layout.addView(star);
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getCommunityRating().toString()+" ");
layout.addView(amt);
hasSomething = true;
}
if (item.getCriticRating() != null) {
ImageView tomato = new ImageView(activity);
tomato.setLayoutParams(imageParams);
if (item.getCriticRating() > 59) {
tomato.setImageResource(R.drawable.fresh);
} else {
tomato.setImageResource(R.drawable.rotten);
}
layout.addView(tomato);
TextView amt = new TextView(activity);
amt.setTextSize(textSize);
amt.setText(item.getCriticRating().toString() + "% ");
layout.addView(amt);
hasSomething = true;
}
if (hasSomething) addSpacer(activity, layout, " ");
}
private static void addDate(Activity activity, BaseItemDto item, LinearLayout layout) {
TextView date = new TextView(activity);
date.setTextSize(textSize);
switch (item.getType()) {
case "Person":
StringBuilder sb = new StringBuilder();
if (item.getPremiereDate() != null) {
sb.append(TvApp.getApplication().getString(R.string.lbl_born));
sb.append(new SimpleDateFormat("d MMM y").format(Utils.convertToLocalDate(item.getPremiereDate())));
}
if (item.getEndDate() != null) {
sb.append(" | Died ");
sb.append(new SimpleDateFormat("d MMM y").format(item.getEndDate()));
sb.append(" (");
sb.append(Utils.numYears(item.getPremiereDate(), item.getEndDate()));
sb.append(")");
} else {
if (item.getPremiereDate() != null) {
sb.append(" (");
sb.append(Utils.numYears(item.getPremiereDate(), Calendar.getInstance()));
sb.append(")");
}
}
date.setText(sb.toString());
layout.addView(date);
break;
case "Program":
case "TvChannel":
if (item.getStartDate() != null && item.getEndDate() != null) {
date.setText(android.text.format.DateFormat.getTimeFormat(TvApp.getApplication()).format(Utils.convertToLocalDate(item.getStartDate()))
+ "-"+ android.text.format.DateFormat.getTimeFormat(TvApp.getApplication()).format(Utils.convertToLocalDate(item.getEndDate())));
layout.addView(date);
addSpacer(activity, layout, " ");
}
break;
case "Series":
if (item.getProductionYear() != null && item.getProductionYear() > 0) {
date.setText(item.getProductionYear().toString());
layout.addView(date);
addSpacer(activity, layout, " ");
}
break;
default:
if (item.getPremiereDate() != null) {
date.setText(new SimpleDateFormat("d MMM y").format(Utils.convertToLocalDate(item.getPremiereDate())));
layout.addView(date);
addSpacer(activity, layout, " ");
} else if (item.getProductionYear() != null && item.getProductionYear() > 0) {
date.setText(item.getProductionYear().toString());
layout.addView(date);
addSpacer(activity, layout, " ");
}
break;
}
}
private static void addRatingAndRes(Activity activity, BaseItemDto item, LinearLayout layout) {
if (item.getOfficialRating() != null && !item.getOfficialRating().equals("0")) {
addBlockText(activity, layout, item.getOfficialRating());
addSpacer(activity, layout, " ");
}
if (item.getMediaStreams() != null && item.getMediaStreams().size() > 0 && item.getMediaStreams().get(0).getWidth() != null) {
int width = item.getMediaStreams().get(0).getWidth();
if (width > 2000) {
addBlockText(activity, layout, "4K");
}else if (width > 1910) {
addBlockText(activity, layout, "1080");
} else if (width > 1270) {
addBlockText(activity, layout, "720");
} else addBlockText(activity, layout, activity.getString(R.string.lbl_sd));
addSpacer(activity, layout, " ");
}
}
private static void addSeriesStatus(Activity activity, BaseItemDto item, LinearLayout layout) {
if ("Series".equals(item.getType()) && item.getSeriesStatus() != null) {
boolean continuing = item.getSeriesStatus() == SeriesStatus.Continuing;
String status = continuing ? activity.getString(R.string.lbl__continuing) : activity.getString(R.string.lbl_ended);
addBlockText(activity, layout, status, textSize-4, Color.LTGRAY, continuing ? R.drawable.green_gradient : R.drawable.red_gradient);
addSpacer(activity, layout, " ");
}
}
private static void addMediaDetails(Activity activity, MediaStream stream, LinearLayout layout) {
if (stream != null) {
if (stream.getCodec() != null && stream.getCodec().trim().length() > 0) {
String codec = stream.getCodec().equals("dca") || stream.getCodec().equals("DCA") ? "DTS" : stream.getCodec().equals("ac3") || stream.getCodec().equals("AC3") ? "Dolby" : stream.getCodec().toUpperCase();
addBlockText(activity, layout, codec);
addSpacer(activity, layout, " ");
}
if (stream.getChannelLayout() != null && stream.getChannelLayout().trim().length() > 0) {
addBlockText(activity, layout, stream.getChannelLayout().toUpperCase());
addSpacer(activity, layout, " ");
}
}
}
public static void addBlockText(Activity activity, LinearLayout layout, String text) {
addBlockText(activity, layout, text, textSize-4);
}
public static void addBlockText(Activity activity, LinearLayout layout, String text, int size) {
addBlockText(activity, layout, text, size, Color.DKGRAY, R.drawable.gray_gradient);
}
public static void addBlockText(Activity activity, LinearLayout layout, String text, int size, int textColor, int backgroundRes) {
TextView view = new TextView(activity);
view.setTextSize(size);
view.setTextColor(textColor);
view.setText(" " + text + " ");
view.setBackgroundResource(backgroundRes);
layout.addView(view);
}
private static void addSpacer(Activity activity, LinearLayout layout, String sp) {
addSpacer(activity, layout, sp, textSize);
}
public static void addSpacer(Activity activity, LinearLayout layout, String sp, int size) {
TextView mSpacer = new TextView(activity);
mSpacer.setTextSize(size);
mSpacer.setText(sp);
layout.addView(mSpacer);
}
public static void addResourceImage(Activity activity, LinearLayout layout, int imgResource, int width, int height) {
ImageView image = new ImageView(activity);
image.setImageResource(imgResource);
if (width > 0) image.setMaxWidth(width);
if (height > 0) image.setMaxHeight(height);
image.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
layout.addView(image);
}
}